都知道資料倉儲現在一般來說是hive和kafka,資料平台目前還使用的是hive,但是hive的查詢是很慢的,所以為了效率我們引入了kylin,kylin並沒有大資料儲存功能,它所做的只是將資料倉儲裡的資料預計算,然後存入到hbase中,查詢的時候,給我們提供途徑,在不需要直接操作hbase的情況下,讀取hbase中的資料。那麼問題來了! 都是大資料,你hbase憑什麼比我hive快?
那好,我們先拋下為啥hbase快,先說說hive慢的問題。
既然hive在速度方面都比不了mysql,就讓他往後稍稍吧。
可能這時候又有同學跳出來:
「哎呦!!!那hbase這麼快,還用mysql幹啥?直接替代它啊!!!咱全換hbase吧!!」
那redis還快呢,mongodb也快!hbase快,但是hbase也是nosql,它並不能支援複雜的查詢條件,比如模糊查詢,範圍查詢。。。emmmmm,最主要的一點他甚至連條件查詢都不行。
「啊?條件查詢都不行?這東西這麼垃圾???那還用它幹啥?」
「其本身的確不能直接條件查詢,但是經過使用者良好的行鍵設計,是可以實現條件查詢的,只不過要求使用者對hbase非常之熟悉,而且成本也比較大。現在有工具相當於能直接幫我們做這些行鍵設計。甚至直接可以使用範圍查詢!比如kylin就是幫我們做了複雜的工作。」
客戶端直接定位到hregion server伺服器,然後在伺服器的region上查詢要匹配的資料,而且這些資料是cache快取的。
hbase會將資料儲存到記憶體裡,但是記憶體畢竟不會幫我們一直存資料,它把這些資料有序的排列在hfile中。hfile中的內容也是有序的,每當成功儲存,記憶體裡的資料就會被清理。
hfile的資料是分頁儲存的,合併寫入會產生新的結果塊,最終多個塊合併,最後就成了樹的結構。
我先跑個題:
lms樹相比較於b+樹是犧牲了部分的讀效能,大幅度的提高了寫效能。因為是批量儲存,所以規避了磁碟隨機寫入的問題。其中的原理就如上文:把一棵大樹拆分成n棵小樹,首先存入記憶體,隨著小樹的增長,記憶體裡的小樹會flush到磁碟,磁碟裡的樹又定期的merge,最後成為大樹,優化讀效能。思想就是:將對資料的修改增量的保持在記憶體裡。
回到主題中:
經歷了多次的刷寫之後會產生很多小檔案,後台執行緒會合併他們,這樣的話磁碟查詢會限制在少量的資料儲存檔案中。habse寫入快是因為它並不是真的立即寫入檔案中,而是先寫入記憶體,隨後非同步刷進hfile。而且是順序寫入而不是隨機寫入,所以速度就很穩定,就保持穩定的同時,加快了速度。由於hbase是lms樹結構,所以磁碟讀取很快,但是尋找磁軌的速度就慢很多。但是hbase的讀取是從快取開始的,先查快取,沒查到再去記憶體查詢,都沒查到才會載入hfile,由於節省了尋道的開銷,hfile也很快,hbase 就很快了。
只要明確了rowkey,就節省了尋道的時間,快速定位rowkey就實現了快速查詢,kylin在預計算的時候就是把資料構件好,然後分配乙個rowkey,存入hbase中的,我們查詢的時候拿著rowkey去查自然就很快。
菜鳥部落格第一彈
隨著乙個多月的大學生活結束,今天終於開始了畢業的第一天工作。請了40多天的假,本來以為工作會悲劇的。但到公司同事和領導的關心使我擔心的小心感到了溫暖。早就想實現這個計畫,想在正式工作的時候寫部落格,也就是想記錄下每天的工作和每天的心情。寫博主要是記下這剛開始艱苦的歲月,不求對別人幫助,本人是菜鳥,歡...
oracle學習第一彈
每當我們建立資料庫例項的時候,就會自動的建立三個使用者 sys使用者 超級管理員,許可權最大 system使用者 系統管理員 scott使用者 普通使用者 有三種方式登入oracle資料庫 1.命令列sqlplus 2.sql developer 3.企業管理器,通過web訪問 sql plus是o...
日常翻譯 第一彈
第一題鏈結 題意 夏洛克和華生正在玩乙個遊戲 nim 這個遊戲有n堆石子被標註成piles1,piles2,pilesn n是石子最大堆數 夏洛克總是第乙個,華生跟他交替進行操作 在每一次操作中都有且只有兩種可能的情況 1.選擇一堆並且從中拿走k個石子,k 0 2.從每一堆石子中都拿走k個石子,k ...