
# Spark从Hive读取数据再写入HBase样例程序开发思路
#### 场景说明
假定Hive的person表存储用户当天消费的金额信息，HBase的table2表存储用户历史消费的金额信息。
现person表有记录name=1,account=100，表示用户1在当天消费金额为100。
table2表有记录key=1,cf:cid=1000，表示用户1的历史消息记录金额为1000。
基于某些业务要求，要求开发Spark应用程序实现如下功能：
根据用户名累计用户的历史消费金额，即用户总消费金额=100(用户当天的消费金额) + 1000(用户历史消费金额)。
上例所示，运行结果table2表用户key=1的总消费金额为cf:cid=1100。
#### 数据规划
在开始开发应用前，需要创建Hive表，命名为person，并插入数据。同时，创建HBase table2表，用于将分析后的数据写入。
1. 将原日志文件放置到HDFS系统中。 
   1. 在本地新建一个空白的log1.txt文件，并在文件内写入如下内容：
      ```
      1,100
      ```
      
   
   2. 在HDFS中新建一个目录/tmp/input，并将log1.txt文件上传至此目录。
      1. 在Linux系统HDFS客户端使用命令*hadoop fs -mkdir /tmp/input*（hdfs dfs命令有同样的作用），创建对应目录。
      
      2. 在Linux系统HDFS客户端使用命令*hadoop fs -put* *log1.txt /tmp/input*，上传数据文件。
       
   
   
   
   
2. 将导入的数据放置在Hive表里。 
   首先，确保JDBCServer已启动。然后使用Beeline工具，创建Hive表，并插入数据。
   1. 执行如下命令，创建命名为person的Hive表。 create table person
      (
      name STRING,
      account INT
      )
      ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' ESCAPED BY '\\' STORED AS TEXTFILE;
      
   
   2. 执行如下命令插入数据。 load data inpath '/tmp/input/log1.txt' into table person;
      
   
   
   
   
3. 创建HBase表。 
   确保JDBCServer已启动，然后使用Spark-beeline工具，创建HBase表，并插入数据。
   1. 执行如下命令，创建命名为table2的HBase表。 create table table2
      (
      key string,
      cid string
      )
      using org.apache.spark.sql.hbase.HBaseSource
      options(
      hbaseTableName "table2",
      keyCols "key",
      colsMapping "cid=cf.cid");
      
   
   2. 通过HBase插入数据，执行如下命令。 put 'table2', '1', 'cf:cid', '1000'
      
   
   
   
   
 
#### 开发思路
1. 查询Hive person表的数据。
2. 根据person表数据的key值去table2表做查询。
3. 把前两步相应的数据记录做相加操作。
4. 把上一步骤的结果写到table2表。
 
#### 打包项目
1. 通过IDEA自带的Maven工具，打包项目，生成jar包。具体操作请参考[在Linux环境中编包并运行Spark程序](https://support.huaweicloud.com/devg3-mrs/mrs_07_410123.html)。
2. 将打包生成的jar包上传到Spark客户端所在服务器的任意目录（例如" /opt/female/" ）下。
![](https://support.huaweicloud.com/devg3-mrs/public_sys-resources/note_3.0-zh-cn.png)
运行样例程序前，需要在Spark客户端的"spark-defaults.conf"配置文件中将配置项"spark.yarn.security.credentials.hbase.enabled"设置为"true"（该参数值默认为"false"，改为"true"后对已有业务没有影响。如果要卸载HBase服务，卸载前请将此参数值改回"false"）。
#### 运行任务
进入Spark客户端目录，调用bin/spark-submit脚本运行代码，运行命令分别如下（类名与文件名等请与实际代码保持一致，此处仅为示例）：
- 运行Java或Scala样例代码
  - **bin/spark-submit --class** *com.huawei.bigdata.spark.examples.SparkHivetoHbase* **--master yarn --deploy-mode client** */opt/female/SparkHivetoHbase-1.0.jar*
   
- 运行**Python** 样例程序
  ![](https://support.huaweicloud.com/devg3-mrs/public_sys-resources/note_3.0-zh-cn.png)
  - 由于pyspark不提供Hbase相关api，本样例使用Python调用Java的方式实现。将所提供 Java代码使用maven打包成jar，并放在相同目录下，运行python程序时要使用--jars把jar包加载到classpath中。
   
  - **bin/spark-submit --master yarn --deploy-mode client** **--jars** */opt/female/SparkHivetoHbasePythonExample/SparkHivetoHbase-1.0.jar* */opt/female/SparkHivetoHbasePythonExample/SparkHivetoHbasePythonExample.py*
   
 
