
# 添加Hive数据源
#### 操作场景
在数据分析场景中，用户需要通过HetuEngine同时访问集群内部和外部的Hive表进行跨源分析。由于集群外部的Hive数据源无法被直接识别，导致查询任务无法执行。本章节指导用户在HSConsole界面添加集群外部的Hive类型数据源，可实现HetuEngine对Hive表的统一访问和跨源分析。
#### Hive数据源介绍
HetuEngine服务在安装时已经将共部署（与HetuEngine在同一个Hadoop集群）的Hive数据源默认实现对接，数据源名称为"hive"，不可删除。部分默认配置不可修改，如数据源名称、数据源类型、服务端Principal、客户端Principal等。但当环境配置发生变化时，如修改了本集群的"本端域"域名，重启HetuEngine服务可以自动同步共部署Hive数据源的相关配置，如服务端Principal、客户端Principal。
- HetuEngine目前支持对接的数据格式包括：avro、text、rctext、orc、parquet、sequencefile。
- HetuEngine对接Hive数据源，不支持指定多分隔符建表，但对于在Hive数据源中指定MultiDelimitSerDe类作为序列化类来创建text数据格式的多分隔符表，可以通过HetuEngine查询，其他场景不支持。
- HetuEngine对接的Hive数据源支持Hudi表重定向功能。适用于MRS 3.3.0-LTS及之后版本。该功能支持在Hive connector访问Hudi表时重定向到Hudi connector，从而使用Hudi connector高级功能。使用该功能需提前配置目标Hudi数据源，并确保Hudi数据源与当前Hive数据源的Metastore URL一致，并在Hive数据源中配置"开启Hudi重定向"参数即可。
- HetuEngine对接的Hive数据源支持Iceberg表重定向功能。适用于MRS 3.6.0-LTS及之后版本。该功能支持在Hive connector访问Iceberg表时重定向到Iceberg connector，从而使用Iceberg connector高级功能。使用该功能需提前配置目标Iceberg数据源，并确保Iceberg数据源与当前Hive数据源的Metastore URL一致，并在Hive数据源中配置"开启Iceberg重定向"参数即可。
- 若需要使用Hive Metastore隔离功能，需要在Hive侧配置"HIVE_METASTORE_URI_HETU"，配置完成后需要重启HetuEngine服务的HSBroker实例，刷新Hive Metastore URI信息。可参考[配置组件隔离访问Hive MetaStore](https://support.huaweicloud.com/cmpntguide-lts-mrs/mrs_01_24467.html)。
 
#### 添加Hive数据源前提条件
- 数据源所在集群域名与HetuEngine集群域名不能相同。
- 数据源所在集群与HetuEngine集群节点网络互通。
- 在HetuEngine所在集群的所有节点的"/etc/hosts"文件中，添加待对接数据源所在集群的主机名称和对应的IP映射（数据源集群新扩容主机后，需要同步添加至HetuEngine所在集群的所有节点，集群外客户端需与HetuEngine集群保持一致），及其"/etc/hosts"文件中的"10.10.10.10 hadoop.*系统域名*"（如"10.10.10.10 hadoop.hadoop.com"），否则HetuEngine无法根据主机名称连接到非本集群节点。
- 已创建HetuEngine计算实例，可参考[创建HetuEngine计算实例](https://support.huaweicloud.com/cmpntguide-lts-mrs/mrs_01_1731.html)。
- MRS 3.6.0-LTS及之后版本，数据源所在集群与HetuEngine集群的时间需保持一致。
 
#### 添加Hive数据源操作步骤
1. 获取Hive数据源集群的"hdfs-site.xml"和"core-site.xml"配置文件。
   
   1. 登录Hive数据源所在集群的Manager页面。 登录集群Manager具体操作，请参考[访问MRS集群Manager](https://support.huaweicloud.com/usermanual-mrs/mrs_01_0128.html)。
      
   
   2. 在"主页"右上方单击"下载客户端"，根据界面提示下载"完整客户端"文件到本地。
   
   3. 将下载的客户端文件压缩包解压，获取"FusionInsight_Cluster_1_Services_ClientConfig/HDFS/config"路径下的"core-site.xml"和"hdfs-site.xml"文件。 若对接的Hive数据源集群和HetuEngine处于同一个Hadoop集群中，"hdfs-site.xml"和"core-site.xml"配置文件的获取方式为从HDFS中获取，参考[HDFS客户端使用实践](https://support.huaweicloud.com/cmpntguide-lts-mrs/mrs_01_1663.html)进入集群HDFS客户端，执行以下命令获取：
      ```
      hdfs dfs -get /user/hetuserver/fiber/restcatalog/hive/core-site.xml
      hdfs dfs -get /user/hetuserver/fiber/restcatalog/hive/hdfs-site.xml
      ```
      
   
   4. 查看"core-site.xml"文件中是否有"fs.trash.interval"配置项，若没有，则新增以下配置。
      ```
      <property>
      <name>fs.trash.interval</name>
      <value>2880</value>
      </property>
      ```
      
   
   5. 查看"hdfs-site.xml"文件中的"dfs.client.failover.proxy.provider.*NameService名称* "配置项，并将其值修改成"org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider"。
      以NameService名称为"hacluster"为例：
      ```
      <property>
      <name>dfs.client.failover.proxy.provider.hacluster</name>
      <value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
      </property>
      ```
      
   
   
   
   
2. 获取Hive数据源代理用户的"user.keytab"和"krb5.conf"文件。
   
   1. 登录Hive数据源所在集群的Manager页面。 登录集群Manager具体操作，请参考[访问MRS集群Manager](https://support.huaweicloud.com/usermanual-mrs/mrs_01_0128.html)。
      
   
   2. 选择"系统 \> 权限 \> 用户"。
   
   3. 选择对应的数据源用户，在"操作"列中选择"更多 \> 下载认证凭据"。
   
   4. 从下载的文件中解压后获取"user.keytab"和"krb5.conf"文件。
      ![](https://support.huaweicloud.com/cmpntguide-lts-mrs/public_sys-resources/note_3.0-zh-cn.png)
      - Hive数据源的代理用户需至少关联"hive"用户组。
      
      - 如果使用的代理用户没有"supergroup"权限，则需要参考[添加HDFS的Ranger访问权限策略](https://support.huaweicloud.com/cmpntguide-lts-mrs/mrs_01_1856.html)在Hive数据源所在集群的Ranger中为代理用户添加hdfs目录"/tmp/presto-\*"的"读"、"写"和"执行"权限。
        
   
   
   
   
3. 获取Metastore URL和服务端Principal。
   
   1. 获取Hive数据源所在集群客户端文件压缩包解压路径下的"FusionInsight_Cluster_1_Services_ClientConfig/Hive/config"下的"hive-site.xml"文件。
   
   2. 打开"hive-site.xml"文件。
      - 搜索"hive.metastore.uris"，其对应的值即为Metastore URL的值。
      
      - 搜索"hive.server2.authentication.kerberos.principal"，其对应的值即为服务端Principal的值。
       
   
   
   
   
4. 使用HetuEngine管理员用户登录Manager界面。 
   登录集群Manager具体操作，请参考[访问MRS集群Manager](https://support.huaweicloud.com/usermanual-mrs/mrs_01_0128.html)。
   
   
5. 选择"集群 \> 服务 \> HetuEngine"，进入HetuEngine服务页面。
6. 在"概览"页签下的"基本信息"区域，单击"HSConsole WebUI"后的链接，进入HSConsole界面。
7. 选择"数据源"，单击"添加数据源"。在"添加数据源"页面填写参数。 
   1. 配置"基本配置"，填写数据源名称，"数据源类型"选择"Hive"，"驱动"默认为"fi-hive-hadoop"。
   
   2. 配置"Hive配置"，参数配置请参考[表1]。
       表1Hive配置 
      | 参数          | 描述                                                                                                                                    | 取值样例      |
      |:---|:---|:---|
      | hdfs-site文件 | 在本地选择[1]获取的"hdfs-site.xml"配置文件，文件名固定。                                                                     | -         |
      | core-site文件 | 在本地选择[1]获取的"core-site.xml"配置文件，文件名固定。                                                                     | -         |
      | yarn-site文件 | 在数据源客户端Yarn/config路径下获取，只有对接Hudi数据源的时候才需要上传此文件。                                                                                       | -         |
      | krb5文件      | 集群已启用Kerberos认证（安全模式）时填写此参数。 Kerberos认证用到的配置文件，在本地选择[2]获取的"krb5.conf"文件。 | krb5.conf |
      | 开启数据源鉴权     | 集群已启用Kerberos认证（安全模式）时，选择是否同时使用Hive数据源的权限策略进行鉴权。 HetuEngine服务Ranger不启用时必须选"是"，Ranger启用后选"否"。              | 否         |
         
      
   
   3. 配置"Metastore配置"，参数配置请参考[表2]。
       表2Metastore配置 
      | 参数                                                                 | 描述                                                                                                                                                                                                                                                                                                                                                                                                                                                   | 取值样例                                                                          |
      |:---|:---|:---|
      | Metastore URL                                                      | 数据源的Metastore的URL。获取方法请参考[3]。                                                                                                                                                                                                                                                                                                                                                                                           | thrift://10.92.8.42:21088,thrift://10.92.8.43:21088,thrift://10.92.8.44:21088 |
      | 开启Hudi重定向 适用于MRS 3.3.0-LTS及之后版本       | 已配置与当前Hive数据源的Metastore URL一致的目标Hudi数据源时可配置此功能。 开启后可以在Hive connector访问Hudi表时重定向到Hudi connector，从而使用Hudi connector高级功能。                                                                                                                                                                                                                                                                                                 | 否                                                                             |
      | Hudi数据源名称 适用于MRS 3.3.0-LTS及之后版本      | 开启Hudi重定向时需配置目标Hudi数据源。 下拉框中显示所有已配置的Hudi数据源，只能选择满足Metastore URL条件的Hudi数据源。                                                                                                                                                                                                                                                                                                                                               | -                                                                             |
      | 开启Iceberg重定向 适用于MRS 3.6.0-LTS及之后版本  | 已配置与当前Hive数据源的Metastore URL一致的目标Iceberg数据源时可配置此功能。 开启后可以在Hive connector访问Iceberg表时重定向到Iceberg connector，从而能够查询Iceberg表且使用Iceberg connector高级功能。                                                                                                                                                                                                                                                                         | 否                                                                             |
      | Iceberg数据源名称 适用于MRS 3.6.0-LTS及之后版本 | 开启Iceberg重定向时需配置目标Iceberg数据源。 下拉框中显示所有已配置的Iceberg数据源，只能选择满足Metastore URL条件的Iceberg数据源。                                                                                                                                                                                                                                                                                                                                 | -                                                                             |
      | 安全认证机制                                                             | 集群已启用Kerberos认证（安全模式）时自动默认为KERBEROS。                                                                                                                                                                                                                                                                                                                                                                                                                 | KERBEROS                                                                      |
      | 服务端Principal                                                       | 集群已启用Kerberos认证（安全模式）时填写此参数。该数据源客户端"hive-site.xml"中"hive.server2.authentication.kerberos.principal"参数值。 meta访问metastore带域名的用户名。获取方法请参考[3]。                                                                                                                                                                                                                                                | hive/hadoop.hadoop.com@HADOOP.COM                                             |
      | 客户端Principal                                                       | 集群已启用Kerberos认证（安全模式）时填写此参数。 格式为：*访问Metastore的用户名* @*域名大写*。 - *访问Metastore的用户名：* [2]中获取的"user.keytab"文件所属的用户。  - 系统域名：用户可登录Manager界面，选择"系统 \> 权限 \> 域和互信"，查看"本端域"参数，即为当前系统域名，如"HADOOP.COM"。   | admintest@HADOOP.COM                                                          |
      | keytab文件                                                           | 集群已启用Kerberos认证（安全模式）时填写此参数。 连接Metastore用户名的keytab凭据文件，固定名称。在本地选择[2]获取的"user.keytab"文件。                                                                                                                                                                                                                                                                                                 | user.keytab                                                                   |
         
      
   
   4. 配置"连接池配置"，参数配置请参考[表3]。
       表3连接池配置 
      | 参数      | 描述                                                                                                                  | 取值样例 |
      |:---|:---|:---|
      | 是否开启连接池 | 访问Hive Metastore时是否开启连接池。                                                                                           | 是    |
      | 最大连接数   | 每个Coordinator对每个Hive Metastore的最大连接数。 默认值：50 取值范围：20-200 | 50   |
         
      
   
   5. 配置"Hive用户信息配置"，参数配置请参考[表4]。
      "Hive用户信息配置"与"HetuEngine-Hive用户映射配置"搭配使用，HetuEngine在对接Hive数据源时，通过用户映射，使得HetuEngine的用户具备与Hive数据源被映射的用户访问Hive数据源时同样的权限。可以多个HetuEngine用户对应一个Hive用户。
       表4Hive用户信息配置 
      | 参数               | 描述                                                                                                                  |
      |:---|:---|
      | Data Source User | 数据源用户信息。 如果配置了数据源用户为hiveuser1，那么必须有映射到hiveuser1的HetuEngine用户。例如创建hetuuser1映射到hiveuser1。 |
      | keytab文件         | 获取该数据源对应用户的认证凭据。                                                                                                    |
         
      
   
   6. （可选）配置"HetuEngine-Hive用户映射配置"，参数配置请参考[表5]。
       表5HetuEngine-Hive用户映射配置 
      | 参数               | 描述                                                                    |
      |:---|:---|
      | HetuEngine User  | HetuEngine用户信息。                                                       |
      | Data Source User | 数据源用户信息。如hiveuser1（[表4]中配置的数据源用户）。 |
         
      
   
   7. （可选）修改自定义配置。
      - 单击"增加"，参考[表6]增加自定义配置参数。
         表6自定义配置 
        | 参数                                      | 描述                                                                                                                                                                                                                                                                                                                           | 取值样例                                |
        |:---|:---|:---|
        | hive.metastore.connection.pool.maxTotal | 连接池可创建的最大连接数。 默认值：50 取值范围：20\~200                                                                                                                                                                                                                            | 50                                  |
        | hive.metastore.connection.pool.maxIdle  | 连接池最大空闲线程数，当空闲线程达到最大值时不会释放新的线程。 默认值：8 取值范围：0\~200，不能超过最大连接数                                                                                                                                                                                                          | 8                                   |
        | hive.metastore.connection.pool.minIdle  | 连接池最小空闲线程数，此时线程池不会创建新的线程。 默认值：0 取值范围：0\~200，不能超过hive.metastore.connection.pool.maxIdle的值                                                                                                                                                                           | 0                                   |
        | hive.rcfile.time-zone                   | 将二进制编码的时间戳值调整到特定的时区。 当Table存储格式为RCBINARY或者RCFILE时，HetuEngine侧插入的timestamp类型数据在Hive 3.1.0及以后版本的查询结果会比HetuEngine侧早8个小时，此时需要配置为UTC。 默认值：JVM default（即从JVM里获取本地时区）                                                                                                      | UTC                                 |
        | hive.orc.use-column-names               | 是否按照列名方式访问ORC存储文件： - true：是  - false（默认值）：否                                                                                        | false                               |
        | hive.parquet.use-column-names           | 是否按照列名方式访问PARQUET存储文件： - true：是  - false（默认值）：否                                                                                              | false                               |
        | hive.hdfs.wire-encryption.enabled       | 若对接数据源上HDFS的"hadoop.rpc.protection"参数值为"authentication"或"integrity"时，需添加此参数，并设置值为false。                                                                                                                                                                                                                                      | false                               |
        | hive.strict-mode-restrictions           | 可设置如下约束条件限制用户查询： - NONE：没有约束  - DISALLOW_EXCEEDED_SCAN_ON_PARTITION（默认值）：不允许单Hive分区表扫描最大分区数大于hive.max-partitions-per-scan参数值   | DISALLOW_EXCEEDED_SCAN_ON_PARTITION |
        | hive.ignore-absent-partitions           | 查询是否忽略分区下是否有文件丢失。 - true：允许查询分区下存在文件丢失的情况  - false：不允许查询分区下存在文件丢失的情况，会直接报错（手动对接数据源时，不填则默认为该值）                                        | true                                |
        | hive.metastore.uri.shuffle.enabled      | 并发访问MetaStore时，支持负载均衡，而不是只优先选择第一个可用的MetaStore地址。 - true：是  - false（默认值）：否                                                             | false                               |
        | hive.use.enhanced.csv.reader            | 增强CSV读取能力，支持识别文件中的换行符、支持创建VARCHAR之外的数据类型。 - true：是  - false（默认值）：否                                                                    | false                               |
        | hive.non-managed-table-writes-enabled   | 允许对外表进行INSERT、UPDATE、DELETE等写操作。 - true：是  - false（默认值）：否   CSV存储格式的外表使用ALTER TABLE时，需要配置该参数。                                   | false                               |
           
        ![](https://support.huaweicloud.com/cmpntguide-lts-mrs/public_sys-resources/note_3.0-zh-cn.png)
        CSV能力增强特性说明：
        - 支持的数据类型：VARCHAR、BIGINT、SMALLINT、DOUBLE、TIMESTAMP、DATE、BOOLEAN、DECIMAL、ARRAY。
        
        - CSV表格式约束与限制：
          - 支持的语法：CREATE TABLE、CREATE VIEW、CREATE MATERIALIZED VIEW、ALTER TABLE、DROP TABLE、CALL system.sync_partition_metadata。
          
          - 不支持的语法：CREATE TABLE AS、INSERT、DELETE、UPDATE、TRUNCATE、LOAD。
           
        
        - ALTER TABLE仅支持RENAME、ADD COLUMN、DROP COLUMN、RENAME COLUMN、ADD PARTITION、DROP PARTITION操作。
          - CSV不具备SCHEMA演进能力，操作中间列会使元数据顺序与数据不一致，导致查询失败或数据不符合预期。
          
          - 使用ALTER TABLE时，需要配置数据源自定义参数**hive.non-managed-table-writes-enabled**。
           
        
        - ARRAY类型仅支持ARRAY\<string\>，当数据列包含ARRAY类型时，数据列列数不得大于1。若为分区表，分区列可以支持其他数据类型。
        
        - 仅支持UTF-8编码，Excel默认编码通常不是UTF-8编码，转成CSV格式时，请转成UTF-8编码存储，避免查询出现乱码。
        
        - CSV文件的空行处理：被引号包含时，视为数据中的普通换行。未被引号包含时，视为脏数据，做跳过处理。在标准CSV中，表示空的数据行，请使用若干数量的逗号表示，如：",,,,,,,,"。
        
        - 仅支持通过建立外表方式查询已存在的CSV数据，不涉及使用Hetu写CSV数据。
          
      
      - 单击"删除"，可以删除已增加的自定义配置参数。
        ![](https://support.huaweicloud.com/cmpntguide-lts-mrs/public_sys-resources/note_3.0-zh-cn.png)
        - 以上自定义配置项，均可通过增加"coordinator."和"worker."前缀分别对Coordinator和Worker进行差异化配置。例如自定义添加"worker.hive.metastore.connection.pool.maxTotal"为50，表示配置Worker访问hive metastore时的最大连接数为50。若未添加前缀，则表示该配置项对Coordinator和Worker都生效。
        
        - 系统默认设置Coordinator访问hive metastore时的最大连接数为50，最大空闲连接数为8，最小空闲连接数为0，Worker访问hive metastore时的最大连接数为20，最大空闲和最小空闲连接数为0。
        
        - hive.max-partitions-per-scan：为单Hive分区表扫描最大分区个数，系统默认100000。
        
        - HetuEngine服务在安装时共部署的Hive数据源的"hive.ignore-absent-partitions"默认为"true"。
          
       
   
   8. 单击"确定"。
   
   
   
   
8. 登录集群客户端所在节点，执行以下命令，切换到客户端安装目录，例如安装目录为"/opt/client"，具体以实际替换。 
   ```
   cd /opt/client
   ```
   执行以下命令配置环境变量。
   ```
   source bigdata_env
   ```
   执行以下命令进行用户认证。（集群未启用Kerberos认证（普通模式）时跳过此步骤）
   ```
   kinit HetuEngine组件操作用户
   ```
   
   
9. 执行以下命令，登录数据源的Catalog。 
   ```
   hetu-cli --catalog 数据源名称 --schema 数据库名
   ```
   例如执行以下命令：
   ```
   hetu-cli --catalog hive_1 --schema default
   ```
   
   
10. 执行以下命令，可正常查看数据库表信息或不报错即表示连接成功。 
    ```
    show tables;
    ```
    
    
 
#### Hive数据类型映射
目前Hive数据源支持的数据类型为：BOOLEAN、TINYINT、SMALLINT、INT、BIGINT、REAL、DOUBLE、DECIMAL、NUMERIC、DEC、VARCHAR、VARCHAR（X）、CHAR、CHAR（X）、STRING、DATE、TIMESTAMP、TIME WITH TIMEZONE、TIMESTAMP WITH TIME ZONE、TIME、ARRAY、MAP、STRUCT、ROW。
#### 性能优化
- 元数据缓存 Hive连接器支持元数据缓存，以便更快地提供对各种操作的元数据请求。可参考[调整HetuEngine元数据缓存](https://support.huaweicloud.com/cmpntguide-lts-mrs/mrs_01_1746.html)。
  
- 动态过滤 开启动态过滤有助于Hive连接器的Join算子的计算优化。可参考[调整HetuEngine动态过滤](https://support.huaweicloud.com/cmpntguide-lts-mrs/mrs_01_24564.html)。
  
- 带分区条件查询 建立分区表并且查询带分区过滤条件有助于过滤部分分区数据，从而提高性能。
  
- Insert优化 通过设置"task.writer-count"的值为"1"和增大"hive.max-partitions-per-writers"的值有助于提升Insert性能。可参考[调整HetuEngine INSERT写入优化](https://support.huaweicloud.com/cmpntguide-lts-mrs/mrs_01_24506.html)。
  
 
#### 添加Hive数据源约束
- DELETE语法可以删除整个表的数据，或者分区表的指定分区。
- Hive元数据库不支持Schema重命名，即不支持ALTER SCHEMA RENAME语法。
- 不支持Hudi表的DDL、Insert、Update和Delete等操作，如需进行此类操作，请参考[使用Hudi](https://support.huaweicloud.com/cmpntguide-lts-mrs/mrs_01_24025.html)章节。
 
