《HBase實戰》


對,我正在研讀這本書,今天開始,我希望我看完后能有收獲和大家分享,這個日志作為開始,勉勵自己!

對,我應該靜下心,做一些我更喜歡的事情,不能在自我陶醉中迷失!

斷斷續的看,到今天大概把這本書看完了,沒想到這本書的開始,經歷了一件令人憤怒的事情,不料,剛剛看完這本書,經歷了一件傷心的事情,足以影響人生軌跡。生活還要繼續,讀書筆記還是要寫。

不過也只能做個提綱式的總結,具體的大家還是要去看書,我的水平只能告訴大家這本書給我帶來的收獲。

1.HBase建立在Apache Hadoop和Apache Zookeeper這些分布系統之上,HBase也提供單機部署的方式,當然用的是HBase自管理的Zookeeper和linux本地的文件系統。理論上HBase可以運行在任何分布式文件系統上。

2.HBase的數據結構可以認為是一種key-value形式,其中key由行健、列族、列限定符和時間版本四個坐標唯一確定,value就是一個值。HBase理論上是一個無限高的高表,不是一個無限寬的寬表。HBase中所有數據都是作為原始數據(raw data)使用字節數組(byte[])的形式存儲的。這個keyvalue的數據庫存儲格式可以用java代碼如下表示

Map<RowKey, Map<ColumnFamily, Map<ColumnQualifier, Map<Version, Data>>>>

3.實踐中,使用HTablePool比直接使用HTable更為常見,連接池的方式

HTablePool pool = new HTablePool();
HTableInterface usersTable = pool.getTable("users");
...// work with the table
usersTable.close();

4.HBase執行寫入時會寫到兩個地方:預寫日志(write-ahead log,也稱HLog)和MemStore。只有兩個地方都返回寫成功,才認為寫動作完成。當MemStore填滿后(可以設置大小),其中的數據會刷寫到硬盤,生成一個HFile。一個列族可以有多個HFile,但一個HFile不能存儲多個列族的數據。每個列族有一個MemStore。

5.HBase的行健值設計是關鍵,行健值經常希望是均衡分布的,諸如MD5或SHA1等散列算法通常用來實現這種均衡分布,這個的作用是為寫優化,當往HBase表寫入大量數據時,我們希望在RegionServer上分散負責來進行優化(散列+salting)。散列提供的定長效果也會讓事情變得更輕松。如果把時間設計到行健中,那么時間取反會讓我們scan的時候先獲取到最新的數據。

6.Hadoop是用java編寫的,HBase也是用java編寫的,原生的HBase客戶端也是用java編寫的,HBase也提供了其他不使用Java的客戶端選擇(基於JVM的和不基於JVM的),這部分我略過了,有興趣的朋友可以看下。JRuby、REST網關、Thrift網關。

7.文中提到HBase與GIS配合使用的一個應用實例,主要是關於地理位置的處理,一個簡單的地理位置包括經度緯度,geohash的編碼用經緯度交織編碼,這樣比較靠近的兩個點在存儲上也比較靠近,找尋附近的節點類應用就只要讀取小塊內容就可以,實現最近鄰居查詢,優化了讀。

8.Hadoop和HBase生產機器的部署建議,Hadoop Namenode,JobTracker和Secondary Namenode通常用專門的硬件部署,不要用廉價的機器。Zookeeper和HBase Master可以共享節點,Zookeeper需要奇數跟個實例才能滿足做出決策的法定服務器數量,Zookeeper推薦配置專用的硬盤寫數據,Zookeeper在內存里提供所有的服務,不過它需要將數據持久化存儲到硬盤。HBase RegionServer很耗內存,但是又不能給它配置太大的內存,否則會遇到Java垃圾回收stop-the-world問題。大概不要超過15G的堆空間,因為太大了垃圾回收執行的頻率會變小,但是垃圾回收每次出現,將持續很長時間,因為它要掃描更大的內存區域。理想的做法是關閉RegionServer節點上的交換,sysctl -w vm.swappiness=0

9.HBase可以提供集群間復制,但是推薦zookeeper是自管理的。可以用HBase自帶的工具做主從,主主備份,也可以用Mapreduce提供更加靈活的備份手段。

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM