更新时间:2024-10-23 GMT+08:00

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 -putlog1.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程序
  2. 将打包生成的jar包上传到Spark客户端所在服务器的任意目录(例如“ /opt/female/” )下。

运行样例程序前,需要在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样例程序
    • 由于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