在hadoop2.X集群中安裝壓縮工具snappy(主要用於hbase),在hadoop集群中snappy是一種比較好的壓縮工具,相對gzip壓縮速度和解壓速度有很大的優勢,而且相對節省cpu資源,但壓縮率不及gzip。在此不討論孰優孰劣,各有各的用途。
在hadoop2.X中最好使用源碼編譯生成snappy的so文件,如果使用其它已編譯好的so文件,可能會報出not support錯誤,以下便是hadoop2.X編譯生成snappy的so文件的步驟:
在此,hadoop集群采用的版本是hadoop-2.6.0-cdh5.9.0,系統是centos7.2。
java 7(使用java 8會報一個錯誤)
# rpm -ivh jdk-7uXXX-linux-x64.rpm #XXX為版本號 # cat /etc/profile #....................... export JAVA_HOME=/usr/java/default export JRE_HOME=$JAVA_HOME/jre export CLASSPATH=.:$JAVA_HOME/lib:$JRE_HOME/lib:$CLASSPATH export PATH=$JAVA_HOME/bin:$PATH:$JRE_HOME/lib
若安裝多個版本的jdk,請將上述的/usr/java/default軟鏈接至java7的目錄
驗證安裝
# source /etc/profile # java -version java version "1.7.0_XXX" Java(TM) SE Runtime Environment (build 1.7.X_XXX-XXX) Java HotSpot(TM) 64-Bit Server VM (build XXX.XXX-XXX, mixed mode)
yum -y install gcc gcc-c++ libtool cmake maven zlib-devel
下載如下壓縮包:
hadoop-2.6.0-cdh5.9.0-src.tar.gz(下載地址:http://archive.cloudera.com/cdh5/cdh/5/hadoop-2.6.0-cdh5.9.0-src.tar.gz,也可下載二進制包,內包含src源碼:hadoop-2.6.0-cdh5.9.0-tar.gz)
snappy1.1.1.tar.gz(下載地址:http://pkgs.fedoraproject.org/repo/pkgs/snappy/snappy-1.1.1.tar.gz/8887e3b7253b22a31f5486bca3cbc1c2/snappy-1.1.1.tar.gz)
protobuf-2.5.0.tar.gz(下載地址:https://github.com/google/protobuf/releases/tag/v2.5.0 建議選擇2.5.0版本,不支持最新版本)
# tar xf snappy-1.1.1.tar.gz # cd snappy-1.1.1 # ./configure # make && make install
查看snappy是否安裝完成
# ll /usr/local/lib/ | grep snappy
# tar xf protobuf-2.5.0.tar.gz # cd protobuf-2.5.0 # ./configure # make && make install
驗證安裝
# protoc --version libprotoc 2.5.0
# tar xf hadoop-2.6.0-cdh5.9.0-src.tar.gz # cd hadoop-2.6.0-cdh5.9.0 # mvn package -DskipTests -Pdist,native -Dtar -Dsnappy.lib=/usr/local/lib -Dbundle.snappy
如上通過mvn安裝,不過通過此安裝方法會從官方下載相關所需文件,時間漫長,我大概花了20小時左右,目前由於對mvn工具不是很熟悉,嘗試多種方法均未提升下載速度(包括修改下載源,也許修改方式有誤,報錯找不到相關包)
編譯成功後,snappy的so文件會生成在如下目錄:
hadoop-2.6.0-cdh5.9.0/hadoop-dist/target/hadoop-2.6.0-cdh5.9.0/lib/native
將此目錄下的文件拷貝到hadoop集群中的hadoop和hbase的lib/native目錄下,各節點均需拷貝。
修改配置文件:
$ cat core-site.xmlio.compression.codecs org.apache.hadoop.io.compress.SnappyCodec
重啟hadoop和hbase。
測試是否安裝成功
$ hadoop checknative -a hadoop: true ...../hadoop-2.6.0-cdh5.9.0/lib/native/libhadoop.so zlib: true /usr/local/lib/libz.so.1 snappy: true ...../hadoop-2.6.0-cdh5.9.0/lib/native/libsnappy.so.1 lz4: true revision:10301 bzip2: false openssl: true /lib64/libcrypto.so $ hbase org.apache.hadoop.hbase.util.CompressionTest /tmp/crq snappy .................................................... SUCCESS $ hbase org.apache.hadoop.hbase.util.CompressionTest hdfs://hostname/tmp/crq snappy .................................................... SUCCESS
上述的hostname一般要改為namenode的hostname。
此時,若修改hbase中表壓縮為snappy,會將此表進入RIT狀態,並無法自動恢復,原因在於,hbase(版本1.2)默認關閉壓縮狀態(關於此,官方文檔有所介紹),須在配置文件中開啟:
$ cat hbase-site.xmlhbase.block.data.cachecompressed true
重啟hbase。
$ echo "create 'snappyTest',{NAME=>'f',COMPRESSION => 'SNAPPY'} " | hbase shell
$ echo "disable 'snappyTest2'" | hbase shell #禁用表 $ echo "desc 'snappyTest2'" | hbase shell #查看表結構 $ echo "alter 'snappyTest2',{NAME=>'f',COMPRESSION => 'SNAPPY'} " | hbase shell #壓縮修改為snappy $ echo "enable 'snappyTest2'" | hbase shell #使用該表 $ echo "major_compact 'snappyTest2'" | hbase shell #最好使該表的region compact一次
如上hadoop集群的snappy算是基本安裝ok。
通過今天的簡單測試壓縮率能達到25%左右,雖然不及gzip等壓縮工具,但由於其考慮了cpu資源利用率和壓縮,解壓數據,這個壓縮率還是令人滿意的,至少我挺滿足了。