Spark On HBase方式读取HBASE数据(HBaseContext方式)

这种方式其实是利用Cloudera-labs开源的一个HbaseContext的工具类来支持spark用RDD的方式批量读写hbase,先给个传送门大家感受下

https://github.com/cloudera-labs/SparkOnHBase/blob/cdh5-0.0.2/src/main/scala/com/cloudera/spark/hbase/HBaseContext.scala

https://issues.apache.org/jira/browse/HBASE-13992

https://issues.apache.org/jira/browse/HBASE-14160

这种方式的优势在哪儿呢,官方的解释如下

1>无缝的使用Hbase connection

2>和Kerberos无缝集成

3>通过get或者scan直接生成rdd

4>利用RDD支持hbase的任何组合操作

5>为通用操作提供简单的方法,同时通过API允许不受限制的未知高级操作

6>支持java和scala

7>为spark和 spark streaming提供相似的API

ok,由于hbaseContext是一个只依赖hadoop,hbase,spark的jar包的工具类,因此可以拿过来直接用

废话不说,直接用我调试过的代码来感受下

首先添加依赖:

 <dependency>
            <groupId>org.apache.hbase</groupId>
            <artifactId>hbase-spark</artifactId>
            <version>1.2.0-cdh5.16.1</version>
 </dependency>

文中的spark 的版本为2.3.2,hbase 的版本为1.2.6。由于hbase-spark 运用的spark 版本为1.6 而实际的spark 版本为2.3.2,所以执行spark 任务会报 没有 org.apache.spark.logging 类没有定义,这是因为 spark 2.3.2 这个类名已经改变,因此需要重新构造这个类并打成jar包放入到spark 的jar目录里即可

代码示例:

package com.zjc.spark;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.hbase.Cell;
import org.apache.hadoop.hbase.CellUtil;
import org.apache.hadoop.hbase.HBaseConfiguration;
import org.apache.hadoop.hbase.TableName;
import org.apache.hadoop.hbase.client.Result;
import org.apache.hadoop.hbase.client.Scan;
import org.apache.hadoop.hbase.io.ImmutableBytesWritable;
import org.apache.hadoop.hbase.mapreduce.TableInputFormat;
import org.apache.hadoop.hbase.spark.JavaHBaseContext;
import org.apache.hadoop.hbase.util.Bytes;
import org.apache.spark.SparkConf;
import org.apache.spark.api.java.JavaPairRDD;
import org.apache.spark.api.java.JavaRDD;
import org.apache.spark.api.java.JavaSparkContext;
import scala.Tuple2;

import java.util.List;

/**
 * Created by zjc on 2019/1/2.
 */
public class sparkApplication11 {
    public static void main1(String[] args) {
        SparkConf sconf = new SparkConf();
        sconf.setAppName("spark on hbase");
        sconf.set("spark.serializer", "org.apache.spark.serializer.KryoSerializer");
        Configuration hconf = HBaseConfiguration.create();
        hconf.set("hbase.zookeeper.quorum", "");
        JavaSparkContext spark = new JavaSparkContext(sconf);
        JavaHBaseContext jbc = new JavaHBaseContext(spark, hconf);
        Scan scan = new Scan();
        //  scan.setStartRow(Bytes.toBytes("1000"));
        //  scan.setStopRow(Bytes.toBytes("10000"));
        JavaRDD<Tuple2<ImmutableBytesWritable, Result>> pairRDD = jbc.hbaseRDD(TableName.valueOf("person"), scan);
        List<Tuple2<ImmutableBytesWritable, Result>> t = pairRDD.take(10);
        for (Tuple2 tuple2 : t) {
            ImmutableBytesWritable row = (ImmutableBytesWritable) tuple2._1;
            System.out.println(Bytes.toString(row.get()));
            Result result = (Result) tuple2._2();
            List<Cell> cells = result.listCells();
            System.out.println(Bytes.toString(CellUtil.cloneRow(cells.get(0))));
            for (Cell cell : cells) {
                System.out.println(Bytes.toString(CellUtil.cloneValue(cell)));
            }
        }
    }
}

你可能感兴趣的:(HBase)