知識布局-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.總結

不懂代碼,我們將做不了太多的事情,尤其是在大數據的一些基礎知識的學習上面。


推薦閱讀:

產品經理:一張表格理思路,行為數據打輔助
我們每天面對的屏幕正悄悄改變世界
天元數據網線上零售數據成為新消費時代零售業勝負手
大數據產業即將破萬億之際,浪潮天元數據在全力做一件事
大數據雙創行動計劃丨校車的智慧在哪裡?

TAG:Spark | HBase | 大數據 |