作者:Syn良子 出处:http://www.cnblogs.com/cssdongl 转载请注明出处

一.传统方式

这种方式就是常用的TableInputFormat和TableOutputFormat来读写hbase,如下代码所示

Spark读写Hbase的二种方式对比

简单解释下,用sc.newAPIHadoopRDD根据conf中配置好的scan来从Hbase的数据列族中读取包含(ImmutableBytesWritable, Result)的RDD,

随后取出rowkey和value的键值对儿利用StatCounter进行一些最大最小值的计算最终写入hbase的统计列族.

二.SparkOnHbase方式

重点介绍第二种方式,这种方式其实是利用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

虽然这个hbase-spark的module在Hbase上的集成任务很早就完成了,但是已知发布的任何版本我还没找到该模块,不知道什么情况,再等等吧

那么问题来了,这种方式的优势在哪儿呢,官方的解释我翻译如下

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包的工具类,因此可以拿过来直接用

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

Spark读写Hbase的二种方式对比

想用HbaseContext很简单,如上面代码所示,需要说明的是hbaseContext的hbaseScanRDD方法,这个方法返回的是一个
<code>(RowKey, List[(columnFamily, columnQualifier, Value)]类型的RDD,如下</code>
<code></code> 
<code><img referrerpolicy="no-referrer" src="https://images2015.cnblogs.com/blog/1050555/201612/1050555-20161230184439601-1393243998.png"/></code>
<code></code> 
<code>刚开始用的挺不习惯的.还得循环取出来rowkey对应的这么多列,这里你如果对它的RDD返回类型不爽,官方很贴心的提供了另外一个方法</code>
<code></code> 
<code><img referrerpolicy="no-referrer" src="https://images2015.cnblogs.com/blog/1050555/201612/1050555-20161230184440679-1397215815.png"/></code>

怎么样,是不是看着很眼熟了?你可以自定义第三个参数(ImmutableBytesWritable, Result),对函数f进行自定义来返回你自己喜欢的RDD格式,

程序运行结果如下,过滤出了9:20到9:58所有的rowkey以及对应的列

Spark读写Hbase的二种方式对比

当然HbaseContext还有其他bulkGet,bulkPut,bulkDelete等,都是可以直接将hbase的操作转换成RDD,只要转成RDD了,那么rdd的这么多transform和action就可以玩的很happy了.

参考资料

https://github.com/cloudera-labs/SparkOnHBase