
# 跨集群访问Hive Metastore
大数据融合分析时代，存算分离数仓如需远端访问MRS的Hive数据源（包括Hive对接HDFS和Hive对接OBS两种场景），可通过建立EXTERNAL SCHEMA实现。该功能仅9.1.0及以上版本支持。
#### 准备环境
- 已创建存算分离集群和MRS分析集群，需确保MRS和DWS集群在同一个区域、可用区、同一VPC子网内，确保集群网络互通。
 
#### 约束与限制
- 目前仅支持对接EXTERNAL SCHEMA对应的Hive端数据库的表进行SELECT、INSERT和INSERT OVERWRITE操作，其余操作均不支持。
- MRS端两种数据源对应格式支持的操作参见[表1]。
   表1MRS端数据源支持的操作 
  | 数据源  | 表类型  | 操作                      | TEXT | CSV | PARQUET | ORC |
  |:---|:---|:---|:---|:---|:---|:---|
  | HDFS | 非分区表 | SELECT                  | √    | √   | √       | √   |
  | HDFS | 非分区表 | INSERT/INSERT OVERWRITE | x    | x   | √       | √   |
  | HDFS | 分区表  | SELECT                  | √    | √   | √       | √   |
  | HDFS | 分区表  | INSERT/INSERT OVERWRITE | x    | x   | √       | √   |
  | OBS  | 非分区表 | SELECT                  | √    | √   | √       | √   |
  | OBS  | 非分区表 | INSERT/INSERT OVERWRITE | x    | x   | √       | √   |
  | OBS  | 分区表  | SELECT                  | x    | x   | √       | √   |
  | OBS  | 分区表  | INSERT/INSERT OVERWRITE | x    | x   | √       | √   |
     
  

- 不再保证事务原子性，事务失败后，不再保证数据一致性；不支持回滚。
- 不支持通过EXTERNAL SCHEMA对hive端创建的表进行GRANT和REVOKE操作。
- 并发支持：DWS、HIVE、SPARK并发读写，会出现脏读问题；对同一张非分区表或者同一张分区表的同一个分区执行包含INSERT OVERWRITE相关的并发操作无法保证预期结果，请不要执行此类操作。
- Hive Metastore特性不支持联邦机制。
 
#### 基本流程
1. 在Hive端创建表。
2. 在Hive端插入数据或者通过将本地txt数据文件上传至OBS桶，再通过OBS桶导入Hive，并由txt存储表导入ORC存储表。
3. 创建MRS数据源连接。
4. 创建外部服务器。
5. 创建EXTERNAL SCHEMA。
6. 通过EXTERNAL SCHEMA对Hive表进行导入或者读取操作。
 
#### 准备MRS的ORC表数据源
1. 本地PC新建一个product_info.txt，并拷贝以下数据，保存到本地。 
   ```
   100,XHDK-A-1293-#fJ3,2017-09-01,A,2017 Autumn New Shirt Women,red,M,328,2017-09-04,715,good
   205,KDKE-B-9947-#kL5,2017-09-01,A,2017 Autumn New Knitwear Women,pink,L,584,2017-09-05,406,very good!
   300,JODL-X-1937-#pV7,2017-09-01,A,2017 autumn new T-shirt men,red,XL,1245,2017-09-03,502,Bad.
   310,QQPX-R-3956-#aD8,2017-09-02,B,2017 autumn new jacket women,red,L,411,2017-09-05,436,It's really super nice
   150,ABEF-C-1820-#mC6,2017-09-03,B,2017 Autumn New Jeans Women,blue,M,1223,2017-09-06,1200,The seller's packaging is exquisite
   200,BCQP-E-2365-#qE4,2017-09-04,B,2017 autumn new casual pants men,black,L,997,2017-09-10,301,The clothes are of good quality.
   250,EABE-D-1476-#oB1,2017-09-10,A,2017 autumn new dress women,black,S,841,2017-09-15,299,Follow the store for a long time.
   108,CDXK-F-1527-#pL2,2017-09-11,A,2017 autumn new dress women,red,M,85,2017-09-14,22,It's really amazing to buy
   450,MMCE-H-4728-#nP9,2017-09-11,A,2017 autumn new jacket women,white,M,114,2017-09-14,22,Open the package and the clothes have no odor
   260,OCDA-G-2817-#bD3,2017-09-12,B,2017 autumn new woolen coat women,red,L,2004,2017-09-15,826,Very favorite clothes
   980,ZKDS-J-5490-#cW4,2017-09-13,B,2017 Autumn New Women's Cotton Clothing,red,M,112,2017-09-16,219,The clothes are small
   98,FKQB-I-2564-#dA5,2017-09-15,B,2017 autumn new shoes men,green,M,4345,2017-09-18,5473,The clothes are thick and it's better this winter.
   150,DMQY-K-6579-#eS6,2017-09-21,A,2017 autumn new underwear men,yellow,37,2840,2017-09-25,5831,This price is very cost effective
   200,GKLW-l-2897-#wQ7,2017-09-22,A,2017 Autumn New Jeans Men,blue,39,5879,2017-09-25,7200,The clothes are very comfortable to wear
   300,HWEC-L-2531-#xP8,2017-09-23,A,2017 autumn new shoes women,brown,M,403,2017-09-26,607,good
   100,IQPD-M-3214-#yQ1,2017-09-24,B,2017 Autumn New Wide Leg Pants Women,black,M,3045,2017-09-27,5021,very good.
   350,LPEC-N-4572-#zX2,2017-09-25,B,2017 Autumn New Underwear Women,red,M,239,2017-09-28,407,The seller's service is very good
   110,NQAB-O-3768-#sM3,2017-09-26,B,2017 autumn new underwear women,red,S,6089,2017-09-29,7021,The color is very good 
   210,HWNB-P-7879-#tN4,2017-09-27,B,2017 autumn new underwear women,red,L,3201,2017-09-30,4059,I like it very much and the quality is good.
   230,JKHU-Q-8865-#uO5,2017-09-29,C,2017 Autumn New Clothes with Chiffon Shirt,black,M,2056,2017-10-02,3842,very good
   ```
   
   
2. [登录OBS控制台](https://console.huaweicloud.com/obs)，单击"创建并行文件系统"，填写以下参数，单击"立即创建"，等待并行文件系统创建好。
   
   表2桶参数 
   | 参数项      | 取值             |
   |:---|:---|
   | 区域       | 根据实际环境选择区域。    |
   | 数据冗余存储策略 | 单AZ存储          |
   | 桶名称      | mrs-datasource |
   | 默认存储类别   | 标准存储           |
   | 桶策略      | 私有             |
   | 默认加密     | 关闭             |
   | 归档数据直读   | 关闭             |
   | 企业项目     | default        |
   | 标签       | -              |
      
   
   
3. 切换回MRS控制台，单击创建好的MRS集群名称，进入"概览"，单击"IAM用户同步"所在行的"同步"，等待约5分钟同步完成。
4. 单击"节点管理"，单击任意一台master节点，进入该节点页面，切换到"弹性公网IP"，单击"绑定弹性公网IP"，勾选已有弹性IP并单击"确定"，如果没有，请创建。记录此公网IP。
5. （可选）Hive对接OBS。 
   ![](https://support.huaweicloud.com/migration-dws/public_sys-resources/note_3.0-zh-cn.png)
   Hive对接OBS场景下执行该步骤，对接HDFS场景请跳过。
   1. 回到MRS集群页面，单击集群名称进入"概览"，单击"前往Manager"，如果提示绑定公网IP，请先绑定公网IP。
   
   2. 如果弹出访问MRS Manager对话框，单击"确定"，页面会跳转到MRS登录页面。输入MRS Manager的用户名admin和密码，密码为创建MRS集群时输入的admin密码。
   
   3. 参见[Hive对接OBS文件系统](https://support.huaweicloud.com/usermanual-mrs/mrs_01_1286.html)完成Hive对接OBS的操作。
    
   
   
6. 下载客户端。 
   1. 回到MRS集群页面，单击集群名称进入"概览"，单击"前往Manager"，如果提示绑定公网IP，请先绑定公网IP。
   
   2. 如果弹出访问MRS Manager对话框，单击"确定"，页面会跳转到MRS登录页面。输入MRS Manager的用户名admin和密码，密码为创建MRS集群时输入的admin密码。
   
   3. 登录成功后，选择"服务管理 \> 下载客户端"，"客户端类型"选择"仅配置文件"，"下载路径"选择"服务器端"。单击"确定"。 ![](https://support.huaweicloud.com/migration-dws/figure/zh-cn_image_0000001884500297.png "点击放大")
      
   
   
   
   
7. 使用root用户登录主master节点，并更新主管理节点的客户端配置。 
   **cd /opt/client**
   **sh refreshConfig.sh /opt/client** *客户端配置文件压缩包完整路径*
   本例命令为：
   **sh refreshConfig.sh /opt/client** /tmp/MRS-client/MRS_Services_Client.tar
   
   
8. 切换到omm用户，并进入Hive客户端所在目录。 
   **su - omm**
   **cd /opt/client**
   
   
9. 在Hive上创建存储类型为TEXTFILE的表product_info。 
   1. 在/opt/client路径下，导入环境变量。 **source bigdata_env**
      ![](https://support.huaweicloud.com/migration-dws/public_sys-resources/note_3.0-zh-cn.png)
      提示：若出现find：'opt/client/Hudi': Permission denied 可忽略，不影响后续操作。
      
   
   2. 登录Hive客户端。
      1. 如果当前集群已启用Kerberos认证，执行以下命令认证当前用户，当前用户需要具有创建Hive表的权限，具体操作请参见《MapReduce服务用户指南》的[创建角色](https://support.huaweicloud.com/usermanual-mrs/mrs_01_0343.html)。
      
      2. 配置拥有对应权限的角色，具体操作请参见《MapReduce服务用户指南》的[创建用户](https://support.huaweicloud.com/usermanual-mrs/mrs_01_0345.html)。 为用户绑定对应角色。如果当前集群未启用Kerberos认证，则无需执行如下命令。
         **kinit** ***MRS集群用户***
         
      
      3. 执行以下命令启动Hive客户端： **beeline**
         
       
   
   3. 依次执行以下SQL语句创建demo数据库及表product_info。
      ```
      CREATE DATABASE demo;
      ```
      ```
      USE demo;
      ```
      ```
      DROP TABLE product_info;
      CREATE TABLE product_info 
      (    
          product_price                int            ,
          product_id                   char(30)       ,
          product_time                 date           ,
          product_level                char(10)       ,
          product_name                 varchar(200)   ,
          product_type1                varchar(20)    ,
          product_type2                char(10)       ,
          product_monthly_sales_cnt    int            ,
          product_comment_time         date           ,
          product_comment_num          int        ,
          product_comment_content      varchar(200)                   
      ) 
      row format delimited fields terminated by ',' 
      stored as TEXTFILE;
      ```
      
   
   
   
   
10. 将product_info.txt数据文件导入Hive。 
    - Hive对接OBS场景：回到OBS管理控制台，单击并行文件系统名称，选择"对象 \> 上传对象"，将product_info.txt上传至OBS并行文件系统中product_info表路径下。
    
    - Hive对接HDFS场景：将product_info.txt文件导入到HDFS路径/user/hive/warehouse/demo.db/product_info/，有关导入数据到MRS集群的操作，请参见《MapReduce服务用户指南》中的[管理数据文件](https://support.huaweicloud.com/usermanual-mrs/zh-cn_topic_0019489057.html)章节。
    
    
    
    
11. 创建ORC表，并将数据导入ORC表。 
    1. 执行以下SQL语句创建ORC表。
       ```
       DROP TABLE product_info_orc;
       CREATE TABLE product_info_orc
       (    
           product_price                int            ,
           product_id                   char(30)       ,
           product_time                 date           ,
           product_level                char(10)       ,
           product_name                 varchar(200)   ,
           product_type1                varchar(20)    ,
           product_type2                char(10)       ,
           product_monthly_sales_cnt    int            ,
           product_comment_time         date           ,
           product_comment_num          int            ,
           product_comment_content      varchar(200)                   
       ) 
       row format delimited fields terminated by ',' 
       stored as orc;
       ```
       
    
    2. 将product_info表的数据插入到Hive ORC表product_info_orc中。
       ```
       insert into product_info_orc select * from product_info;
       ```
       
    
    3. 查询ORC表数据导入成功。
       ```
       select * from product_info_orc;
       ```
       
    
    
    
    
 
#### 创建MRS数据源连接
1. 登录[DWS控制台](https://console.huaweicloud.com/dws)，单击已创建好的DWS集群，**确保DWS集群与MRS在同一个区域、可用分区，并且在同一VPC子网下。**
2. 切换到"MRS数据源"，单击"创建MRS数据源连接"。
3. 配置以下参数，单击"确认"。 
   - 数据源名称：mrs_server
   
   - 配置方式：MRS用户
   
   - MRS数据源：选择前面创建的mrs_01集群。
   
   - MRS用户：admin
   
   - 用户密码：前面创建MRS数据源的admin密码。
   
   
   ![](https://support.huaweicloud.com/migration-dws/figure/zh-cn_image_0000001884619813.png "点击放大")
   
   
   
 
#### 创建外部服务器
仅Hive对接OBS场景执行，Hive对接HDFS场景跳过。
1. 使用Data Studio连接已创建好的DWS集群。

2. 执行以下语句，创建外部服务器。 
   ![](https://support.huaweicloud.com/migration-dws/public_sys-resources/notice_3.0-zh-cn.png)
   认证用的AK和SK硬编码到代码中或者明文存储都有很大的安全风险，建议在配置文件或者环境变量中密文存放，使用时解密，确保安全。
   ```
   CREATE SERVER obs_server FOREIGN DATA WRAPPER DFS_FDW 
   OPTIONS 
   (
   address 'obs.example.com:5443',   //OBS的访问地址。
   encrypt 'on',
   access_key '{AK值}',
   secret_access_key '{SK值}'，
    type 'obs'
   );
   ```
   
   
3. 查看外部服务器。 
   ```
   SELECT * FROM pg_foreign_server WHERE srvname='obs_server';
   ```
   返回结果如下所示，表示已经创建成功：
   ```
   srvname                      | srvowner | srvfdw | srvtype | srvversion | srvacl |                                                     srvoptions
   --------------------------------------------------+----------+--------+---------+------------+--------+---------------------------------------------------------------------------------------------------------------------
    obs_server |    16476 |  14337 |         |            |        | {address=obs.example.com:5443,type=obs,encrypt=on,access_key=***,secret_access_key=***}
   (1 row)
   ```
   
   
 
#### 创建EXTERNAL SCHEMA
1. 获取Hive的metastore服务内网IP和端口以及要访问的Hive端数据库名称。 
   1. 登录[MRS控制台](https://console.huaweicloud.com/mrs/#/clusterList/existing)。
   
   2. 选择"集群列表 \> 现有集群"，单击要查看的集群名称，进入集群基本信息页面。
   
   3. 单击运维管理处的"前往manager"，并输入用户名和密码登录管理页面。
   
   4. 依次单击"集群"、"Hive"、"配置"、"全部配置"、"MetaStore"、"端口"，记录参数hive.metastore.port对应的值。
   
   5. 依次单击"集群"、"Hive"、"实例"，记录MetaStore对应主机名称包含master1的管理IP。
   
   
   
   
2. 创建EXTERNAL SCHEMA。 
   ```
   //Hive对接OBS场景:SERVER名字填写创建的外部服务器名称，DATABASE填写Hive端创建的数据库，METAADDRESS填写中记录的hive端metastore服务的地址和端口，CONFIGURATION为MRS数据源默认的配置路径，不需更改。
   DROP SCHEMA IF EXISTS ex1;
   CREATE EXTERNAL SCHEMA ex1
       WITH SOURCE hive
            DATABASE 'demo'
            SERVER obs_server
            METAADDRESS '***.***.***.***:***'
            CONFIGURATION '/MRS/gaussdb/mrs_server'
   //Hive对接HDFS场景：SERVER名字填写创建的数据源名称mrs_server，METAADDRESS填写中记录的hive端metastore服务的地址和端口，CONFIGURATION为MRS数据源默认的配置路径，不需更改。
   DROP SCHEMA IF EXISTS ex1;
   CREATE EXTERNAL SCHEMA ex1
       WITH SOURCE hive
            DATABASE 'demo'
            SERVER mrs_server
            METAADDRESS '***.***.***.***:***'
            CONFIGURATION '/MRS/gaussdb/mrs_server'
   ```
   
   
3. 查看创建的EXTERNAL SCHEMA 
   ```
   SELECT * FROM pg_namespace WHERE nspname='ex1';
   SELECT * FROM pg_external_namespace WHERE nspid = (SELECT oid FROM pg_namespace WHERE nspname = 'ex1');
                        nspid                     | srvname | source | address | database | confpath |                                                     ensoptions   | catalog
   --------------------------------------------------+----------+--------+---------+------------+--------+---------------------------------------------------------------------------------------------------------------------
                     16393                        |    obs_server |  hive | ***.***.***.***:***        |  demo          | ***       |                         |
   (1 row)
   ```
   
   
 
#### 执行数据导入
1. 创建本地目标表。 
   ```
   DROP TABLE IF EXISTS product_info;
   CREATE TABLE product_info
   (
       product_price                integer        ,
       product_id                   char(30)       ,
       product_time                 date           ,
       product_level                char(10)       ,
       product_name                 varchar(200)   ,
       product_type1                varchar(20)    ,
       product_type2                char(10)       ,
       product_monthly_sales_cnt    integer        ,
       product_comment_time         date           ,
       product_comment_num          integer        ,
       product_comment_content      varchar(200)                   
   ) ;
   ```
   
   
2. 从Hive表导入目标表。 
   ```
   INSERT INTO product_info SELECT * FROM ex1.product_info_orc;
   ```
   
   
3. 查询导入结果。 
   ```
   SELECT * FROM product_info;
   ```
   
   
 
#### 执行数据导出
1. 创建本地源表。 
   ```
   DROP TABLE IF EXISTS product_info_export;
   CREATE TABLE product_info_export
   (
       product_price                integer        ,
       product_id                   char(30)       ,
       product_time                 date           ,
       product_level                char(10)       ,
       product_name                 varchar(200)   ,
       product_type1                varchar(20)    ,
       product_type2                char(10)       ,
       product_monthly_sales_cnt    integer        ,
       product_comment_time         date           ,
       product_comment_num          integer        ,
       product_comment_content      varchar(200)                   
   ) ;
   INSERT INTO product_info_export SELECT * FROM product_info;
   ```
   
   
2. Hive端创建目标表。 
   ```
   DROP TABLE product_info_orc_export;
   CREATE TABLE product_info_orc_export
   (    
       product_price                int            ,
       product_id                   char(30)       ,
       product_time                 date           ,
       product_level                char(10)       ,
       product_name                 varchar(200)   ,
       product_type1                varchar(20)    ,
       product_type2                char(10)       ,
       product_monthly_sales_cnt    int            ,
       product_comment_time         date           ,
       product_comment_num          int            ,
       product_comment_content      varchar(200)                   
   ) 
   row format delimited fields terminated by ',' 
   stored as orc;
   ```
   
   
3. 从本地源表导入Hive表。 
   ```
   INSERT INTO ex1.product_info_orc_export SELECT * FROM product_info_export;
   ```
   
   
4. Hive端查询导入结果 
   ```
   SELECT * FROM product_info_orc_export;
   ```
   
   
 
