integrate hbase into sparkSql in fedora

本文介绍如何通过Spark进行HBase表的写入与读取操作,包括配置环境变量、编写Scala代码实现数据的写入及读取流程,并展示了实际运行结果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1 in hbase-env.sh

export JAVA_HOME=/home/jka07@int.hrs.com/software/jdk1.8.0_121

2. in hbase-site.xml

<property>
<name>hbase.zookeeper.property.dataDir</name>
<value>/data</value>
</property>
<property>
<name>hbase.rootdir</name>
<value>hdfs://hrs-hadoop:9000/hbase</value>
</property>
<property>
<name>hbase.zookeeper.quorum</name>
<value>hrs-hadoop:2181</value>
</property>
<property>
<name>hbase.cluster.distributed</name>
<value>true</value>
</property>

3 .create table in hbase

hbase(main):001:0> create 'wh_wordcount','info'
0 row(s) in 1.3690 seconds

=> Hbase::Table - wh_wordcount
hbase(main):002:0> scan 'wh_wordcount'
ROW                   COLUMN+CELL                                               
0 row(s) in 1.4810 seconds




4.WriteHBaseSpark.scala code

package com.ibeifeng.bigdata.spark
 
import org.apache.hadoop.hbase.HBaseConfiguration
import org.apache.hadoop.hbase.client.Put
import org.apache.hadoop.hbase.io.ImmutableBytesWritable
import org.apache.hadoop.hbase.mapreduce.TableOutputFormat
import org.apache.hadoop.hbase.util.Bytes
import org.apache.spark.rdd.RDD
import org.apache.spark.{SparkConf, SparkContext}
 
/**
 * 基于Scala的贷出模式 SparkCore编程模板
 *      贷出函数
 *      用户函数
 */
object WriteHBaseSpark {
 
  /**
   * 1, MAIN 函数
   */
  def main(args: Array[String]) {
    // 调用 贷出函数即可
    sparkOperation(args)(processData)
  }
 
  /**
   * 2, 贷出函数
   *    调用用户函数即可
   */
  def sparkOperation(args: Array[String])(operation: SparkContext => Unit): Unit ={
 
    // invalidate args
    if(args.length != 2){
      println("Usage <application name> <master>")
      throw new IllegalArgumentException("need tow args")
    }
 
    // Create SparkConf Instance
    val sparkConf = new SparkConf()
      // 设置应用的名称, 4040监控页面显示
      .setAppName(args(0))
      // 设置程序运行环境, local
      .setMaster(args(1))
 
    // Create SparkContext
    /**
     * -1,读取数据,创建RDD
     * -2,负责调度Job和监控
     */
    // val sc = new SparkContext(sparkConf)
    val sc = SparkContext.getOrCreate(sparkConf)
 
    try{
      // 此处调用用户函数
      operation(sc)
    }finally {
      // SparkContext Stop
      sc.stop()
    }
 
  }
 
  /**
   * 3, 用户函数
   *    user function
   *    定义了用户自己希望之星的操作(这些操作需要使用系统资源)
   */
  def processData(sc: SparkContext): Unit ={
 
    // 模拟数据
    val list = List(("hadoop", "234"), ("spark", "200"), ("hive", "156"))
 
    // Create RDD
    val rdd: RDD[(String, String)] = sc.parallelize(list)
 
    /**
     * 将RDD的数据持久化到HBase表中
     *    1, 需要将RDD的数据转换为(key,value)的格式,符合Reduce将数据插入HBase表中的格式
     */
    val keyValueRdd: RDD[(ImmutableBytesWritable, Put)] = rdd.map(tuple => {
      // Create Put Instance
      val put = new Put(Bytes.toBytes(tuple._1))   // ROWKEY
 
      // add columnFamily
      put.add(
        Bytes.toBytes("info"),
        Bytes.toBytes("count"),
        Bytes.toBytes(tuple._2)
      )
 
      // return
      (new ImmutableBytesWritable(Bytes.toBytes(tuple._1)), put)
    })
 
    /**
     * 获取配置信息,并保存数据的值HBase表
     */
    val conf = HBaseConfiguration.create()
 
    // SET OUTPUT FORMAT
    conf.set("mapreduce.job.outputformat.class",
        "org.apache.hadoop.hbase.mapreduce.TableOutputFormat")
    // SET OUTPUT TABLE
    conf.set(TableOutputFormat.OUTPUT_TABLE, "wh_wordcount")
    // SET OUPUT DIR
    conf.set("mapreduce.output.fileoutputformat.outputdir",
      "/hbase/write-count/11111")
 
    // 保存
    keyValueRdd.saveAsNewAPIHadoopDataset(conf)
 
}
 
}

