最近在研究如何在HBase使用壓縮,在(http://code.google.com/p/snappy/)這裡說了,壓縮不能只是看壓縮率,而是要整體的表現,網路上也是滿多人在討論下圖的關係,甚至也有人去對這些做了實驗,而下圖大致上能說明其表現的差異,而這邊並不需要去討論誰好誰壞,因為這邊只是敘述挑選壓縮工具的需求,但注意下圖LZO的壓縮率仍比SNAPPY好(這樣放的確容易照成誤解!!)
相信有在使用HBase的人應該都知道memstore (reach to threshold) -> flush (hfile) -> HDFS,而壓縮也是在memsotre到了threshold,然後執行snapshot完被進行,那麼HBase還有一個參數也就是當memstore到達blockingMemStoreSize,時會block客戶端(client)對服務端(server)的寫請求,故下面就對幾種場合可以對上述幾中壓縮工具進行挑選。
1. 當資料量小時,要不要壓縮就看需求而定了,Gzip是個很好的選擇。
2. 當資料量有點大,但是又需要好的壓縮比,此時請測試看看使用GZIP是否容易達到blockingMemStoreSize,若非請使用Gzip即可。
3. 當資料量大時,其實這邊要看需求了,礙於license的關係,但我是建議SNAPPY,由(http://code.google.com/p/snappy/)這裡有說,SNAPPY具有250MB/s的壓縮以及500MB/s的解壓縮能力。
注: blockingMemStoreSize = hbase.hregion.memstore.flush.size * hbase.hregion.memstore.block.multiplier
因為我是礙於license的問題,所以我是使用SNAPPY,但是LZO的安裝方式也是差不多的,請依據下面方式進行安裝,
hadoop version : 1.0.4
hbase version : 0.94.2
snappy version : 1.0.5 (http://code.google.com/p/snappy/downloads/detail?name=snappy-1.0.5.tar.gz)
1. gcc, gcc-c++, libtool, autoconf, automake, java 6一堆dependence請記得要下載^^"
2. tar xzvf snappy-1.0.5.tar.gz
3. cd snappy-1.0.5
4. ./configure
5. make
6. make install
7. cp .libs/libsnappy.* $HADOOP_HOME/lib/native/Linux-amd64-64/
8. cp $HADOOP_HOME/lib/native/* $HBASE_HOME/lib/native
9. 注意:" 叢集中每一台"都需要有上述的步驟,可以先在master上面做,然後複製7.8的內容到叢集中的每一台上面,大家應該會有疑惑為什麼會這麼好安裝,那是因為1.x.x版後的Hadoop本身已經有codec了只是沒裝libsnappy等相關連結庫,所以只要把相關連結庫l安裝好後就能用了,LZO也是一樣,只是LZO為GPL而已。
測試有無安裝成功如下所示,compression為Snappy就是安裝成功
1. 進入HBase shell。
2. create 'testtable', {NAME => 'f1', COMPRESSION => 'snappy'}
3. describe 'testtable'(即可看到下述情況)
{NAME => 'testtable',
FAMILIES =>
[{ NAME => 'f1',
DATA_BLOCK_ENCODING => 'NONE',
BLOOMFILTER =>'NONE',
REPLICATION_SCOPE => '0',
VERSIONS => '3',
COMPRESSION => 'SNAPPY',
MIN_VERSIONS => '0',
TTL =>'2147483647',
KEEP_DELETED_CELLS => 'false',
BLOCK SIZE => '65536',
IN_MEMORY => 'false',
ENCODE_ON_DISK => 'true',
BLOCKCACHE => 'true'}]
}