知識布局-spark讀取hbase解析
目錄
1.前言
2.hadoop抽象類InputFormat
3.hbase的具體實現
4總結
1.前言
使用spark讀取hbase的數據,是在分析數據的時候經常發生的場景。我也做過幾次。今天來進行一下簡單的分析。
假設我有一個三台機器的集群。一台做namenode,兩台datanode。如圖:
假設我用一個hbase表,名稱為tableA,tableA有三個region。如圖:
整體情況如圖:
進一步,假設region01隻有一個hfile,存在hdfs上面,名稱就是hfile01,有兩個block,分別是block01和block02。再次假設,hdfs有兩個副本,使用r_block01和r_block02表示。
現在,我們想使用spark讀取tableA的數據,如何讀取呢?
2.hadoop抽象類InputFormat
我們先看看一些基礎知識。
hadoop提供了讀取hdfs的抽象類InputFormat。
這是getSplits方法的注釋:
這是createRecordReader的注釋:
我這裡就簡單概括下:
getSplits方法是用來拿到數據的描述信息,他告訴我們數據分了多少片,這些片的數據都在哪裡,他的長度信息等等。
createRecordReader方法是用來獲取getSplits方法得到的數據分片上面的閱讀器。
也就是說我們想要讀取tableA的數據,我們需要知道
1.tableA分了多少片,這些片的地址都是多少,等等信息
2.我們需要獲取到這些片上面的閱讀器
剛剛那些都是抽象方法,並沒有實現。要實現讀取tableA話,我們就需要實現InputFormat中的這兩個抽象方法。
3.hbase的具體實現
在hbase的代碼中,我們發現了TableInputFormatBase,以及TableInputFormat。他們的關係如下(本文只關心getSplits和createRecordReader兩個方法):
我們發現這樣的情況
在hbase中tableA以rowkey為水平切分,分成了region01,region02,region03。假設region01,region02和region03依次增長,根據hbase的rowkey的ranked的特性,我們可以得到下面的切分:
那麼那個getSplits的返回值,我們就可以這麼定義
list={region01,region02,region03}
然後在region01,region02和region03上面分別創建reader就好了。
詳細的情況,我們可以閱讀java代碼,就可以瞭然於胸了。
4.總結
不懂代碼,我們將做不了太多的事情,尤其是在大數據的一些基礎知識的學習上面。
推薦閱讀:
※產品經理:一張表格理思路,行為數據打輔助
※我們每天面對的屏幕正悄悄改變世界
※天元數據網線上零售數據成為新消費時代零售業勝負手
※大數據產業即將破萬億之際,浪潮天元數據在全力做一件事
※大數據雙創行動計劃丨校車的智慧在哪裡?