
# 配置Spark读取HBase表数据
#### Spark On HBase
Spark on HBase为用户提供了在Spark SQL中查询HBase表，通过Beeline工具为HBase表进行存数据等操作。通过HBase接口可实现创建表、读取表、往表中插入数据等操作。
1. 登录Manager界面，选择"集群 \> *待操作集群的名称* \> 集群属性"查看集群是否为安全模式。
   
   - 是，执行[2]。
   
   - 否，执行[5]。
   
   
   
   
2. 选择"集群 \> *待操作集群的名称* \> 服务 \> Spark2x \> 配置 \> 全部配置 \> JDBCServer2x \> 默认"，修改以下参数：
   
   表1参数列表1 
   | 参数                                            | 默认值   | 修改结果 |
   |:---|:---|:---|
   | spark.yarn.security.credentials.hbase.enabled | false | true |
      
   ![](https://support.huaweicloud.com/cmpntguide-mrs/public_sys-resources/note_3.0-zh-cn.png)
   为了保证Spark2x可以长期访问HBase，建议不要修改HBase与HDFS服务的以下参数：
   - dfs.namenode.delegation.token.renew-interval
   
   - dfs.namenode.delegation.token.max-lifetime
   
   - hbase.auth.key.update.interval
   
   - hbase.auth.token.max.lifetime（不可修改，固定值为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参数列表2 
   | 参数                                            | 默认值   | 修改结果 |
   |:---|:---|:---|
   | spark.yarn.security.credentials.hbase.enabled | false | true |
      
   
   
4. 重启Spark2x服务，配置生效。 
   ![](https://support.huaweicloud.com/cmpntguide-mrs/public_sys-resources/note_3.0-zh-cn.png)
   如果需要在Spark2x客户端用Spark on HBase功能，需要重新下载并安装Spark2x客户端。
   
   
5. 在Spark2x客户端使用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*
      **");**
      ![](https://support.huaweicloud.com/cmpntguide-mrs/public_sys-resources/note_3.0-zh-cn.png)
      - 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
Spark on HBaseV2为用户提供了在Spark SQL中查询HBase表，通过Beeline工具为HBase表进行存数据等操作。通过HBase接口可实现创建表、读取表、往表中插入数据等操作。
1. 登录Manager界面，选择"集群 \> *待操作集群的名称* \> 集群属性"查看集群是否为安全模式。
   
   - 是，执行[2]。
   
   - 否，执行[5]。
   
   
   
   

2. 选择"集群 \> *待操作集群的名称* \> 服务 \> Spark2x \> 配置 \> 全部配置 \> JDBCServer2x \> 默认"，修改以下参数：
   
   表3参数列表1 
   | 参数                                            | 默认值   | 修改结果 |
   |:---|:---|:---|
   | spark.yarn.security.credentials.hbase.enabled | false | true |
      
   ![](https://support.huaweicloud.com/cmpntguide-mrs/public_sys-resources/note_3.0-zh-cn.png)
   为了保证Spark2x可以长期访问HBase，建议不要修改HBase与HDFS服务的以下参数：
   - dfs.namenode.delegation.token.renew-interval
   
   - dfs.namenode.delegation.token.max-lifetime
   
   - hbase.auth.key.update.interval
   
   - hbase.auth.token.max.lifetime（不可修改，固定值为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 \> 默认"，修改以下参数： 
   表4参数列表2 
   | 参数                                            | 默认值   | 修改结果 |
   |:---|:---|:---|
   | spark.yarn.security.credentials.hbase.enabled | false | true |
      
   
   
4. 重启Spark2x服务，配置生效。 
   ![](https://support.huaweicloud.com/cmpntguide-mrs/public_sys-resources/note_3.0-zh-cn.png)
   如果需要在Spark2x客户端用Spark on HBase功能，需要重新下载并安装Spark2x客户端。
   
   
5. 在Spark2x客户端使用spark-sql或者spark-beeline连接，可以查询由Hive on HBase所创建的表，支持通过SQL命令创建HBase表或创建外表关联HBase表。具体见下面说明。下面以HBase表table1为例说明。
   
   1. 通过spark-beeline工具创建表的语法命令如下： **create table** *hbaseTable*1
      **(** *id string,* *name string,* *age int* **)**
      **using org.apache.spark.sql.hbase.HBaseSource** **V2**
      **options(**
      **hbaseTableName** *"table2"* **,**
      **keyCols** *"* *id* *"* **,**
      **colsMapping "** *name=* *cf1.cq1* *,* *age=* *cf1.cq2* **");**
      ![](https://support.huaweicloud.com/cmpntguide-mrs/public_sys-resources/note_3.0-zh-cn.png)
      - 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中查询数据，*hbaseTable* 1为对应的spark表名，命令如下：
      **select \* from** *hbaseTable* *1;*
      
   
   
   
   
 
#### 相关文档
Spark从HBase表读取数据开发样例程序请参考[Spark从HBase读取数据再写入HBase样例程序](https://support.huaweicloud.com/devg-lts-mrs/mrs_07_200084.html)。
