台灣的 HBase committer 蔡嘉平 分享了如何開始貢獻 HBase 的育成懶人包,如果想要參與 Hadoop 生態系的話,這份文件絕對不能錯過!
小編也因為這份懶人包獲得在 HBase commit history 留名的一刻 (HBASE-19912) XD
---
目錄如下:
* 總要分個高低:沒有人喜歡比較,但也沒有人討厭勝利
* HBase能吃嗎?:你無法滿足每個人,正如系統無法滿足每種使用情境
* 先當個使用者:嫌貨的才會買貨、善用的才會開發
* HBase的專案結構:學習由外而內、由小至大、由淺到深
* 愛上JIRA:其實很難愛上JIRA
* HBase的版本更新:這世上只有遊戲的版本更新令人期待
* 如何快速找到議題:把你上廁所的時間都拿來看程式碼
* 如何產生patch:沒有任何東西是不需要修補的
* Jira上該有的禮節:江湖在走,基本的禮數要有
* 在開始之前你需要知道幾個名詞:跟背單字一樣,印出來壓在枕頭下面吧
* 在開始之後你需要知道幾個動作:人生就是一個指令一個動作
* 從今以後你要知道的幾個資源:謝謝大大無私的分享
---
會跟大神結緣也是因為之前遇到的 HBase region 問題,求助了 Hadoop 社群,所以才認識他。文章內的問題後來有解決,之後再另寫一篇來分享好了。
* 之前遇到的 HBase region 問題:https://www.facebook.com/kewang.information/posts/2012403362369361
* HBASE-19912:https://issues.apache.org/jira/browse/HBASE-19912
* https://github.com/apache/hbase/commit/38c8144a065bc6d330330f611ec8beaa1477a884
#hbase #apache #hadoop #hadoopcon
hbase指令 在 Kewang 的資訊進化論 Facebook 的精選貼文
TL;DR
如果發現 hbase shell 在 scan 或 count 的筆數與你預期筆數不一致的話,就 split region 看看吧。
--- 以下是前言,還真長 XD ---
最近都在忙著新版本上線,所以小編也好一陣子沒發文了。不過這幾天有個有趣的案例,想跟大家分享一下。
有在看小編文章的大概會知道我們產品的資料庫是以 HBase 建置而成的,而 HBase 最重要的組成就是 rowkey 了。若 rowkey 設計錯誤輕微可以使用 column 來救,嚴重的甚至要砍掉整筆 row,重新設計 rowkey 才能解決。
兩年前在設計某 table 的 rowkey 時,不小心忘了對 rowkey 做 salt (HBase 基礎之一,避免 scan 時產生 hotspotting),如果又沒切 region 的話 (HBase 基礎之一,避免 scan 時產生 hotspotting),這些資料在建立時都會跑到同一個 region,在 scan 的時候效能會超差。
像這種例子就算使用 column 來救也完全沒辦法,所以小編就打算把整筆 row 砍掉重新把 salt 加上去。
--- 以下是追蹤過程 ---
原 rowkey 開頭及加上 salt 之後的新 rowkey 開頭如下:
* 原:A000001、新:DNhA000001
* 原:A000002、新:dMfA000002
* 原:A000003、新:p9OA000003
* 以此類推
原 rowkey 相同 pattern (A000XXX) 的 row 有 2000 萬筆 (在 hbase shell 內使用 count 來計算 table 的資料量),所以這次 rebuild 總共會刪除原 rowkey 共 2000 萬筆,新增新 rowkey 共 2000 萬筆。
在使用 HBase 的 Java API 執行增刪 rebuild 後,在 hbase shell 使用 count 計算 table 的資料量時卻只有 900 萬筆。一開始小編還以為是 compaction 跟 flush 的問題,所以強制對 table 做了下面幾個動作,以確保資料有在 HFile 裡面正確地寫入及刪除:
* 確認資料都會刪除:compact、major_ compact
* 確認資料都會寫入:flush
但執行完後再跑一次 count 也是一樣只有 900 萬筆,所以就開始找問題點了。
後來又使用 HBase 的 exists API,確認有找到 2000 萬筆的資料。一開始小編以為是 MapReduce 的問題,因為 HBase 計算 row count 是使用 MapReduce 來執行的,但找了一堆資料都沒人說有類似問題。後來想說在 hbase shell 內使用 scan {COLUMNS => "cf:XX"} 將所有的資料都拿出來,發現也是只有 900 萬筆,所以初步排除是 MapReduce 的問題。
後來比對了新增的 rowkey 及目前 scan 出來的 rowkey,發現 scan 出來的 rowkey 只有到 GbVA000017 而已,後面的 H-Z、a-z 開頭的全部都沒出現。所以小編使用 hbase shell 的 get 指令,確認在 Java API 新增的 rowkey (A-Z、a-z 開頭的) 是否存在於 table 內,發現用 get 可以拿的到資料。討論後用 scan 加 start rowkey 試試,結果如下:
* STARTROW => "GbVA000017":只找到一筆
* STARTROW => "H":可以找到 H 之後的所有資料
看了這結果,真的覺得非常奇怪啊!!!
後來大神 Cowman Chiang 說要不要試著用 split 讓 HBase 重切 region 看看,等於是 rebuild region 的意思,因為 split 會使用字母順序切分成不同的 region,讓 row 重新分散。split 完之後再做一次 count 果然就找到 2000 萬筆資料了啊。
感恩 Cowman Chiang 讚嘆 Cowman Chiang!!!
--- 以下是結論 ---
目前看起來就是 region 發生異常,還不知道是什麼原因會造成這次事件的發生。但如果發現 scan 或 count 的筆數與你預期的內容不一致的話,就 split region 看看吧。
--- 本次追蹤使用工具 ---
* Linux: grep, cat, cut, sort, sed, comm, wc, less, head
* Java: exists, scan, get, put, BufferedReader
* hbase shell: snapshot, split, compact, major_compact, flush, restore_snapshot, scan, get, disable, enable, clone_snapshot, list_snapshots
--- 20180112 後記 ---
後來把 snapshot 還原之後,重新做了一次 rebuild 再做 count,結果還是一樣只有 900 萬筆,然後用 hbase hbck -repair 試著看看是否能把 region 修復 (有 4 個 inconsistencies),修復完後一樣是 900 萬筆。
也有同事說到會不會是資料塞太快的關係,造成 region 無法 split 完整才會發生這個問題。對於這個說法,小編也還在研究看看,有什麼進度會再分享給大家知道。
#hbase #hadoop #mapreduce #hotspotting
hbase指令 在 Kewang 的資訊進化論 Facebook 的最佳解答
最近在 oschina 看到有朋友用 golang 寫了一套 based on HBase 的即時通訊軟體(原設計是 MySQL),而 Qmi 也是基於 HBase 的即時通訊軟體。雖然小編不會寫 golang,但看 code 總還可以的,所以小編當然要來研究一下這個 tim 是如何設計 schema 的。
看起來 rowkey 就是用 HBase 的 increment 指令完成,然後再將 int 轉成 hex 後做為 rowkey。而 family 則有 n 個 (感覺就是欄位名的樣子),然後 family 為 idx 開頭的就是 foreign key。
除了 rowkey 以外,family, qualifier, value 的設計邏輯,更讓小編有點不解 Orz
* 如果 family 是 # 開頭的話 (一般是 # id),則 qualifier 為空,value 為 rowkey 的值
* 如果 family 是 idx_ 開頭,則 family 為 index,qualifier 為欄位的內容 (像是 IndexDomainUsername 的值),value 為空
* 一般欄位則 family 為欄位名稱,qualifier 為空,value 為欄位的內容 (像是 fromuser 的值)
對 HBase 設計比較了解的朋友會知道,rowkey 會影響讀寫的效能,依照 ascii 碼排序,愈分散就愈不會遇到 hotspot,但愈集中一次能取回的資料就愈多,這都是要看 scenario 決定。而 family 與 HFile 成正比,family 愈多,開的檔案愈多,一般建議不超過三個,而這裡一筆 record 就開了十幾個。另外除了 value 以外,naming 要儘量簡短。
看完之後,覺得跟這幾年小編在 HBase 上設計 schema 的原則完全不同啊。不過相信有一部分或許是為了要相容於 RDBMS 的關係,而不得不做的取捨吧 Orz
* https://www.oschina.net/news/78341/tim-1-1-0
* https://github.com/donnie4w/tim/blob/master/tim.hbase/hbaseService.go
* https://github.com/donnie4w/tim/blob/master/tim.hbase/hbasedao.go
* https://github.com/donnie4w/tim/blob/master/doc/hbaseTable.txt
#qmi #tim #hbase #golang
hbase指令 在 教學課程- 使用Azure HDInsight 中的Apache HBase - GitHub 的推薦與評價
使用Apache Hive 查詢Apache HBase · 從開啟的SSH 連線,使用下列命令啟動Beeline: · 執行下列HiveQL 指令碼以建立對應到HBase 資料表的Hive 資料表。 · 執行下列HiveQL 指令 ... ... <看更多>
hbase指令 在 30天系列Day 24 - Apache Hive 與HBase 整合應用介紹 的推薦與評價
今天要來介紹如何透過使用Hive來對HBase table進行查詢。 ... 所建立的HBase table,當在Hive CLI使用drop table指令時,HBase table 同時會被刪除。 ... <看更多>