
# 添加Iceberg数据源
#### 操作场景
HetuEngine支持查询Iceberg v1/v2类型表数据。本章节指导用户在HSConsole界面配置Iceberg类型数据源。
#### 前提条件
- 创建Iceberg数据源的代理用户，该代理用户为人机用户且需拥有hive组，创建用户可参考[创建HetuEngine权限角色](https://support.huaweicloud.com/cmpntguide-lts-mrs/mrs_01_1714.html)。
- 在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_1714.html)。
- 数据源所在集群与HetuEngine集群的时间需保持一致。
 
#### 约束与限制
本章节仅适用于MRS 3.6.0-LTS及之后版本。
#### 操作步骤
1. 获取Iceberg数据源集群的"hdfs-site.xml"，"core-site.xml"配置文件。
   
   1. 登录Iceberg数据源所在集群的Manager页面。
   
   2. 在"主页"右上方单击"下载客户端"，根据界面提示下载"完整客户端"文件到本地。
   
   3. 将下载的客户端文件压缩包解压，获取"FusionInsight_Cluster_1_Services_ClientConfig/HDFS/config"路径下的"core-site.xml"和"hdfs-site.xml"。 若对接的Iceberg数据源集群和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. 获取Iceberg数据源的代理用户的"user.keytab"和"krb5.conf"文件。
   
   1. 登录Iceberg数据源所在集群的Manager页面。
   
   2. 选择"系统 \> 权限 \> 用户"。
   
   3. 选择对应的数据源用户，在"操作"列中选择"更多 \> 下载认证凭据"。 Iceberg数据源的代理用户需至少关联"hive"用户组。
      
   
   4. 从下载的文件中解压后获取"user.keytab"和"krb5.conf"文件。
   
   
   
   
3. 获取Metastore URL和服务端Principal。
   
   1. 获取Iceberg数据源所在集群客户端文件压缩包解压路径下的"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界面，选择"集群 \> 服务 \> HetuEngine"，进入HetuEngine服务页面。
5. 在"概览"页签下的"基本信息"区域，单击"HSConsole WebUI"后的链接，进入HSConsole界面。
6. 选择"数据源"，单击"添加数据源"。在"添加数据源"页面填写参数。 
   1. 配置"基本配置"，填写数据源名称，"数据源类型"选择"Iceberg"。
   
   2. 配置"Iceberg配置"，参数配置请参考[表1]。
       表1Iceberg配置 
      | 参数          | 描述                                                                                                                                                                                   | 取值样例      |
      |:---|:---|:---|
      | hdfs-site文件 | 在本地选择[1]获取的"hdfs-site.xml"配置文件，文件名固定。                                                                                     | -         |
      | core-site文件 | 在本地选择[1]获取的"core-site.xml"配置文件，文件名固定。                                                                                     | -         |
      | krb5文件      | 开启安全模式时填写此参数。 Kerberos认证用到的配置文件，在本地选择[2]获取的"krb5.conf"文件。 | krb5.conf |
         
      
   
   3. 配置"Metastore配置"，参数配置请参考[表2]。
       表2Metastore配置 
      | 参数            | 描述                                                                                                                                                                                                                                                                                      | 取值样例                                                                              |
      |:---|:---|:---|
      | Metastore URL | 数据源的Metastore的URL。获取方法请参考[3]。                                                                                                                                                                                               | thrift://192.168.1.1:21088,thrift://192.168.1.11:21088,thrift://192.168.1.2:21088 |
      | 安全认证机制        | 打开安全模式后自动默认为KERBEROS。                                                                                                                                                                                                                                                                   | KERBEROS                                                                          |
      | 服务端Principal  | 开启安全模式时填写此参数。 meta访问metastore带域名的用户名。获取方法请参考[3]。                                                                                                               | hive/hadoop.hadoop.com@HADOOP.COM                                                 |
      | 客户端Principal  | 开启安全模式时填写此参数。 格式为：*访问metastore的用户名* @*域名大写*.COM。 *访问metastore的用户名* ：[2]中获取的"user.keytab"文件所属的用户。 | admintest@HADOOP.COM                                                              |
      | keytab文件      | 开启安全模式时填写此参数。 连接metastore用户名的keytab凭据文件，固定名称。在本地选择[2]获取的"user.keytab"文件。                                                                                     | user.keytab                                                                       |
         
      
   
   4. （可选）修改自定义配置。
      - 单击"增加"，参考[表3]增加自定义配置参数。
      
      
       表3自定义配置 
      | 参数                                       | 描述                                                                                      | 取值样例  |
      |:---|:---|:---|
      | hive.hdfs.wire-encryption.enabled        | 若对接数据源上HDFS的"hadoop.rpc.protection"参数值为"authentication"或"integrity"时，需添加此参数，并设置值为false。 | false |
      | iceberg.register-table-procedure.enabled | 允许用户调用register_table过程。主要用于数据迁移，将已存在的iceberg表注册到元数据中，默认为false。                          | false |
         
      - 单击"删除"，可以删除已增加的自定义配置参数。
       
   
   5. 单击"确定"。
   
   
   
   
7. 登录集群客户端所在节点，执行以下命令，切换到客户端安装目录，例如安装目录为"/opt/client"，具体以实际替换。 
   ```
   cd /opt/client
   ```
   执行以下命令配置环境变量。
   ```
   source bigdata_env
   ```
   执行以下命令，进行用户认证。（集群未启用Kerberos认证（普通模式）时跳过此步骤）
   ```
   kinit HetuEngine组件操作用户
   ```
   
   
8. 执行以下命令，登录数据源的catalog。 
   ```
   hetu-cli --catalog 数据源名称 --schema 数据库名 --tenant 租户名称
   ```
   例如执行以下命令：
   ```
   hetu-cli --catalog iceberg --schema default --tenant default
   ```
   
   
9. 执行以下命令，可正常查看数据库表信息或不报错即表示连接成功。 
   ```
   show tables;
   ```
   
   
 
#### Iceberg数据类型映射
表4数据类型映射 
| Iceberg type | HetuEngine type             |
|:---|:---|
| BOOLEAN      | BOOLEAN                     |
| INT          | INTEGER                     |
| LONG         | BIGINT                      |
| FLOAT        | REAL                        |
| DOUBLE       | DOUBLE                      |
| DECIMAL(p,s) | DECIMAL(p,s)                |
| DATE         | DATE                        |
| TIME         | TIME(6)                     |
| TIMESTAMP    | TIMESTAMP(6)                |
| TIMESTAMPTZ  | TIMESTAMP(6) WITH TIME ZONE |
| STRING       | VARCHAR                     |
| UUID         | UUID                        |
| BINARY       | VARBINARY                   |
| FIXED (L)    | VARBINARY                   |
| STRUCT(...)  | ROW(...)                    |
| LIST(e)      | ARRAY(e)                    |
| MAP(k,v)     | MAP(k,v)                    |
   
#### 约束
- Iceberg数据源不支持数据源鉴权，仅支持Ranger鉴权。
- Iceberg数据源使用的指定表分区的表属性为partitioning，比如表的分区为c1和c2列，分区属性为partitioning = ARRAY\['c1', 'c2'\]。
- Iceberg数据源使用时间旅行能力根据时间戳查询表的内容时，时间戳需要晚于建表时间，但是早于当前时间。
- 本章节仅适用于MRS 3.6.0及之后版本。
 
