
# 配置Spark读取HBase表数据
#### 操作场景
Spark on HBase为用户带来了强大的数据处理与存储交互能力。借助这一技术，用户能够在Spark SQL环境下对HBase表开展查询操作，借助其强大的分布式计算能力和灵活的SQL查询语法，高效地从HBase分布式列存储系统中获取所需数据。
在数据存储方面，用户可以通过Beeline工具，方便快捷地向HBase表中存储数据。Beeline作为一种常见的SQL命令行工具，为用户提供了直观、易用的操作界面，确保数据能够顺利存入HBase表中。
此外，通过HBase接口，用户能够对HBase表进行全面的管理操作。无论是创建新表以满足特定业务需求的数据存储，还是读取已有表中的数据进行分析，或是向表中插入新的数据记录，都可以轻松实现。这种无缝集成使得Spark和HBase的优势得以充分发挥，为用户提供了一个高效、灵活的数据处理与存储解决方案。
#### Spark On HBase
1. 登录Manager界面，选择"集群 \> 集群属性"查看集群是否为安全模式。 
   - 是，执行[2]。
   
   - 否，执行[5]。
   
   
   
   
2. 选择"集群 \> 服务 \> Spark2x \> 配置 \> 全部配置 \> JDBCServer2x \> 默认"，修改以下参数：
   
   表1参数列表 
   | 参数                                            | 参数说明                                                                                                                                                                                                                                                                                             | 参数值  |
   |:---|:---|:---|
   | spark.yarn.security.credentials.hbase.enabled | 是否启用HBase验证功能。如果需要Spark-on-HBase功能，且集群为安全集群，参数值设置为true。 - true：启用HBase验证功能。  - false：关闭HBase验证功能。   | true |
      
   为了保证Spark可以长期访问HBase，建议不要修改HBase与HDFS服务的以下参数：
   - dfs.namenode.delegation.token.renew-interval：设置token renew的时间间隔。
   
   - dfs.namenode.delegation.token.max-lifetime：设置token的最大存活期。
   
   - hbase.auth.key.update.interval：HBase认证密钥的更新间隔。
   
   - hbase.auth.token.max.lifetime：设置HBase认证密钥的最大存活期，不可修改，固定值为604800000毫秒，即7天。
   
   
   如果必须要修改以上参数，请务必保证HDFS参数"dfs.namenode.delegation.token.renew-interval"的值不大于HBase参数"hbase.auth.key.update.interval"、"hbase.auth.token.max.lifetime"的值和HDFS参数"dfs.namenode.delegation.token.max-lifetime"的值。
   
   
3. 选择"SparkResource2x \> 默认"，修改以下参数： 
   表2参数列表 
   | 参数                                            | 参数说明                                                                                                                                                                                                                                                                                           | 参数值  |
   |:---|:---|:---|
   | spark.yarn.security.credentials.hbase.enabled | 是否启用HBase验证功能。如果需要Spark-on-HBase功能，且集群为安全集群，参数值设置为true。 - true：启用HBase验证功能。  - false：关闭HBase验证功能。   | true |
      
   
   
4. 重启Spark服务，配置生效。 
   如果需要在Spark客户端用Spark on HBase功能，需要重新下载并安装Spark客户端。
   
   
5. 在Spark客户端使用spark-sql或者spark-beeline连接，可以查询由Hive on HBase所创建的表，支持通过SQL命令创建HBase表或创建外表关联HBase表。建表前，确认HBase中已存在对应HBase表，下面以HBase表table1为例说明。
   
   1. 通过Beeline工具创建HBase表，命令如下：
      ```
      create table hbaseTable
      (
      id string,
      name string,
      age int
      )
      using org.apache.spark.sql.hbase.HBaseSource
      options(
      hbaseTableName "table1",
      keyCols "id",
      colsMapping  "
      name=cf1.cq1,
      age=cf1.cq2
      ");
      ```
      表3参数解释 
      | 参数                             | 参数说明                                                                                 |
      |:---|:---|
      | hbaseTable                     | 创建Spark表的表名。                                                                         |
      | id string,name string, age int | Spark表的字段名和字段类型。                                                                     |
      | table1                         | HBase表名。                                                                             |
      | id                             | HBase表的rowkey列名。                                                                     |
      | name=cf1.cq1, age=cf1.cq2      | Spark表的列和HBase表的列的映射关系。spark的name列映射HBase表的cf1列簇的cq1列，spark的age列映射HBase表的cf1列簇的cq2列。 |
         
      
   
   2. 通过csv文件导入数据到HBase表，命令如下：
      ```
      hbase org.apache.hadoop.hbase.mapreduce.ImportTsv -Dimporttsv.separator="," -Dimporttsv.columns=HBASE_ROW_KEY,cf1:cq1,cf1:cq2,cf1:cq3,cf1:cq4,cf1:cq5 table1 /hperson
      ```
      其中：table1为HBase表名，/hperson为csv文件存放的路径。
      
   
   3. 在spark-sql或spark-beeline中执行如下命令查询数据，其中hbaseTable为对应的spark表名。
      ```
      select * from hbaseTable;
      ```
      
   
   
   
   
 