hbase(main):003:0> scan 'wh_wordcount'
ROW                   COLUMN+CELL                                               
 hadoop               column=info:count, timestamp=1490144841112, value=234     
 hive                 column=info:count, timestamp=1490144841112, value=156     
 spark                column=info:count, timestamp=1490144841112, value=200     
3 row(s) in 0.0270 seconds


5. ReadHBaseSpark.scala code

package com.ibeifeng.bigdata.spark
 
import org.apache.hadoop.hbase.HBaseConfiguration
import org.apache.hadoop.hbase.client.Result
import org.apache.hadoop.hbase.io.ImmutableBytesWritable
import org.apache.hadoop.hbase.mapreduce.TableInputFormat
import org.apache.spark.rdd.RDD
import org.apache.spark.{SparkConf, SparkContext}
 
/**
 * 基于Scala的贷出模式 SparkCore编程模板
 *      贷出函数
 *      用户函数
 */
object ReadHBaseSpark {
 
  /**
   * 1, MAIN 函数
   */
  def main(args: Array[String]) {
    // 调用 贷出函数即可
    sparkOperation(args)(processData)
  }
 
  /**
   * 2, 贷出函数
   *    调用用户函数即可
   */
  def sparkOperation(args: Array[String])(operation: SparkContext => Unit): Unit ={
 
    // invalidate args
    if(args.length != 2){
      println("Usage <application name> <master>")
      throw new IllegalArgumentException("need tow args")
    }
 
    // Create SparkConf Instance
    val sparkConf = new SparkConf()
      // 设置应用的名称, 4040监控页面显示
      .setAppName(args(0))
      // 设置程序运行环境, local
      .setMaster(args(1))
 
    // Create SparkContext
    /**
     * -1,读取数据,创建RDD
     * -2,负责调度Job和监控
     */
    // val sc = new SparkContext(sparkConf)
    val sc = SparkContext.getOrCreate(sparkConf)
 
    try{
      // 此处调用用户函数
      operation(sc)
    }finally {
      // SparkContext Stop
      sc.stop()
    }
 
  }
 
  /**
   * 3, 用户函数
   *    user function
   *    定义了用户自己希望之星的操作(这些操作需要使用系统资源)
   */
  def processData(sc: SparkContext): Unit ={
    /**
     * 假设一下,读取HBase表
     *     ht_wordcount
     *     ROWKEY:
     *         主键,word
     *     列簇:
     *         info
     *     列:
     *         count
     */
    /**
     * def newAPIHadoopRDD[K, V, F <: NewInputFormat[K, V]](
          conf: Configuration = hadoopConfiguration,
          fClass: Class[F],    //
          kClass: Class[K],
          vClass: Class[V]
        ): RDD[(K, V)]
     */
    // 读取HBase配置信息,主要的还是ZK Cluster机器的配置
    val conf = HBaseConfiguration.create()
    // 设置要读取的HBase的表的名称
    conf.set(TableInputFormat.INPUT_TABLE, "wh_wordcount")
 
 
    // 从HBase表中读取数据
    val hbaseRDD: RDD[(ImmutableBytesWritable, Result)] = sc.newAPIHadoopRDD(
      conf,
      classOf[TableInputFormat],
      classOf[ImmutableBytesWritable],
      classOf[Result]
    )
 
    // 打印条数
    println("============= Count = " + hbaseRDD.count())
  }
 
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值