你好,游客 登录 注册 搜索
背景:
阅读新闻

Spark读写Hbase的二种方式对比

[日期:2017-01-13] 来源:博客园精华区  作者: [字体: ]

  一.传统方式

  这种方式就是常用的TableInputFormat和TableOutputFormat来读写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包的工具类,因此可以拿过来直接用

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

  想用HbaseContext很简单,如上面代码所示,需要说明的是hbaseContext的hbaseScanRDD方法,这个方法返回的是一个

  (RowKey, List[(columnFamily, columnQualifier, Value)]类型的RDD,如下

  刚开始用的挺不习惯的.还得循环取出来rowkey对应的这么多列,这里你如果对它的RDD返回类型不爽,官方很贴心的提供了另外一个方法

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

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

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

 

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





收藏 推荐 打印 | 录入:elainebo | 阅读: