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了.


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM