# 使用EXTERNAL SCHEMA跨集群访问Hive MetaStore元数据
DWS存算分离集群支持通过建立EXTERNAL SCHEMA实现远端访问MRS的Hive数据源（包括Hive对接HDFS和Hive对接OBS两种场景），本实践介绍跨集群访问Hive MetaStore数据的操作流程。
 #### 准备环境
- 已创建DWS 3.0集群，需确保MRS和DWS集群在同一个区域、可用区、同一VPC子网内，确保集群网络互通。
- 已获取华为云账户的AK和SK。
 
#### 约束与限制
- 目前仅支持对接EXTERNAL SCHEMA对应的Hive端数据库的表进行SELECT、INSERT和INSERT OVERWRITE操作，其余操作均不支持。
- MRS端两种数据源对应格式支持的操作参见[表1]。
   表1MRS端两种数据源支持的操作 
  | 数据源 | 表类型 | 操作                   | TEXT | CSV | PARQUET | ORC |
  |:---|:---|:---|:---|:---|:---|:---|
  | HDFS | 非分区表 | SELECT                 | √   | √   | √      | √    |
  | HDFS | 非分区表 | INSERT/INSERT OVERWRITE | x | x      | x       | √   |
  | HDFS | 分区表   | SELECT                 | √   | √      | √       | √   |
  | HDFS | 分区表   | INSERT/INSERT OVERWRITE  | x   | x     | x        | √     |
  | OBS  | 非分区表  | SELECT                  | √  | √   | √      | √    |
  | OBS  | 非分区表  | INSERT/INSERT OVERWRITE  | x | x     | x      | √   |
  | OBS  | 分区表    | SELECT                   | x  | x    | √     | √   |
  | OBS  | 分区表    | INSERT/INSERT OVERWRITE  | x   | x      | x         | x      |
     
  

- 不再保证事务原子性，事务失败后，不再保证数据一致性；不支持回滚。
- 不支持通过EXTERNAL SCHEMA对hive端创建的表进行GRANT和REVOKE操作。
- 并发支持：DWS、Hive、Spark并发读写，会出现脏读问题；对同一张非分区表或者同一张分区表的同一个分区执行包含INSERT OVERWRITE相关的并发操作无法保证预期结果，请不要执行此类操作。
- Hive MetaStore特性不支持联邦机制。
 
#### 基本流程
本实践预计时长：1小时，基本流程如下：
1. 创建MRS分析集群（使用此特性必须选择Hive组件）。
2. 在Hive端创建表。
3. 在Hive端插入数据或者通过将本地txt数据文件上传至OBS桶，再通过OBS桶导入Hive，并由txt存储表导入ORC存储表。
4. 创建MRS数据源连接。
5. 创建外部服务器。
6. 创建EXTERNAL SCHEMA。
7. 通过EXTERNAL SCHEMA对Hive表进行导入或者读取操作。
 
