# 配置Doris对接Hive数据源
通过连接Hive Metastore，或者兼容Hive Metastore的元数据服务，Doris可以自动获取Hive的库表信息，并进行数据查询。
除Hive外，很多其他系统也会使用Hive Metastore存储元数据。通过Hive Catalog，不仅能访问Hive，也能访问使用Hive Metastore作为元数据存储的系统，例如Iceberg、Hudi等。
#### 约束与限制
- 支持Managed Table。
- 可以识别Hive Metastore中存储的Hive和Hudi元数据。
- MRS 3.6.0-LTS之前版本，Hive表格式仅支持Parquet、ORC、TextFile。
- 建议待读取的Hive表数据量不要过大，不要执行全表扫描查询操作，可考虑单批次访问的Hive数据量在TB内，且分区数不超过5000。
- 不支持对Hive Catalog表执行**delete** 和**update**操作。
- Doris访问Array类型的字段时，默认从下标1开始；Hive访问Array类型的字段时，默认从下标0开始。
- MRS 3.6.0-LTS及之后版本，在MySQL客户端中执行**use** *数据库名称* **;** 命令会查询该数据库下所有表的元数据信息，会对Hive MetaStore造成一定压力，请谨慎使用。可通过增加客户端连接参数**--no-auto-rehash** 避免扫描对应数据库下的所有表，例如：
  连接Doris数据库：
  ```
  mysql -udorisuser -p -PFE查询连接端口 -hDoris FE实例IP地址 --no-auto-rehash
  ```
  切换数据库：
  ```
  use test;
  ```
  
- MRS 3.6.0-LTS及之后版本，Doris仅支持通过Hive Catalog对接Text、Orc、Parquet、RC格式的Hive表，且不支持读取binary类型的数据。
 
#### 前提条件
- 已创建包含Doris服务的集群，集群内各服务运行正常。
- 待连接Doris数据库的节点与MRS集群网络互通。
- 创建具有Doris管理权限的用户。
  - 集群已启用Kerberos认证（安全模式） 在FusionInsight Manager中创建一个人机用户，例如"dorisuser"，创建一个拥有"Doris管理员权限"的角色绑定给该用户。
    使用新建的用户**dorisuser**重新登录FusionInsight Manager，修改该用户初始密码。
    
  
  - 集群未启用Kerberos认证（普通模式） 使用**admin**用户连接Doris后，创建具有管理员权限的角色并绑定给用户。
    
   