#### Spark on HBaseV2
1. 登录Manager界面，选择"集群 \> 集群属性"查看集群是否为安全模式。 
   - 是，执行[2]。
   
   - 否，执行[5]。
   
   
   
   

2. 选择"集群 \> 服务 \> Spark2x \> 配置 \> 全部配置 \> JDBCServer2x \> 默认"，修改以下参数：
   
   表4参数列表 
   | 参数                                            | 参数说明                                                                                                                                                                                                                                                                                                                                                                     | 参数值  |
   |:---|:---|:---|
   | spark.yarn.security.credentials.hbase.enabled | 是否启用HBase验证功能。如果需要Spark-on-HBase功能，且集群为安全集群，参数值设置为true。 - true：启用HBase验证功能。  - false：关闭HBase验证功能。   | true |
      
   为了保证Spark可以长期访问HBase，建议不要修改HBase与HDFS服务的以下参数：
   - dfs.namenode.delegation.token.renew-interval：设置token renew的时间间隔。
   
   - dfs.namenode.delegation.token.max-lifetime：设置token的最大存活期。
   
   - hbase.auth.key.update.interval：HBase认证密钥的更新间隔。
   
   - hbase.auth.token.max.lifetime：设置HBase认证密钥的最大存活期，不可修改，固定值为604800000毫秒，即7天。
   
   
   如果必须要修改以上参数，请务必保证HDFS参数"dfs.namenode.delegation.token.renew-interval"的值不大于HBase参数"hbase.auth.key.update.interval"、"hbase.auth.token.max.lifetime"的值和HDFS参数"dfs.namenode.delegation.token.max-lifetime"的值。
   
   
3. 选择"SparkResource2x \> 默认"，修改以下参数： 
   表5参数列表 
   | 参数                                            | 参数说明                                                                                                                                                                                                                                                                                                                                                                   | 参数值  |
   |:---|:---|:---|
   | spark.yarn.security.credentials.hbase.enabled | 是否启用HBase验证功能。如果需要Spark-on-HBase功能，且集群为安全集群，参数值设置为true。 - true：启用HBase验证功能。  - false：关闭HBase验证功能。   | true |
      
   
   
4. 重启Spark服务，配置生效。 
   如果需要在Spark客户端用Spark on HBase功能，需要重新下载并安装Spark客户端。
   
   
5. 在Spark客户端使用spark-sql或者spark-beeline连接，可以查询由Hive on HBase所创建的表，支持通过SQL命令创建HBase表或创建外表关联HBase表。具体见下面说明。下面以HBase表table1为例说明。
   
   1. 通过spark-beeline工具创建表的语法命令如下：
      ```
      create table hbaseTable1
      (id string, name string, age int)
      using org.apache.spark.sql.hbase.HBaseSourceV2
      options(
      hbaseTableName "table2",
      keyCols "id",
      colsMapping  "name=cf1.cq1,age=cf1.cq2");
      ```
      表6参数解释 
      | 参数                             | 参数说明                                                                                 |
      |:---|:---|
      | hbaseTable1                    | 创建Spark表的表名。                                                                         |
      | id string,name string, age int | Spark表的字段名和字段类型。                                                                     |
      | table2                         | HBase表名。                                                                             |
      | id                             | HBase表的rowkey列名。                                                                     |
      | name=cf1.cq1, age=cf1.cq2      | Spark表的列和HBase表的列的映射关系。Spark的name列映射HBase表的cf1列簇的cq1列，Spark的age列映射HBase表的cf1列簇的cq2列。 |
         
      
   
   2. 通过csv文件导入数据到HBase表，命令如下：
      ```
      hbase org.apache.hadoop.hbase.mapreduce.ImportTsv -Dimporttsv.separator="," -Dimporttsv.columns=HBASE_ROW_KEY,cf1:cq1,cf1:cq2,cf1:cq3,cf1:cq4,cf1:cq5 table2 /hperson
      ```
      其中：table2为HBase表名，/hperson为csv文件存放的路径。
      
   
   3. 在spark-sql或spark-beeline中执行如下命令查询数据，其中hbaseTable1为对应的spark表名。
      ```
      select * from hbaseTable1;
      ```
      
   
   
   
   
 
#### 相关文档
Spark从HBase表读取数据开发样例程序请参考[Spark从HBase读取数据再写入HBase样例程序](https://support.huaweicloud.com/devg-lts-mrs/mrs_07_200084.html)。
[Spark连接HBase认证错误](https://support.huaweicloud.com/cmpntguide-mrs/mrs_01_1933.html)。