#### 创建MRS集群
1. 登录[MRS控制台](https://console.huaweicloud.com/mrs/#/clusterList/existing)。
2. 单击"购买集群"，选择"自定义购买"。
3. 填写软件配置参数，单击"下一步"。 
   表2软件配置 
   | 参数项  | 取值                                                                                                              |
   |:---|:---|
   | 区域     | 华北-北京四                                                                                                            |
   | 集群名称  | mrs_01                                                                                                           |
   | 版本类型 | 普通版                                                                                                             |
   | 集群版本  | **MRS 3.1.3**（主推） 说明： MRS集群支持连接3.0.\*、3.1.\*及以上版本（"\*"代表的是数字）。 |
   | 集群类型  | 分析集群                                                                                                            |
   | 元数据    | 本地元数据                                                                                                            |
      
   
   
4. 填写硬件配置参数，单击"下一步"。 
   表3硬件配置 
   | 参数项    | 取值          |
   |:---|:---|
   | 计费模式    | 按需计费         |
   | 可用区    | 可用区2        |
   | 虚拟私有云   | vpc-01     |
   | 子网      | subnet-01  |
   | 安全组      | 自动创建       |
   | 弹性公网IP   | *10.x.x.x* |
   | 企业项目    | default    |
   | Master节点  | 2             |
   | 分析Core节点 | 3           |
   | 分析Task节点 | 0           |
      
   
   
5. 填写高级配置参数如下表，单击"立即购买"，等待约15分钟，集群创建成功。 
   表4高级配置 
   | 参数项        | 取值                                            |
   |:---|:---|
   | 标签         | test01                                        |
   | 主机名前缀   | 可不填写，用作集群中ECS机器或BMS机器主机名的前缀。                   |
   | 弹性伸缩      | 保持默认即可                                         |
   | 引导操作       | 保持默认即可，MRS 3.x版本暂时不支持该参数。                       |
   | 委托       | 保持默认即可                                       |
   | 数据盘加密    | 默认关闭，保持默认即可。                                  |
   | 告警       | 保持默认即可                                        |
   | 规则名称      | 保持默认即可                                          |
   | 主题名称      | 选择相应的主题                                       |
   | Kerberos认证 | 默认打开                                          |
   | 用户名       | admin                                          |
   | 密码       | 设置密码，该密码用于登录集群管理页面。                           |
   | 确认密码       | 再次输入设置admin用户密码                                |
   | 登录方式         | 密码                                              |
   | 用户名       | root                                           |
   | 密码        | 设置密码，该密码用于远程登录ECS机器。                           |
   | 确认密码      | 再次输入设置的root用户密码                               |
   | 配置委托      | 在高级配置中配置MRS在IAM服务中预置的委托MRS_ECS_DEFAULT_AGENCY。 |
   | 通信安全授权   | 勾选"确认授权"。                                     |
      
   
   
 
#### 准备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)，单击"创建并行文件系统"，填写以下参数，单击"立即创建"。
   
   表5桶参数 
   | 参数项       | 取值             |
   |:---|:---|
   | 区域        | 华北-北京四         |
   | 数据冗余存储策略 | 单AZ存储         |
   | 桶名称       | mrs-datasource |
   | 默认存储类别      | 标准存储         |
   | 桶策略      | 私有            |
   | 默认加密      | 关闭              |
   | 归档数据直读     | 关闭            |
   | 企业项目       | default        |
   | 标签      | -                |
      
   
   
3. 并行文件系统创建成功后，切换回MRS控制台，单击创建好的MRS集群名称，进入"概览"，单击"IAM用户同步"所在行的"同步"，等待约5分钟同步完成。
4. 单击"节点管理"，单击任意一台master节点，进入该节点页面，切换到"弹性公网IP"，单击"绑定弹性公网IP"，勾选已有弹性IP并单击"确定"，如果没有，请创建。记录此公网IP。
5. （可选）Hive对接OBS。 
   ![](https://support.huaweicloud.com/bestpractice-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/bestpractice-dws/figure/zh-cn_image_0000002053201349.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/bestpractice-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)。配置拥有对应权限的角色，具体操作请参见《MapReduce服务用户指南》的[创建用户](https://support.huaweicloud.com/usermanual-mrs/mrs_01_0345.html)。为用户绑定对应角色。如果当前集群未启用Kerberos认证，则无需执行如下命令。
         **kinit** ***MRS集群用户***
         
      
      2. 执行以下命令启动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服务用户指南》中的[上传应用数据至MRS集群](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/bestpractice-dws/figure/zh-cn_image_0000002053360361.png "点击放大")
   
   
   
 
#### 创建外部服务器
仅Hive对接OBS场景执行，Hive对接HDFS场景跳过。
1. 连接已创建好的DWS集群。

2. 执行以下语句，创建外部服务器。{AK值}、{SK值}由[准备环境]获取。
   
   ![](https://support.huaweicloud.com/bestpractice-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"，并输入用户名和密码登录FusionInsight 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;
   ```
   
   
 