- 已安装MySQL客户端，相关操作可参考[使用MySQL客户端连接Doris](https://support.huaweicloud.com/cmpntguide-lts-mrs/mrs_01_249271.html)。
- 如果Doris通过Catalog跨集群访问Hive数据，需要配置跨集群互信，相关操作可参考[配置跨Manager集群互信](https://support.huaweicloud.com/usermanual-mrs/admin_guide_000177.html)。
 
#### Hive表操作
1. 如果需使用Doris读取Hive存储在OBS中的数据，需执行以下操作。
   
   1. 登录华为云管理控制台，在"控制台"页面，鼠标移动至右上方的用户名，在下拉列表中选择"我的凭证"。
   
   2. 单击"访问密钥"页签，单击"新增访问密钥"，输入验证码或密码。单击"确定"，生成并下载访问密钥。 在.csv文件中获取创建Catalog所需的AWS_ACCESS_KEY、AWS_SECRET_KEY参数值，对应关系为：
      - AWS_ACCESS_KEY参数值为.csv文件中"Access Key Id"列的值。
      
      - AWS_SECRET_KEY参数值为.csv文件中"Secret Access Key"列的值。
      
      
      ![](https://support.huaweicloud.com/cmpntguide-lts-mrs/public_sys-resources/note_3.0-zh-cn.png)
      - 请及时下载保存，弹窗关闭后将无法再次获取该密钥信息，但您可重新创建新的密钥。
      
      - 为了账号安全性，建议您妥善保管并定期修改访问密钥，修改访问密钥的方法为删除旧访问密钥，然后重新生成。
      
      - MRS 3.3.1及之后版本，AWS_ACCESS_KEY、AWS_SECRET_KEY参数名变更为obs.access_key和obs.secret_key。
        
   
   3. 创建Catalog所需的AWS_REGION（MRS 3.3.1及之后版本变更为obs.region）可在[地区和终端节点](https://developer.huaweicloud.com/endpoint?MRS)获取。
   
   4. 登录"对象存储服务 OBS"管理控制台，单击"并行文件系统"，单击Hive表所在的OBS并行文件系统名称，在概览界面查看"Endpoint"参数值，该值为创建Catalog时设置AWS_ENDPOINT（MRS 3.3.1及之后版本变更为obs.endpoint）参数的值。
   
   
   
   
2. 登录安装了MySQL的节点，执行以下命令，连接Doris数据库。 
   如果集群已启用Kerberos认证（安全模式），需先执行以下命令：
   ```
   export LIBMYSQL_ENABLE_CLEARTEXT_PLUGIN=1
   ```
   连接Doris数据库：
   ```
   mysql -u数据库登录用户 -p数据库登录用户密码 -P数据库连接端口 -hDoris FE实例IP地址
   ```
   - 数据库连接端口为Doris FE的查询连接端口，可以通过登录Manager，单击"集群 \> 服务 \> Doris \> 配置"，查询Doris服务的"query_port"参数获取。
   
   - Doris FE实例IP地址可通过登录MRS集群的Manager界面，单击"集群 \> 服务 \> Doris \> 实例"，查看任一FE实例的IP地址。
   
   - 用户也可以使用MySQL连接软件或者Doris WebUI界面连接数据库。
   
   
   
   
3. 创建Catalog。
   
   - Hive表数据存储在HDFS中，执行以下命令创建Catalog：
     - 集群已启用Kerberos认证（安全模式）：
       ```
       CREATE CATALOG hive_catalog PROPERTIES (
       'type'='hms',
       'hive.metastore.uris' = 'thrift://192.168.67.161: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',
       'hive.metastore.kerberos.principal' = '${hive_keytab_principal}',
       'hadoop.security.authentication' = 'kerberos',
       'hadoop.kerberos.keytab' = '/home/omm/doris_keytab/doris.keytab',
       'hadoop.kerberos.principal' = '${doris_keytab_principal}',
       'java.security.krb5.conf' = '/opt/Bigdata/FusionInsight_BASE_8.5.0/1_1_KerberosClient/etc/krb5.conf',
       'hadoop.rpc.protection' = 'privacy'
       );
       ```
       
     
     - 集群未启用Kerberos认证（普通模式）：
       ```
       CREATE CATALOG hive_catalog PROPERTIES (
       'type'='hms',
       'hive.metastore.uris' = 'thrift://192.168.67.161:21088',
       'hive.version' = '3.1.0',
       'hadoop.username' = 'hive',
       'dfs.nameservices'='hacluster',
       'dfs.ha.namenodes.hacluster'='24,25',
       'dfs.namenode.rpc-address.hacluster.24'='192-168-67-172:25000',
       'dfs.namenode.rpc-address.hacluster.25'='192-168-67-78:25000',
       'dfs.client.failover.proxy.provider.hacluster'='org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider'
       );
       ```
       
     
     
      表1创建Catalog相关参数介绍 
     | 参数                                          | 参数说明                                                                                                                                                                                                                                                                                                                                                                                                                                                                    |
     |:---|:---|
     | hive.metastore.uris                         | Hive MetaStore的URL，格式为"**thrift://** *Hive MetaStore的IP地址* **:** *端口号*"，支持多个值，以逗号分隔。                                                                                                                                                                                                                                                                                                                                                                                    |
     | dfs.nameservices                           | 集群NameService名称。可在NameNode所在节点的"${BIGDATA_HOME}/FusionInsight_HD_\*/1_\*_NameNode/etc"目录下的"hdfs-site.xml"中查找该配置项的值。                                                                                                                                                                                                                                                                                                                                                     |
     | dfs.ha.namenodes.hacluster                 | 集群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"参数的值。                                                                                                                                                                                                                                                                                                             |
     | dfs.client.failover.proxy.provider.hacluster | 指定HDFS客户端连接集群中Active状态节点的Java类。值为"org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider"。                                                                                                                                                                                                                                                                                                                                                            |
     | hive.version                              | Hive版本。可在Manager界面，选择"集群 \> 服务 \> Hive"，在概览页面查看"版本"获取。                                                                                                                                                                                                                                                                                                                                                                                                                 |
     | hadoop.rpc.protection                      | 设置Hadoop中各模块的RPC通道是否加密，默认为"privacy"。可在Manager界面，选择"集群 \> 服务 \> HDFS \> 配置"，搜索"hadoop.rpc.protection"获取。                                                                                                                                                                                                                                                                                                                                                                 |
     | hive.metastore.sasl.enabled                | MetaStore的管理权限开关，值为"true"。 该参数仅适用于开启Kerberos认证的集群。                                                                                                                                                                                                                                                                                                                                                                                     |
     | hive.server2.thrift.sasl.qop               | HiveServer2和客户端交互是否加密传输，值为"auth-conf"。 该参数仅适用于开启Kerberos认证的集群。                                                                                                                                                                                                                                                                                                                                                                       |
     | hive.server2.authentication                  | 访问HiveServer的安全认证方式，值为"KERBEROS"。 该参数仅适用于开启Kerberos认证的集群。                                                                                                                                                                                                                                                                                                                                                                              |
     | hive.metastore.kerberos.principal           | 访问Hive集群的keytab文件对应的principal。 MRS 3.5.0之前版本，值为"hive/hadoop.hadoop.com@HADOOP.COM"。MRS 3.5.0及之后版本，格式为"**hive/hadoop.** *${系统域名转换为小写}* **@** *${系统域名}*"，系统域名可登录Manager页面，选择"系统 \> 权限 \> 域和互信"，查看"本端域"参数获取。例如，查看到的系统域名为"A39A7DF8_953D_4772_B909_035A594FFA55.COM"，则该参数值为"hive/hadoop.a39a7df8_953d_4772_b909_035a594ffa55.com@A39A7DF8_953D_4772_B909_035A594FFA55.COM"。 该参数仅适用于开启Kerberos认证的集群。           |
     | hadoop.security.authentication               | 访问Hadoop的安全认证方式，值为"KERBEROS"。 该参数仅适用于开启Kerberos认证的集群。                                                                                                                                                                                                                                                                                                                                                                                   |
     | hadoop.kerberos.keytab                      | 访问Hadoop集群的keytab，该文件位于FE节点"${BIGDATA_HOME}/FusionInsight_Doris_\*/install/FusionInsight-Doris-\*/doris-fe/bin/doris.keytab"路径中，需要拷贝该keytab文件到所有FE、BE节点上，例如，"/home/omm/doris_keytab"目录下**，**并执行以下命令设置"doris.keytab"文件属组： ``` chown omm:wheel /home/omm/doris_keytab -R ``` 该参数仅适用于开启Kerberos认证的集群。                                                                                                                                         |
     | hadoop.kerberos.principal                  | 访问Hadoop集群的keytab文件对应的principal。 MRS 3.5.0之前版本，值为"doris/hadoop.hadoop.com@HADOOP.COM"。MRS 3.5.0及之后版本，格式为"**doris/hadoop** **.** *${系统域名转换为小写}* **@** *${系统域名}*"，系统域名可登录Manager页面，选择"系统 \> 权限 \> 域和互信"，查看"本端域"参数获取。例如，查看到的系统域名为"A39A7DF8_953D_4772_B909_035A594FFA55.COM"，则该参数值为"doris/hadoop.a39a7df8_953d_4772_b909_035a594ffa55.com@A39A7DF8_953D_4772_B909_035A594FFA55.COM"。 该参数仅适用于开启Kerberos认证的集群。 |
     | java.security.krb5.conf                       | krb5文件，值为"${BIGDATA_HOME}/FusionInsight_BASE_\*/1_\*_KerberosClient/etc/krb5.conf"文件所在的绝对路径。 该参数仅适用于开启Kerberos认证的集群。                                                                                                                                                                                                                                                                                                                       |
     | hadoop.username                              | 访问Hadoop集群的用户名，值为"hdfs"。 该参数仅适用于未开启Kerberos认证的集群。                                                                                                                                                                                                                                                                                                                                                                                     |
        
     
   
   - Hive表数据存储在OBS中，执行以下命令创建Catalog，相关参数值请参见[1]获取：
     MRS 3.3.1之前版本：
     ```
     CREATE CATALOG hive_obs_catalog PROPERTIES (
     'type'='hms',
     'hive.version' = '3.1.0',
     'hive.metastore.uris' = 'thrift://192.168.67.161: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'='主NameNode IP地址:RPC通信端口',
     'dfs.namenode.rpc-address.hacluster.25'='备NameNode IP地址:RPC通信端口',
     'dfs.client.failover.proxy.provider.hacluster'='org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider',
     'hive.metastore.kerberos.principal' = '${hive_keytab_principal}',
     'hadoop.security.authentication' = 'kerberos',
     'hadoop.kerberos.keytab' = '/home/omm/doris_keytab/doris.keytab',
     'hadoop.kerberos.principal' = '${doris_keytab_principal}',
     'java.security.krb5.conf' = '${BIGDATA_HOME}/FusionInsight_BASE_*/1_16_KerberosClient/etc/krb5.conf',
     'AWS_ACCESS_KEY' = 'AK',
     'AWS_SECRET_KEY' = 'SK',
     'AWS_ENDPOINT' = 'OBS并行文件系统的Endpoint地址',
     'AWS_REGION' = 'sa-fb-1',
     'hadoop.rpc.protection' = 'privacy'
     );
     ```
     MRS 3.3.1及之后版本：
     ```
     CREATE CATALOG hive_catalog PROPERTIES (
     'type'='hms',
     'hive.version' = '3.1.0',
     'hive.metastore.uris' = 'thrift://192.168.67.161: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'='主NameNode IP地址:RPC通信端口',
     'dfs.namenode.rpc-address.hacluster.25'='备NameNode IP地址:RPC通信端口',
     'dfs.client.failover.proxy.provider.hacluster'='org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider',
     'hive.metastore.kerberos.principal' = '${hive_keytab_principal}',
     'hadoop.security.authentication' = 'kerberos',
     'hadoop.kerberos.keytab' = '/home/omm/doris_keytab/doris.keytab',
     'hadoop.kerberos.principal' = '${doris_keytab_principal}',
     'java.security.krb5.conf' = '/opt/Bigdata/FusionInsight_BASE_8.5.0/1_16_KerberosClient/etc/krb5.conf',
     'obs.access_key' = 'AK',
     'obs.secret_key' = 'SK',
     'obs.endpoint' = 'OBS并行文件系统的Endpoint地址',
     'obs.region' = 'sa-fb-1',
     'hadoop.rpc.protection' = 'privacy'
     );
     ```
     相关参数介绍请参见[表1]。
     
   
   
   
   
4. 查询Hive表： 
   - 执行以下命令查询Catalog：
     ```
     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;
     ```
     
   
   
   
   
5. 新建或操作Hive表后，需要在Doris中执行刷新： 
   ```
   refresh catalog hive_catalog;
   ```
   
   
6. 执行以下命令与其他数据目录中的表进行关联查询： 
   ```
   SELECT h.h_shipdate FROM hive_catalog.default.htable h WHERE h.h_partkey IN (SELECT p_partkey FROM internal.db1.part) LIMIT 10;
   ```
   其中：
   - 通过**catalog.database.table**全限定的方式标识一张表，如：internal.db1.part。
   
   - 其中**catalog** 和**database** 可以省略，缺省使用当前**SWITCH** 和**US** **E**切换后的Catalog和Database。
   
   - 可以使用**INSERT INTO**命令，将Hive Catalog中的表数据，插入到Internal Catalog中的内部表，从实现导入外部数据目录数据。
   
   
   
   
 
