
# 添加HBase数据源
#### 操作场景
本章节指导用户在HSConsole界面添加HBase数据源。
#### 添加HBase数据源前提条件
- 数据源所在集群域名与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集群的时间需保持一致。
 
- 数据源所在集群与HetuEngine所在集群上ZooKeeper的SSL通信加密配置需保持一致。 登录Manager界面，选择"集群 \> 服务 \> ZooKeeper \> 配置 \> 全部配置"，搜索"ssl.enabled"，值为"true"，表示启用SSL通信加密，值为"false"表示关闭SSL通信加密。
  
#### 添加HBase数据源操作步骤
1. 获取HBase数据源的"hbase-site.xml"、"hdfs-site.xml"和"core-site.xml"配置文件。
   
   1. 登录HBase数据源所在集群的Manager页面。 登录集群Manager具体操作，请参考[访问MRS集群Manager](https://support.huaweicloud.com/usermanual-mrs/mrs_01_0128.html)。
      
   
   2. 在"主页"右上方单击"下载客户端"，根据界面提示下载"完整客户端"文件。
   
   3. 将下载的客户端文件压缩包解压，获取"FusionInsight_Cluster_1_Services_ClientConfig/HBase/config"路径下的"hbase-site.xml"、"core-site.xml"和"hdfs-site.xml"文件。
   
   
   
   
2. 获取HBase数据源的代理用户的"user.keytab"和"krb5.conf"文件。
   
   1. 登录HBase数据源所在集群的Manager页面。
   
   2. 选择"系统 \> 权限 \> 用户"。
   
   3. 选择对应的数据源用户，在"操作"列中选择"更多 \> 下载认证凭据"。 数据源的代理用户需要具有对HBase的相关操作权限。
      
   
   4. 从下载的文件中解压获取"user.keytab"和"krb5.conf"文件。
   
   
   
   
3. 使用HetuEngine管理员用户登录Manager界面，选择"集群 \> 服务 \> HetuEngine"，进入HetuEngine服务页面。
4. 在"概览"页签下的"基本信息"区域，单击"HSConsole WebUI"后的链接，进入HSConsole界面。

5. 选择"数据源"，单击"添加数据源"。在"添加数据源"页面填写参数。 
   1. 配置"基本配置"，填写数据源名称，"数据源类型"选择"HBase"。
   
   2. 配置"HBase配置"，参数配置请参考[表1]。
       表1HBase配置 
      | 参数                 | 描述                                                                                                                                                                                                                                                                                                                    | 取值样例                                                                                                                                                                                                                              |
      |:---|:---|:---|
      | 驱动                 | 默认为"hbase-connector"。                                                                                                                                                                                                                                                                                                 | hbase-connector                                                                                                                                                                                                                   |
      | ZooKeeper Quorum地址 | 该数据源ZooKeeper服务所有quorumpeer实例业务IP。 当该数据源ZooKeeper服务使用IPv6时，则需额外在ZooKeeper Quorum地址中指定客户端端口号。 登录Manager界面，选择"集群 \> 服务 \> ZooKeeper \> 实例"，可查看所有quorumpeer实例所在主机业务IP地址。                                                                                    | - IPv4：10.10.10.10,10.10.10.11,10.10.10.12  - IPv6：\[10:10::10:11\]:24002   |
      | ZooKeeper客户端端口号    | ZooKeeper客户端端口号。 登录Manager界面，选择"集群 \> 服务 \> ZooKeeper"，在"配置"页签查看"clientPort"的值。                                                                                                                                                                                                         | 2181                                                                                                                                                                                                                              |
      | HBase RPC通信保护      | 根据[1]获取的"hbase-site.xml"里配置项"hbase.rpc.protection"的值进行选择： - 为"authentication"时选择"否"。  - 为"privacy"时选择"是"。   | 否                                                                                                                                                                                                                                 |
      | 安全认证机制             | 打开安全模式后自动默认为KERBEROS。                                                                                                                                                                                                                                                                                                 | KERBEROS                                                                                                                                                                                                                          |
      | Principal          | 开启安全认证机制时填写此参数。就是[2]中获取的"user.keytab"文件所属的用户。                                                                                                                                                                                                                                          | user_hbase@HADOOP2.COM                                                                                                                                                                                                            |
      | keytab文件           | 开启安全模式时填写此参数。安全认证的密钥，在本地选择[2]获取的"user.keytab"文件。                                                                                                                                                                                                                                       | user.keytab                                                                                                                                                                                                                       |
      | krb5文件             | 开启安全模式时填写此参数。Kerberos认证用到的配置文件，在本地选择[2]获取的"krb5.conf"文件。                                                                                                                                                                                                                               | krb5.conf                                                                                                                                                                                                                         |
      | hbase-site文件       | 开启安全模式时填写此参数。连接hdfs时，需要的配置文件。在本地选择[1]获取的"hbase-site.xml"文件。                                                                                                                                                                                                                            | hbase-site.xml                                                                                                                                                                                                                    |
      | core-site文件        | 开启安全模式时填写此参数。连接hdfs时需要用到的配置。在本地选择[1]获取的"core-site.xml"文件。                                                                                                                                                                                                                              | core-site.xml                                                                                                                                                                                                                     |
      | hdfs-site文件        | 开启安全模式时填写此参数。连接hdfs时需要用到的配置。在本地选择[1]获取的"hdfs-site.xml"文件。                                                                                                                                                                                                                              | hdfs-site.xml                                                                                                                                                                                                                     |
         
      
   
   3. （可选）自定义配置。
   
   4. 单击"确定"。
   
   
   
   
6. 登录集群客户端所在节点，执行以下命令，切换到客户端安装目录，例如安装目录为"/opt/client"，具体以实际替换。 
   ```
   cd /opt/client
   ```
   执行以下命令配置环境变量。
   ```
   source bigdata_env
   ```
   执行以下命令进行用户认证。（集群未启用Kerberos认证（普通模式）时跳过此步骤）
   ```
   kinit HetuEngine组件操作用户
   ```
   
   
7. 执行以下命令，登录数据源的catalog。 
   ```
   hetu-cli --catalog 数据源名称 --schema 数据库名
   ```
   例如执行以下命令：
   ```
   hetu-cli --catalog hbase_1 --schema default
   ```
   
   
8. 执行以下命令，可正常查看数据库表信息或不报错即表示连接成功。 
   ```
   show tables;
   ```
   
   
9. 创建结构化映射表。 
   映射表建表语句格式：
   ```
   CREATE TABLE schemaName.tableName (     --schemaName必须与hbase_table_name中的hbaseNamespace一致
     rowId VARCHAR,
     qualifier1 TINYINT,
     qualifier2 SMALLINT,
     qualifier3 INTEGER,
     qualifier4 BIGINT,
     qualifier5 DOUBLE,
     qualifier6 BOOLEAN,
     qualifier7 TIME,
     qualifier8 DATE,
     qualifier9 TIMESTAMP
   )
   WITH (
   column_mapping = 'qualifier1:f1:q1,qualifier2:f1:q2,qualifier3:f2:q3,qualifier4:f2:q4,qualifier5:f2:q5,qualifier6:f3:q1,qualifier7:f3:q2,qualifier8:f3:q3,qualifier9:f3:q4',
   row_id = 'rowId',
   hbase_table_name = 'hbaseNamespace:hbaseTable',
   external = true
   );
   ```
   - 映射表建表支持：直接关联HBase数据源中的表、创建并关联HBase数据源中不存在的新表的两种形式。
   
   - 映射表字段支持的数据类型包括：VARCHAR、TINYINT、SMALLINT、INTEGER、BIGINT、DOUBLE、BOOLEAN、TIME、DATE、TIMESTAMP。
   
   - 映射表建表语句关键字说明见[表2 映射表建表语句关键字说明]。
      表2映射表建表语句关键字说明 
     | 关键字              | 类型      | 是否必填 | 默认值               | 备注                                                                                                                                                                                                                                |
     |:---|:---|:---|:---|:---|
     | column_mapping   | String  | 否    | 所有的列在同一个Family列族下 | 指定映射表中列与HBase数据源表中列族的映射关系。如果需要关联一张HBase数据源中的表，那么column_mapping必须与HBase数据源中的一致；如果创建一张HBase数据源中不存在的新表，column_mapping 由用户指定。 column_mapping格式为"映射表列名:HBase列族:HBase列名"，映射表列名必须为小写，HBase列名需要与HBase端完全一致。 |
     | row_id           | String  | 否    | 映射表的第一列           | HBase数据源中表rowkey 对应的列名。                                                                                                                                                                                                           |
     | hbase_table_name | String  | 否    | 空                 | 指定需要关联的HBase数据源上的表空间和表名，用:连接。默认表空间为default。如果创建一张HBase数据源中不存在的新表，hbase_table_name不需要指定。                                                                                                                                           |
     | external         | Boolean | 否    | true              | 如果external=true ，表示该表为HBase数据源中表的一个映射表，不支持删除HBase数据源上的原始表；如果external=false，则删除Hetu-HBase表的同时，会删除HBase数据源上的表。                                                                                                                      |
        
     
   
   
   
   
 
#### HBase数据类型映射
HBase是基于字节的分布式存储系统，它将所有数据类型存储为字节数组。要在HetuEngine中表示HBase数据，需要先在HetuEngine中通过创建映射表的方式为HetuEngine列限定符选择与HBase列限定符的值相匹配的数据类型。
目前HetuEngine列限定符支持以下数据类型：VARCHAR、TINYINT、SMALLINT、INTEGER、BIGINT、DOUBLE、BOOLEAN、TIME、DATE和TIMESTAMP。
#### 性能优化
- 谓词下推 查询支持大部分算子下推，支持的谓词条件有：=、\>=、\>、\<、\<=、!=、IN、NOT IN、IS NULL、IS NOT NULL和BETWEEN AND。
  
- 批量GET查询 批量GET即在HBase的API中将所要查询的多个Row Key封装成一个List\<Get\>，然后请求这个列表以获取数据的查询方式。该方式能避免每个Row Key都发起一次请求。
  
- HBase单表查询范围扫描优化 HBase单表查询范围扫描优化是指根据HBase的列的谓词条件尝试自动推断rowkey的起止地址，在tableScan的时候设置hbase scan起止地址从而提高访问性能。
  比如假设HBase数据表的rowkey由building_code:house_code:floor:uuid四列组成，对于查询过滤条件where building_code = '123'and house_code = '456'，HetuEngine单表查询优化会只扫描rowkey范围前缀为'123-456'的列，从而提高性能。
  开启HBase单表查询范围扫描优化的功能需要在[5.c]中添加自定义参数"hbase.rowkey.adaptive.optimization.enabled"，值为"true"。
  此外，在建表语句的建表属性中需指定rowkey的组成列和分隔字符":"。
  表3HBase的rowkey组成列和分隔字符 
  | 表属性                               | 表属性含义                    | 样例                                  |
  |:---|:---|:---|
  | row_id_construct_columns          | HBase数据表的rowkey组成列。      | building_code:house_code:floor:uuid |
  | row_id_construct_columns_terminal | HBase数据表的rowkey组成列的分隔字符。 | :                                   |
     
  例如一个由building_code:house_code:floor:uuid四列组成的rowkey的建表语句如下：
  ```
  CREATE TABLE test.table_hbase_test (
  row_id string,
  col1 string,
  col2 string,
  col3 string,
  building_code string,
  house_code string,
  floor string,
  uuid string)
  WITH (column_mapping = '
  col1:attr:col1,
  col2:attr:col2,
  col3:attr:col3,
  building_code:attr:building_code,
  house_code:attr:house_code,
  floor:attr:floor,
  uuid:attr:uuid',
  row_id = 'row_id',
  row_id_construct_columns = 'building_code:house_code:floor:uuid',
  row_id_construct_columns_terminal = ':',
  hbase_table_name='test:table_hbase_test',
  external = true)
  ```
  
- HBase多表联合查询动态过滤优化 HBase支持动态过滤优化。
  开启动态过滤功能，需先开启HBase单表查询范围扫描优化功能，然后还需要在计算实例的"coordinator.config.properties"和"worker.config.properties"参数文件中添加自定义参数"enable-dynamic-filtering"，值为"true"，可参考[4.e](https://support.huaweicloud.com/cmpntguide-lts-mrs/mrs_01_1731.html#mrs_01_1731__li135621231135216)。
  
 
#### 添加HBase数据源约束
不支持如下语法：ALTER和VIEW。
