HBase之行資訊簡析

2021-09-02 10:30:08 字數 3955 閱讀 8872

這一節我們簡單介紹一下hbase的行資訊。文章前半部分會對照原始碼介紹,後面會有我自己畫的圖,大家如果對這些資訊已經比較了解了,跳過原始碼對照部分看後面的圖,加深一下印象。

下面簡單分析一下hbase中對於每一行的儲存,這個知識點至關重要,以至於會影響到我們在後面的很多流程的分析。

根據下圖,我們可以得到以下分析:

1.首先計算了keylength,讓我們來到keyvalue.getkeydatastructuresize。可以看到這裡有乙個常量key_infrastructure_size。

其中常量由以下三部分組成

row_length_size + family_length_size + timestamp_type_size

row_length_size = bytes.sizeof_short

family_length_size = bytes.sizeof_byte

timestamp_type_size = timestamp_size + type_size

timestamp_size = bytes.sizeof_long

type_size = bytes.sizeof_byte

也就是說,這裡的keyvalue.getkeydatastructuresize獲得的是一行中除value以外的總長度。

2.接下來計算了總長度,讓我們來到keyvalue.getkeyvaluedatastructuresize。

讓我們首先分析沒有tags的長度。

來看兩個公式:

1.keyvalue_infrastructure_size = row_offset

2.row_offset =

bytes.sizeof_int /*keylength*/ +

bytes.sizeof_int /*valuelength*/;

由這兩個公式我們就容易知道,這裡的key的最大長度不得大於integer.max

value的長度不得大於integer.max_value。

然後獲取了key的總長度,最後獲取了value的長度。這些就是這一行的總長度。

接著我們來分析含tags的長度。

讓我們先來看兩個公式:

keyvalue_with_tags_infrastructure_size = row_offset + tags_length_size

tags_length_size = bytes.sizeof_short

這裡的含義就是tags的總長度不得大於short.max_value。因此,其總長度的值相比沒有tags,多了乙個 bytes.sizeof_short,也多了乙個tagslength。

同樣,我們可以從下面的圖得到佐證。

其中row的長度不得大於short.max_value

family的長度不得大於byte.max_value

qualifier的長度不得大於integer.max_value - rlength - flength

也就是說row + family + qualifier的總長度不得大於integer.max_value

另外 2 + 1 + 8 + 1 + row + family + qualifier 的總長度不得大於integer.max_value

這裡的2 + 1 + 8 + 1 就是keyvalue.key_infrastructure_size

根據上面的分析我們就可以得出結論。每個cell的byte中的存放資料的規則是這樣的。

首先我們分析不含tags的長度:

2 size of the row length field in bytes

1 size of the family length field in bytes

8 size of the timestamp field in bytes

1 size of the key type field in bytes

rlength row length

flength family length

qlength qualifier length

以上的總長度為keylength

vlength value length

上面的長度為vlength

keylength vlength rlength row flength family qualifier timestamp type.getcode() value

下面我們分析含tags的長度:

上面的長度一樣,只是在後面新增了一系列與tags相關的長度

keylength vlength rlength row flength family qualifier timestamp type.getcode() value

tagslength tlen + tag.type_length_size t.gettype() tag.value ...

getkeylength獲取的是rlength row flength family qualifier timestamp type.getcode()

getvaluelength獲取的是value

也就是說這裡的總長度為

首先讓我們來看一張圖:這裡我將上面用公式描述的進行了圖形化展示。

根據上面這張圖,大家可能很容易就理解了keyvalue.createbytearray方法了。接下來我們再簡單介紹一下keytostring方法。這裡引入乙個方法tostring(),主要是為了讓大家知道上面方法的傳參,也方便我接下來的講解。

做乙個解說,這裡的row_offset我們在上面講過,是8個位元組。

也就是說在keytostring方法中bytes.toshort(b,o)獲得的是rlength。由於偏移量是8,獲取8後面的short的值,也就是上圖所示的rlength。

接下來的columnoffset容易理解,這裡就直接偏移到了family。

接著columnoffset - 1獲取的也就是flength。

這裡的columnlength稍有費解,不過根據上面的圖,還是比較簡單的,只是我在剛看的時候被蒙住了。

為了了解這裡的columnlength,我們要清楚keytostring方法中傳入的l,也就是在tostirng方法中呼叫的getkeylength()。我在上面的圖已經標出來了,包括我在上面也提到過keylength。也就是說,這裡的l就是keylength。他在減去timestamp_type_size(9個位元組,包括timestamp的8個位元組與type.getcode的乙個位元組),減去(columnoffset - o)後,獲得的值就是qlength。也就是我們常說的列名。置於方法後面的內容我就不一一描述了,相信大家看了上面的圖後就很清楚了。

很多同學可能覺得這一節並沒有什麼重要意義,其實我這裡之所以作為一節來講,是要作為乙個鋪墊,在晚上更新的《hbase之table.put客戶端流程》會提到這個流程,到時我就簡單略過,因為那個流程會比較複雜。

HBase之行資訊簡析

這一節我們簡單介紹一下hbase的行資訊。文章前半部分會對照原始碼介紹,後面會有我自己畫的圖,大家如果對這些資訊已經比較了解了,跳過原始碼對照部分看後面的圖,加深一下印象。下面簡單分析一下hbase中對於每一行的儲存,這個知識點至關重要,以至於會影響到我們在後面的很多流程的分析。根據下圖,我們可以得...

HBase架構簡談

作者的思考,建議結合 hbase權威指南 第8章一起看。1.hbase是如何保證快速讀取 以支援實時資料開發的 相比hive和hadoop的批處理 hbase在hdfs上磁碟資料結構為lsm 可以看成b樹 按rowkey有序,複雜度為log n 當然與樹節點元素數量有關 可以理解為對rowkey進行...

strtok函式簡析

官方的strtok函式,用來通過分隔字元 不支援字串,傳入的串中每個字元單獨當分隔符,如下例子組合的如123會處理1而23會被跳過 返回分隔的串的首位址 比如呼叫strtok abc123def 123456 返回值是指向abc的指標 下次要獲得 def 需要呼叫strtok null,123456...