
# 配置ClickHouse对接HDFS源文件（MRS 3.3.0-LTS及之后版本）
#### 操作场景
本章节主要介绍安全模式ClickHouse对接安全模式HDFS组件进行文件读写。对于普通模式ClickHouse对接普通模式HDFS组件，和开源社区能力保持一致。
#### 约束与限制
- 本章节仅适用于MRS 3.3.0-LTS及之后版本。
- ClickHouse集群和HDFS集群同为安全模式（开启Kerberos认证）或者同为普通模式（关闭Kerberos认证）集群。
 
#### 前提条件
- 已安装ClickHouse客户端，例如客户端安装目录为"/opt/client"。
- 在FusionInsight Manager已创建具有ClickHouse表权限和访问HDFS的权限的用户，例如：clickhouseuser。
- 在对接HDFS组件之前，需要注意首先确保HDFS中有对应的目录，ClickHouse的HDFS引擎只会操作文件不会创建或删除目录。
- 在ClickHouse访问跨集群的HDFS组件时，在HDFS所在集群通过FusionInsight Manager已创建具有访问HDFS权限的用户，例如：hdfsuser。
- 获取HDFS集群域名，登录FusionInsight Manager页面，选择"系统 \> 权限 \> 域和互信"，即可查看集群域名。
- ClickHouse不支持对接HDFS加密目录。
 
#### 对接本集群内的HDFS
1. 登录FusionInsight Manager界面，选择"集群 \> 服务 \> HDFS \> 配置 \> 全部配置"，搜索并修改参数"hadoop.rpc.protection"的值为"Authentication"，保存并重启HDFS服务。
2. 选择"系统 \> 用户"界面，选择clickhouseuser用户，选择"更多 \> 下载认证凭据"。 
   首次认证，需要先修改初始密码后再下载认证凭据文件，否则会导致安全认证失败。
   
   
