
# 通过Doris Catalog读取Hive外表数据并写入Doris
#### 应用场景
通过Doris创建Catalog成功读取Hive外表数据并写入Doris，并按照Unique指定字段自动去重。
#### 方案架构
离线数据可以从数据湖加载，也可以直接加载本地文件。从数据湖加载可以使用工具CDM，在没有CDM工具时，可以直接使用外表加载、BrokerLoad的方式。
本地文件加载则使用Doris自带的StreamLoad工具。
图1离线数据加载   
![](https://support.huaweicloud.com/bestpractice-mrs/zh-cn_image_0000002378880988.png "点击放大")
- 场景特点： 业务特点为离线数据，端到端时延无要求，仅对数据集市中的数据查询时延有要求，如离线报表场景、实时报表的数据初始化场景。
  
- 数据加载方式：
  - 在存在DataArts Studio工具的场景下，数据加载统一使用CDM进行（DataArts Studio需要2.10及以上版本）。
  
  - 在不存在DataArts Studio工具的场景下，可以使用Spark或者外表方式加载。由数据加工方进行数据推送加载时，推荐使用BrokerLoad加载方式，方便数据加工方统一调度；如果有数据应用方负责数据加载，则使用外表方式进行数据加载较为方便应用层另外配置加载数据。
  
  - 在没有数据湖的场景下，轻量化数仓场景中，数据直接由源端文件加载到Doris中，可以使用Streamload方式加载本地文件。
   
- 注意事项： Hive外表通过整体添加Hive的MetaStore的方式，将全量元数据在Doris中呈现。
  
 
#### 操作流程
- [步骤1：创建MRS Hive集群并配置]
- [步骤2：创建MRS Doris集群并配置]
- [步骤3：创建Doris Catalog并将Hive外表数据写入Doris]
 
 #### 步骤1：创建MRS Hive集群并配置
1. 创建MRS Hive集群。 
   详细操作请参考[自定义购买MRS集群](https://support.huaweicloud.com/usermanual-mrs/mrs_01_0513.html)，例如相关参数如下：
   - 集群名称：自定义，例如"mrs_test"
   
   - 集群版本：MRS 3.3.0-LTS
   
   - 集群组件包含：Hive等
   
   - Kerberos认证：开启
   
   
   其他参数根据实际需要进行配置。
   
   
2. 集群购买完成后安装集群全量客户端，详细操作请参考[安装客户端（3.x版本）](https://support.huaweicloud.com/usermanual-mrs/mrs_01_0089.html)。
   
   例如客户端安装路径为"/opt/client"。
   
   
3. 配置集群存算分离。 
   详细操作请参考[配置MRS集群通过IAM委托对接OBS](https://support.huaweicloud.com/usermanual-mrs/mrs_01_0768.html)。
   
   
4. 已存在Hive外表（数据格式仅限ORC格式）。 
   例如表wxk.lineorder_orc02，存在一定量业务数据。
   建表语句参考：
   ```
   CREATE TABLE wxk.`lineorder_orc02`(
     `lo_orderkey` bigint,
     `lo_linenumber` int,
     `lo_custkey` bigint,
     `lo_partkey` bigint,
     `lo_suppkey` bigint,
     `lo_orderdate` date,
     `lo_orderpriority` varchar(300),
     `lo_shippriority` int,
     `lo_quantity` int,
     `lo_extendedprice` bigint,
     `lo_ordtotalprice` bigint,
     `lo_discount` int,
     `lo_revenue` bigint,
     `lo_supplycost` int,
     `lo_tax` int,
     `lo_commitdate` date,
     `lo_shipmode` varchar(300)
   ) ROW FORMAT SERDE 'org.apache.hadoop.hive.ql.io.orc.OrcSerde' STORED AS INPUTFORMAT 'org.apache.hadoop.hive.ql.io.orc.OrcInputFormat' OUTPUTFORMAT 'org.apache.hadoop.hive.ql.io.orc.OrcOutputFormat' LOCATION 'obs://test-wxk/doristest' TBLPROPERTIES (
     'bucketing_version' = '2',
     'orc.compress' = 'ZLIB',
     'transient_lastDdlTime' = '1705923234'
   ) ；
   ```
   准备数据如下：
   ![](https://support.huaweicloud.com/bestpractice-mrs/zh-cn_image_0000002095614617.png "点击放大")
   
   
 
 #### 步骤2：创建MRS Doris集群并配置
1. 创建MRS Doris集群。 
   详细操作请参考[自定义购买MRS集群](https://support.huaweicloud.com/usermanual-mrs/mrs_01_0513.html)，例如相关参数如下：
   - 集群名称：自定义，例如"mrs_doris"
   
   - 集群版本：MRS 3.3.0-LTS
   
   - 组件选择：Doris集群。
   
   - Kerberos认证：开启
   
   
   其他参数根据实际需要进行配置。
   
   
2. 集群购买完成后安装集群客户端。 
   详细操作请参考[安装客户端（3.x版本）](https://support.huaweicloud.com/usermanual-mrs/mrs_01_0089.html)。
   例如客户端安装路径为"/opt/dorisclient"。
   
   
3. 在Doris集群安装MySQL客户端。 
   详细操作请参考[使用MySQL客户端连接Doris](https://support.huaweicloud.com/cmpntguide-lts-mrs/mrs_01_249271.html)。
   
   
4. 创建拥有Doris管理权限的人机用户（例如用户名为**dorisuser** ），并修改初始密码。
   
   1. 登录Doris集群Manager页面。
   
   2. 选择"系统 \> 权限 \> 角色 \> 添加角色"，填写角色名称，如"dorisrole"，在"配置资源权限"选择"*待操作的集群* \> Doris"，勾选"Doris管理员权限"，单击"确定"。
   
   3. 选择"用户 \> 添加用户"，填写用户名称，如"dorisuser"，"用户类型"选择"人机"，"密码策略"默认，输入用户密码并确认密码，关联"dorisrole"角色，单击"确定"。
   
   4. 使用新建的**dorisuser**用户重新登录FusionInsight Manager，修改该用户初始密码。
   
   
   
   
5. 配置MRS Hive集群与Doris集群互信。 
   1. 配置MRS Hive集群与Doris集群互信，详细操作请参考[集群互信管理](https://support.huaweicloud.com/usermanual-mrs/admin_guide_000177.html)。
   
   2. 配置后验证。
      1. 以**root** 用户登录Doris集群客户端，执行以下命令加载环境变量。
         ```
         source 客户端安装路径/bigdata_env
         ```
         
      
      2. 执行以下命令认证Hive集群用户。
         ```
         kinit Hive集群业务用户@Hive集群系统域名
         ```
         输入Hive集群用户相应密码，认证成功即为互信成功。
         ![](https://support.huaweicloud.com/bestpractice-mrs/public_sys-resources/note_3.0-zh-cn.png)
         - Hive集群用户：可以自行创建也可使用默认的系统用户，例如**hive** ，用户默认密码请参考[MRS集群用户账号一览表](https://support.huaweicloud.com/usermanual-mrs/admin_guide_000239.html)。
         
         - Hive集群系统域名：可以登录Hive集群Manager页面，选择"系统 \> 权限 \> 域和互信"，查看"本端域"参数获取。
           
       
   
   
   
   
 
 #### 步骤3：创建Doris Catalog并将Hive外表数据写入Doris
1. 登录Doris集群中已安装好MySQL客户端的节点，执行如下命令进入Doris数据库。 
   ```
   export LIBMYSQL_ENABLE_CLEARTEXT_PLUGIN=1 //若集群已启用Kerberos认证（安全模式）需执行该命令。
   ```
   ```
   mysql -u数据库登录用户 -p数据库登录用户密码 -P数据库连接端口 -hDoris FE实例IP地址
   ```
   ![](https://support.huaweicloud.com/bestpractice-mrs/public_sys-resources/note_3.0-zh-cn.png)
   - 数据库连接端口为Doris FE的查询连接端口，可通过登录MRS Doris集群的Manager界面，选择"集群 \> 服务 \> Doris \> 实例"，查看任一FE实例的业务IP地址获取。
   
   - Doris FE实例IP地址可通过登录MRS Doris集群的Manager界面，选择"集群 \> 服务 \> Doris \> 配置 \> 全部配置"，搜索并查看"query_port"参数值获取。
    
   
   
2. 创建Catalog。 
   例如执行以下命令，相关参数说明见[表1]，参数取值请以时间为准。
   ```
   CREATE CATALOG hive_catalog_obs11 PROPERTIES (
     'type' = 'hms',
     'hive.metastore.uris' = 'thrift://192.168.xx.xx:21088',
     'hive.metastore.sasl.enabled' = 'true',
     'hive.server2.thrift.sasl.qop' = 'auth-conf',
     'hive.server2.authentication' = 'KERBEROS',
     'dfs.nameservices' = 'hacluster',
     'dfs.ha.namenodes.hacluster' = '24,25',
     'dfs.namenode.rpc-address.hacluster.24' = '主NameNodeIP地址:RPC通信端口',
     'dfs.namenode.rpc-address.hacluster.25' = '主NameNodeIP地址:RPC通信端口',
     'dfs.client.failover.proxy.provider.hacluster' = 'org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider',
     'hive.version' = '3.1.0',
     'yarn.resourcemanager.address' = '192.168.xx.xx:26004',
     'yarn.resourcemanager.principal' = 'mapred/hadoop.hadoop.com@HADOOP.COM',
     'hive.metastore.kerberos.principal' = 'hive/hadoop.hadoop.com@HADOOP.COM',
     'hadoop.security.authentication' = 'kerberos',
     'hadoop.kerberos.keytab' = '/opt/Bigdata/FusionInsight_Doris_8.3.0/install/FusionInsight-Doris-1.2.3/doris-fe/bin/doris.keytab',
     'hadoop.kerberos.principal' = 'doris/hadoop.hadoop.com@hadoop.com',
     'java.security.krb5.conf' = '/opt/Bigdata/FusionInsight_BASE_8.3.0/1_2_KerberosClient/etc/krb5.conf',
     'AWS_ACCESS_KEY' = 'AK信息',
     'AWS_SECRET_KEY' = 'SK信息',
     'AWS_ENDPOINT' = '集群所在地区的终端节点',
     'AWS_REGION' = '集群所在region',
     'hadoop.rpc.protection' = 'privacy'
   );
   ```
    表1参数说明 
   | 参数                                          | 取值样例                                                                                               | 参数描述                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         |
   |:---|:---|:---|
   | hive.metastore.uris                         | thrift://*192.168.xx.xx* *:21088*                                                                  | Hive MetaStore的URL，格式为"thrift://*\<Hive MetaStore的IP地址\>:\<端口号\>*"，支持多个值，以逗号分隔。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                              |
   | hive.metastore.sasl.enabled                 | true                                                                                               | MetaStore的管理权限开关，值为"true"。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                   |
   | hive.server2.thrift.sasl.qop                | auth-conf                                                                                          | HiveServer2和客户端交互是否加密传输，值为"auth-conf"。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       |
   | hive.server2.authentication                 | KERBEROS                                                                                           | 访问HiveServer的安全认证方式，值为"KERBEROS"。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            |
   | dfs.nameservices                            | hacluster                                                                                          | 集群NameService名称。 可在NameNode所在节点的"${BIGDATA_HOME}/FusionInsight_HD_\*/1_\*_NameNode/etc"目录下的"hdfs-site.xml"中查找该配置项的值。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                              |
   | dfs.ha.namenodes.hacluster                  | 24,25                                                                                              | 集群NameService前缀，包含两个值。 可在NameNode所在节点的"${BIGDATA_HOME}/FusionInsight_HD_\*/1_\*_NameNode/etc"目录下的"hdfs-site.xml"中查找该配置项的值。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         |
   | dfs.namenode.rpc-address.hacluster.*xx* *1* | -                                                                                                  | 主NameNode的RPC通信地址。 可在NameNode所在节点的"${BIGDATA_HOME}/FusionInsight_HD_\*/1_\*_NameNode/etc"目录下的"hdfs-site.xml"中查找该配置项的值。*xx*为"dfs.ha.namenodes.hacluster"参数的值。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        |
   | dfs.namenode.rpc-address.hacluster.*xx* *2* | -                                                                                                  | 备NameNode的RPC通信地址。 可在NameNode所在节点的"${BIGDATA_HOME}/FusionInsight_HD_\*/1_\*_NameNode/etc"目录下的"hdfs-site.xml"中查找该配置项的值。*xx*为"dfs.ha.namenodes.hacluster"参数的值。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                      |
   | hive.version                                | 3.1.0                                                                                              | Hive版本。 可在Manager界面，选择"集群 \> 服务 \> Hive"，在概览页面查看"版本"获取。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          |
   | yarn.resourcemanager.address                | *192.168.xx.xx*                                                                                    | 主ResourceManager实例的IP地址。 可在Manager界面，选择"集群 \> 服务 \> Yarn \> 实例"，查看主ResourceManager实例的业务IP地址。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       |
   | yarn.resourcemanager.principal              | mapred/hadoop.hadoop.com@HADOOP.COM                                                                | 访问Yarn集群的Principal。 可登录Manager页面，选择"系统 \> 权限 \> 域和互信"，查看"本端域"参数获取。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                |
   | hive.metastore.kerberos.principal           | hive/hadoop.hadoop.com@HADOOP.COM                                                                  | 访问Hive集群的Principal，值为"hive/hadoop.hadoop.com@HADOOP.COM"。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    |
   | hadoop.security.authentication              | kerberos                                                                                           | 访问Hadoop的安全认证方式，值为"kerberos"。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                |
   | hadoop.kerberos.keytab                      | /opt/Bigdata/FusionInsight_Doris_8.3.0/install/FusionInsight-Doris-1.2.3/doris-fe/bin/doris.keytab | 访问Hadoop集群的keytab文件所在的具体路径，值为"${BIGDATA_HOME}/FusionInsight_Doris_\*/install/FusionInsight-Doris-\*/doris-be/bin/doris.keytab"。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                              |
   | hadoop.kerberos.principal                   | doris/hadoop.hadoop.com@HADOOP.COM                                                                 | 访问Hadoop集群的Principal，值为"doris/hadoop.hadoop.com@HADOOP.COM"。 说明： 该参数值的系统域名要严格区分大小写。如系统域名查询为11B1A87B_48C8_xxx_CC4039.COM时，对应配置应为： 'hadoop.kerberos.principal' = 'doris/hadoop.11b1a87b_48c8_451f_a283_dd0be9cc4039.com@11B1A87B_48C8_xxx_CC4039.COM',                                                                                                                                                                                                                                                                                                                                                                                                                                                         |
   | java.security.krb5.conf                     | /opt/Bigdata/FusionInsight_BASE_8.3.0/1_2_KerberosClient/etc/krb5.conf                             | krb5文件所在的具体路径，值为"${BIGDATA_HOME}/FusionInsight_BASE_\*/1_\*_KerberosClient/etc/krb5.conf"。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                   |
   | AWS_ACCESS_KEY                              | *xxx*                                                                                              | AK、SK信息。可以通过以下操作以下获取： 1. 登录控制台，在用户名下拉列表中选择"我的凭证"。  2. 进入"我的凭证"页面，选择"访问密钥 \> 新增访问密钥"。  3. 单击"确定"，根据浏览器提示，保存密钥文件。密钥文件会直接保存到浏览器默认的下载文件夹中。打开名称为"credentials.csv"的文件，即可查看访问密钥AK（Access Key Id）和SK（Secret Access Key）。   |
   | AWS_SECRET_KEY                              | *xxx*                                                                                              | AK、SK信息。可以通过以下操作以下获取： 1. 登录控制台，在用户名下拉列表中选择"我的凭证"。  2. 进入"我的凭证"页面，选择"访问密钥 \> 新增访问密钥"。  3. 单击"确定"，根据浏览器提示，保存密钥文件。密钥文件会直接保存到浏览器默认的下载文件夹中。打开名称为"credentials.csv"的文件，即可查看访问密钥AK（Access Key Id）和SK（Secret Access Key）。   |
   | AWS_ENDPOINT                                | *xxx*                                                                                              | 登录"对象存储服务 OBS"管理控制台，单击"并行文件系统"，单击Hive表所在的OBS并行文件系统名称，在概览界面查看"Endpoint"参数值，该值为创建Catalog时设置AWS_ENDPOINT参数的值。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                   |
   | AWS_REGION                                  | *xxx*                                                                                              | 可在[地区和终端节点](https://developer.huaweicloud.com/endpoint?MRS)获取。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                               |
   | hadoop.rpc.protection                       | AWS_SECRET_KEY                                                                                     | 设置Hadoop中各模块的RPC通道是否加密，默认为"privacy"。 可在Manager界面，选择"集群 \> 服务 \> HDFS \> 配置"，搜索"hadoop.rpc.protection"获取。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          |
      
   
   
3. 执行以下命令查询Hive表。 
   - 执行以下命令查询Catalogs。
     ```
     show catalogs;
     ```
     
   
   - 执行以下命令查询Catalog下面的数据库。
     ```
     show databases from hive_catalog;
     ```
     
   
   - 执行以下命令切换到Catalog下，再进入到数据库中。
     ```
     switch hive_catalog;
     ```
     ```
     use default;
     ```
     
   
   - 查询Catalog中某个库的所有表。
     ```
     show tables from `hive_catalog`.`default`;
     ```
     
   
   - 查询指定表。
     ```
     select * from `hive_catalog`.`default`.`test_table`;
     ```
     
   
   - 执行以下命令查看表的Schema。
     ```
     DESC test_table;
     ```
     
   
   - 新建或操作Hive表后，需要在Doris中执行刷新。
     ```
     refresh catalog hive_catalog;
     ```
     
   
   
   例如执行后结果如下，表示查询成功：
   ![](https://support.huaweicloud.com/bestpractice-mrs/zh-cn_image_0000002059825908.png "点击放大")
   
   
4. 执行以下命令创建Doris表（使用引擎为 UNIQUE ）。 
   ```
   CREATE TABLE wxk.`lineorder_u` (
     `LO_ORDERKEY` bigint NOT NULL COMMENT "订单id",
     `LO_LINENUMBER` int NOT NULL COMMENT "订单码",
     `LO_CUSTKEY` bigint NOT NULL COMMENT "客户id",
     `LO_PARTKEY` bigint NOT NULL COMMENT "商品id",
     `LO_SUPPKEY` bigint NOT NULL COMMENT "供应商id",
     `LO_ORDERDATE` date DEFAULT NULL COMMENT "订单日期",
     `LO_ORDERPRIORITY` varchar(100) DEFAULT NULL COMMENT "订单优先级",
     `LO_SHIPPRIORITY` int DEFAULT NULL COMMENT "物流优先级",
     `LO_QUANTITY` int DEFAULT NULL COMMENT "数量",
     `LO_EXTENDEDPRICE` bigint DEFAULT NULL COMMENT "扩展价格",
     `LO_ORDTOTALPRICE` bigint DEFAULT NULL COMMENT "订单总价",
     `LO_DISCOUNT` int DEFAULT NULL COMMENT "折扣",
     `LO_REVENUE` bigint DEFAULT NULL COMMENT "收入",
     `LO_SUPPLYCOST` int DEFAULT NULL COMMENT "成本",
     `LO_TAX` int DEFAULT NULL COMMENT "税款",
     `LO_COMMITDATE` date DEFAULT NULL COMMENT "承诺日期",
     `LO_SHIPMODE` varchar(100) NOT NULL COMMENT "运输方式"
   ) UNIQUE KEY (
     `LO_ORDERKEY`,
     `LO_LINENUMBER`,
     `LO_CUSTKEY`,
     `LO_PARTKEY`,
     `LO_SUPPKEY`,
     `LO_ORDERDATE`
   ) PARTITION BY RANGE(`LO_ORDERDATE`) (
     PARTITION `p1992`
     VALUES
       LESS THAN ("1993-01-01"),
       PARTITION `p1993`
     VALUES
       LESS THAN ("1994-01-01"),
       PARTITION `p1994`
     VALUES
       LESS THAN ("1995-01-01"),
       PARTITION `p1995`
     VALUES
       LESS THAN ("1996-01-01"),
       PARTITION `p1996`
     VALUES
       LESS THAN ("1997-01-01"),
       PARTITION `p1997`
     VALUES
       LESS THAN ("1998-01-01"),
       PARTITION `p1998`
     VALUES
       LESS THAN ("1999-01-01"),
       PARTITION `p1999`
     VALUES
       LESS THAN ("2000-01-01"),
       PARTITION `p2000`
     VALUES
       LESS THAN ("2001-01-01"),
       PARTITION `p2001`
     VALUES
       LESS THAN ("2002-01-01")
   ) DISTRIBUTED BY HASH(`LO_ORDERDATE`) BUCKETS 1 PROPERTIES (
     "replication_allocation" = "tag.location.default: 3"
   );
   ```
   例如执行后结果如下，表示创建Doris表成功。
   ![](https://support.huaweicloud.com/bestpractice-mrs/zh-cn_image_0000002059879046.png "点击放大")
   
   
5. 执行以下命令读取Hive外表数据写入Doris。 
   ```
   insert into internal.wxk.lineorder_u select * from hive_catalog.wxk.lineorder02
   ```
   例如执行后结果如下，数据写入Doris成功，且按照UNIQUE KEY指定字段自动去除重复数据。
   ![](https://support.huaweicloud.com/bestpractice-mrs/zh-cn_image_0000002095799313.png "点击放大")
   
   
 
