zoukankan      html  css  js  c++  java
  • Spark读写Hbase的二种方式对比

    一.传统方式

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

    commonSparkHbaseReadWrite_thumb[1]

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

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

    RDD6_thumb

    想用HbaseContext很简单,如上面代码所示,需要说明的是hbaseContext的hbaseScanRDD方法,这个方法返回的是一个
    (RowKey, List[(columnFamily, columnQualifier, Value)]类型的RDD,如下
     
    hbaseRDD_thumb
     
    刚开始用的挺不习惯的.还得循环取出来rowkey对应的这么多列,这里你如果对它的RDD返回类型不爽,官方很贴心的提供了另外一个方法
     
    hbaseRDD1_thumb

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

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

    hbaseContextRDD2Result_thumb

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

  • 相关阅读:
    强连通 HDU 1827
    强联通 HDU 2767 3836
    强连通 HDU 1269
    网络流 poj 2135
    强联通 poj 2762
    android20-[【转】Android的EditText自动获取焦点并弹出输入法问题]
    windows开发中的一点总结
    android19
    android18
    android17
  • 原文地址:https://www.cnblogs.com/hehheai/p/6509786.html
Copyright © 2011-2022 走看看