3. 解压下载认证凭据，并将"user.keytab"文件改名为"clickhouse_to_hdfs.keytab"。
4. 登录ClickHouse集群FusionInsight Manager界面，选择"集群 \> 服务 \> ClickHouse \> 配置 \> 全部配置 \> ClickHouseServer（角色） \> 引擎"，单击参数"hdfs.hadoop_kerberos_keytab_file"后的"上传文件"上传[3]的认证凭据文件。添加参数"hdfs.hadoop_kerberos_principal"的值，以"用户名@域名"的方式进行设置，例如：clickhouseuser@HADOOP.COM。
   
   ![](https://support.huaweicloud.com/cmpntguide-lts-mrs/zh-cn_image_0000002061171926.png "点击放大")
   **如果ClickHouse对接的是HDFS的HA模式** ，还需要执行以下操作：
   1. 登录Manager首页，选择"集群 \> 服务 \> HDFS \> 实例"，单击任意实例名称，在"概览"界面的"配置文件"区域单击配置文件"hdfs-site.xml"。
   
   2. 从hdfs-site.xml中获取以下配置的参数值，例如HDFS配置了两个nameservice，一个是hacluster，一个是ns1，则需要获取以下配置的参数值：
      dfs.nameservices、dfs.ha.namenodes.\*、dfs.namenode.rpc-address.\*.\*、dfs.client.failover.proxy.provider.\*（值修改为"org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider"）
      - dfs.namenode.rpc-address.\*.\*参数从HDFS获取到的值，如果为主机名，需要修改为该主机名对应的业务IP。
      
      - 配置clickhouse-to-hdfs-customize自定义参数时，涉及到nameservice必须使用小写（无论HDFS集群的nameservice是否大写），例如hdfs集群的nameservice为NS1，则在clickhouse-to-hdfs-customize中配置时应该是ns1。
      
      
      参考样例如下：
      ```
      <property> 
      <name>dfs.nameservices</name> 
      <value>hacluster,ns1</value> 
      </property> 
      <property> 
      <name>dfs.namenode.rpc-address.hacluster.13</name> 
      <value>192.168.0.1:25000</value> 
      </property> 
      <property> 
      <name>dfs.namenode.rpc-address.hacluster.14</name> 
      <value>192.168.0.2:25000</value> 
      </property> 
      <property> 
      <name>dfs.ha.namenodes.hacluster</name> 
      <value>13,14</value> 
      </property>
      <name>dfs.namenode.rpc-address.ns1.16</name> 
      <value>192.168.0.3:25000</value> 
      </property> 
      <property> 
      <name>dfs.namenode.rpc-address.ns1.17</name> 
      <value>192.168.0.4:25000</value> 
      </property> 
      <property> 
      <name>dfs.ha.namenodes.ns1</name> 
      <value>16,17</value> 
      </property> 
      <property> 
      <name>dfs.client.failover.proxy.provider.ns1</name> 
      <value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value> 
      </property>
      <property> 
      <name>dfs.client.failover.proxy.provider.hacluster</name> 
      <value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value> 
      </property>
      ```
      
   
   3. 在Manager界面，选择"集群 \> 服务 \> ClickHouse \> 配置 \> 全部配置 \> ClickHouseServer（角色） \> 引擎"配置界面，在自定义配置"clickhouse-to-hdfs-customize"中添加[4.b]获取的参数值，如下图所示：
      ![](https://support.huaweicloud.com/cmpntguide-lts-mrs/zh-cn_image_0000002097090685.png "点击放大")
      
    
   
   
5. 保存并重启ClickHouse服务。
6. 以客户端安装用户，登录客户端所在节点。 
   使用集群客户端连接到ClickHouse服务端，具体请参考[ClickHouse客户端使用实践](https://support.huaweicloud.com/cmpntguide-lts-mrs/mrs_01_2345.html)。
   
   
7. 执行以下命令对接HDFS组件。 
   - 对接HDFS组件的HA模式：
     ```
     CREATE TABLE default.hdfs_engine_table (`name` String, `value` UInt32) ENGINE = HDFS('hdfs://{nameservice}/tmp/secure_ck.txt', 'TSV')
     ```
     nameservice的获取方式：
     在FusionInsight Manager首页，选择"集群 \> 服务 \> HDFS \> 管理NameService"，获取参数"NameService"的值。此处建表语句中使用的nameservice统一使用小写（无论HDFS集群是否是小写），例如HDFS集群nameservice是NS1，则此处建表语句中应该是小写ns1。
     
   
   - 对接HDFS组件的非HA模式：
     ```
     CREATE TABLE default.hdfs_engine_table (`name` String, `value` UInt32) ENGINE = HDFS('hdfs://{namenode_ip}:{dfs.namenode.rpc.port}/tmp/secure_ck.txt', 'TSV')
     ```
     表1参数解释 
     | 参数                                                | 说明                                                                                                                                                            |
     |:---|:---|
     | namenode_ip                                       | NameNode实例节点IP。 在FusionInsight Manager首页，选择"集群 \> 服务 \> HDFS \> 实例"，获取主NameNode业务IP。                                          |
     | dfs.namenode.rpc.port                             | NameNode处理所有客户端请求的RPC端口号。 在FusionInsight Manager首页，选择"集群 \> 服务 \> HDFS \> 配置 \> 全部配置"，搜索并获取参数"dfs.namenode.rpc.port"的值。     |
     | hdfs://{namenode_ip}:{dfs.namenode.rpc.port}/tmp/ | 访问的HDFS文件路径： 如果是访问的多个文件，需要指定到文件夹后边加上\*号，如：**hdfs://** *{* *namenode_ip* *}* **:** *{* *dfs.namenode.rpc.port* *}* **/tmp/**\* |
        
     
   
   
   
   
8. 数据写入操作，请参考[ClickHouse数据写入HDFS]。
 
#### 对接跨集群的HDFS
1. 登录HDFS集群FusionInsight Manager界面，选择"集群 \> 服务 \> HDFS \> 配置 \> 全部配置"，搜索并修改参数"hadoop.rpc.protection"的值为"Authentication"，保存并重启HDFS服务。
2. 登录ClickHouse集群FusionInsight Manager界面，选择"系统 \> 权限 \> 域和互信"，和HDFS集群配置集群互信，或者配置集群单边互信（只要在ClickHouse集群侧配置和HDFS集群互信即可）。
3. 登录HDFS集群FusionInsight Manager界面，选择"系统 \> 用户"界面，选择hdfsuser用户，选择"更多 \> 下载认证凭据"。
   
   首次认证，需要先修改初始密码后再下载认证凭据文件，否则会导致安全认证失败。
   
   
4. 解压下载认证凭据，将"user.keytab"文件改名为"clickhouse_to_hdfs.keytab"。
5. 登录ClickHouse集群FusionInsight Manager界面，选择"集群 \> 服务 \> ClickHouse \> 配置 \> 全部配置 \> ClickHouseServer（角色） \> 引擎"配置界面。单击参数"hdfs.hadoop_kerberos_keytab_file"后的"上传文件"上传[3]的认证凭据文件。添加参数"hdfs.hadoop_kerberos_principal"的值，以"用户名@域名"的方式进行设置，例如：hdfsuser@HDFS_HADOOP.COM。
   
   **如果ClickHouse对接的是HDFS的HA模式** ，还需要执行以下步骤：
   1. 登录HDFS集群的Manager首页，选择"集群 \> 服务 \> HDFS \> 实例"，单击任意实例名称，在"概览"界面的"配置文件"区域单击配置文件"hdfs-site.xml"。
   
   2. 从hdfs-site.xml中获取以下配置的参数值，例如HDFS配置了两个nameservice，一个是hacluster，一个是ns1，则需要获取以下配置的参数值：
      dfs.nameservices、dfs.ha.namenodes.\*、dfs.namenode.rpc-address.\*.\*、dfs.client.failover.proxy.provider.\*（值修改为"org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider"）
      - dfs.namenode.rpc-address.\*.\*参数从HDFS获取到的值，如果为主机名，需要修改为该主机名对应的业务IP。
      
      - 配置clickhouse-to-hdfs-customize自定义参数时，涉及到nameservice必须使用小写（无论HDFS集群的nameservice是否大写），例如hdfs集群的nameservice为NS1，则在clickhouse-to-hdfs-customize中配置时应该是ns1。
      
      
      参考样例如下：
      ```
      <property> 
      <name>dfs.nameservices</name> 
      <value>hacluster,ns1</value> 
      </property> 
      <property> 
      <name>dfs.namenode.rpc-address.hacluster.13</name> 
      <value>192.168.0.1:25000</value> 
      </property> 
      <property> 
      <name>dfs.namenode.rpc-address.hacluster.14</name> 
      <value>192.168.0.2:25000</value> 
      </property> 
      <property> 
      <name>dfs.ha.namenodes.hacluster</name> 
      <value>13,14</value> 
      </property>
      <name>dfs.namenode.rpc-address.ns1.16</name> 
      <value>192.168.0.3:25000</value> 
      </property> 
      <property> 
      <name>dfs.namenode.rpc-address.ns1.17</name> 
      <value>192.168.0.4:25000</value> 
      </property> 
      <property> 
      <name>dfs.ha.namenodes.ns1</name> 
      <value>16,17</value> 
      </property> 
      <property> 
      <name>dfs.client.failover.proxy.provider.ns1</name> 
      <value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value> 
      </property>
      <property> 
      <name>dfs.client.failover.proxy.provider.hacluster</name> 
      <value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value> 
      </property>
      ```
      
   
   3. 在ClickHouse集群的Manager界面，选择"集群 \> 服务 \> ClickHouse \> 配置 \> 全部配置 \> ClickHouseServer（角色） \> 引擎"配置界面，在自定义配置"clickhouse-to-hdfs-customize"中添加[5.b]获取的参数值，如下图所示：
      ![](https://support.huaweicloud.com/cmpntguide-lts-mrs/zh-cn_image_0000002061013600.png "点击放大")
      
    
   
   
6. 保存并重启ClickHouse服务。

7. 以客户端安装用户，登录客户端所在节点。 
   使用集群客户端连接到ClickHouse服务端，具体请参考[ClickHouse客户端使用实践](https://support.huaweicloud.com/cmpntguide-lts-mrs/mrs_01_2345.html)。
   
   
8. 对接HDFS组件。 
   - 对接HDFS组件的HA模式：
     ```
     CREATE TABLE default.hdfs_engine_table (`name` String, `value` UInt32) ENGINE = HDFS('hdfs://{nameservice}/tmp/secure_ck.txt', 'TSV')
     ```
     nameservice的获取方式：
     在FusionInsight Manager首页，选择"集群 \> 服务 \> HDFS \> 管理NameService"，获取参数"NameService"的值。此处建表语句中使用的nameservice统一使用小写（无论HDFS集群是否是小写），例如hdfs集群nameservice是NS1，则此处建表语句中应该是小写ns1。
     
   
   - 对接HDFS组件的非HA模式：
     ```
     CREATE TABLE default.hdfs_engine_table (`name` String, `value` UInt32) ENGINE = HDFS('hdfs://{namenode_ip}:{dfs.namenode.rpc.port}/tmp/secure_ck.txt', 'TSV')
     ```
     
   
   
   
   
9. 数据写入操作，请参考[ClickHouse数据写入HDFS]。
 
 #### ClickHouse数据写入HDFS
将ClickHouse数据写入HDFS，参考以下步骤：
例如写入HDFS的/tmp目录下的secure_ck.txt数据文件：
1. 创建HDFS引擎表： 
   ```
   CREATE TABLE hdfs_engine_table (name String, value UInt32) ENGINE=HDFS('hdfs://{namenode_ip}:{dfs.namenode.rpc.port}/tmp/secure_ck.txt', 'TSV')
   ```
   
   
2. 写入HDFS数据文件： 
   ```
   INSERT INTO hdfs_engine_table VALUES ('one', 1), ('two', 2), ('three', 3)
   ```
   
   
3. 查询HDFS数据文件： 
   ```
   SELECT * FROM hdfs_engine_table LIMIT 2
   ```
   结果如下：
   ```
   ┌─name─┬─value─┐
   │ one    │     1   │
   │ two    │     2   │
   └────┴─── ─┘
   ```
   ![](https://support.huaweicloud.com/cmpntguide-lts-mrs/public_sys-resources/caution_3.0-zh-cn.png)
   - ClickHouse通过HDFS引擎表写入数据到HDFS时，如果HDFS上数据文件不存在，会生成对应的数据文件。
   
   - ClickHouse不支持删除修改和追加写HDFS引擎表数据，只能一次性写入数据。
   
   - ClickHouse删除HDFS引擎表以后对HDFS上的数据文件没有影响。
    
   
   
 
