1. 程式人生 > >Hbase與Oracle比較(列式資料庫與行式資料庫)

Hbase與Oracle比較(列式資料庫與行式資料庫)

1 主要區別

1.1、Hbase適合大量插入同時又有讀的情況

1.2、 Hbase的瓶頸是硬碟傳輸速度,Oracle的瓶頸是硬碟尋道時間。

  Hbase本質上只有一種操作,就是插入,其更新操作是插入一個帶有新的時間戳的行,而刪除是插入一個帶有插入標記的行。其主要操作是收集記憶體中一批資料,然後批量的寫入硬碟,所以其寫入的速度主要取決於硬碟傳輸的速度。Oracle則不同,因為他經常要隨機讀寫,這樣硬碟磁頭需要不斷的尋找資料所在,所以瓶頸在於硬碟尋道時間。

1.3、Hbase很適合尋找按照時間排序top n的場景

1.4、索引不同造成行為的差異。

1.5、Oracle 既可以做OLTP又可以做

OLAP,但在某種極端的情況下(負荷十分之大),就不適合了。

2 Hbase的侷限:

1、只能做簡單的Key value查詢,複雜的sql統計做不到。

2、只能在row key上做快速查詢。


3 傳統資料庫的行式儲存

    在資料分析的場景裡面,我們經常是以某個列作為查詢條件,返回的結果經常也只是某些列,不是全部的列。行式資料庫在這種情況下的I/O效能會很差,以Oracle為例,Oracle會有一個很大的資料檔案,在這個資料檔案中,劃分了很多block,然後在每個block中放入行,行是一行一行放進去,擠在一起,然後把block塞滿,當然也會預留一些空間,用於將來update。這種結構的缺點是:當我們讀某個列的時候,比如我們只需要讀紅色標記的列的時候,不能只讀這部分資料,我必須把整個block

讀取到記憶體中,然後再把這些列的資料取出來,換句話說,我為了讀表中某些列的資料,我必須把整個列的行讀完,才可以讀到這些列。如果這些列的資料很少,比如1T的資料中只佔了100M, 為了讀100M資料卻要讀取1TB的資料到記憶體中去,則顯然是不划算。

3.1 B+索引

    Oracle中採用的資料訪問技術主要是B數索引:


從樹的跟節點出發,可以找到葉子節點,其記錄了key值對應的那行的位置。

B樹的操作:

B樹插入——分裂節點

     B數刪除——合併節點

4 列式儲存


      同一個列的資料會擠在一起,比如擠在block裡,當我需要讀某個列的時候,值需要把相關的檔案或塊讀到記憶體中去,整個列就會被讀出來,這樣

I/O會少很多。

      同一個列的資料的格式比較類似,這樣可以做大幅度的壓縮。這樣節省了儲存空間,也節省了I/O,因為資料被壓縮了,這樣讀的資料量隨之也少了。 

      行式資料庫適合OLTP,反倒列式資料庫不適合OLTP


4.1 BigTableLSMLog Struct Merge)索引


     在Hbase中日誌即資料,資料就是日誌,他們是一體化的。為什麼這麼說了,因為Hbase的更新時插入一行,刪除也是插入一行,然後打上刪除標記,則不就是日誌嗎?

     在Hbase中,有Memory Store,還有Store File,其實每個Memory Store和每個Store File就是對每個列族附加上一個B+(有點像Oracle的索引組織表,資料和索引是一體化的), 也就是圖的下面是列族,上面是B+樹,當進行資料的查詢時,首先會在記憶體中memory storeB+樹中查詢,如果找不到,再到Store File中去找。

     如果找的行的資料分散在好幾個列族中,那怎麼把行的資料找全呢?那就需要找好幾個B+樹,這樣效率就比較低了。所以儘量讓每次insert的一行的列族都是稀疏的,只在某一個列族上有值,其他列族沒有值,