一.安装 protobuf ubuntu 系统 首先确保具有 gcc gcc-c++ libtool cmake 具有这些环境 1 在 /etc/ld.so.conf.d/目录下创建文件 libprotobuf.conf 写入内容 /usr/local/lib 否则会报 error while loading shared libraries: libprotoc.so.8: cannot open shared obj 2../configure make&&make install 2.验证安装完成 protoc --version libprotoc 2.5.0

二.安装 snappy 本地库 http://www.filewatcher.com/m/snappy-1.1.1.tar.gz.1777992-0.html 下载snappy-1.1.1.tar.gz 解压 ./configure make&& makeInstall

检查/usr/local/lib libsnappy.a libsnappy.la libsnappy.so libsnappy.so.1 libsnappy.so.1.2.0

三.编译 cdh hadoop的源码。(加入snappy支持) 下载链接http://archive.cloudera.com/cdh5/cdh/5/

hadoop-2.6.0-cdh5.11.0-src.tar.gz 解压。使用maven编译 4.检查文件 hadoop-2.6.0-cdh5.11.0/hadoop-dist/target/hadoop-2.6.0-cdh5.11.0/lib/native 目录下是否具有 hadoop的本地库以及 snappy的本地库 5. 将此目录下的文件拷贝到hadoop集群中的hadoop下的lib/native目录和hbase下的lib/native/Linux-amd64-64目录下,没有则新建,各节点均需拷贝。

cp ~apk/hadoop-2.6.0-cdh5.11.0/hadoop-dist/target/hadoop-2.6.0-cdh5.11.0/lib/native/* ~/app/hadoop/lib/native/

6.将本地库同步到其他节点 7.配置 hadoop的 core-site.xml 加入 <property> <name>io.compression.codecs</name> <value>org.apache.hadoop.io.compress.GzipCodec,org.apache.hadoop.io.compress.DefaultCodec,org.apache.hadoop.io.compress.BZip2Codec,org.apache.hadoop.io.compress.SnappyCodec</value> </property>

配置 mapred-site.xml 加入 <property> <name>mapreduce.map.output.compress</name> <value>true</value> </property> <property> <name>mapreduce.map.output.compress.codec</name> <value>org.apache.hadoop.io.compress.SnappyCodec</value> </property> <property> <name>mapreduce.admin.user.env</name> <value>LD_LIBRARY_PATH=/home/hadoop/app/hadoop/lib/native</value> </property> 配置 hbase的 hbase-site.xml 加入 <property> <name>hbase.block.data.cachecompressed</name> <value>true</value> </property>

8.重启hadoop的hdfs与yarn 9.验证snappy是否成功。 hadoop checknative

18/03/07 17:33:36 WARN bzip2.Bzip2Factory: Failed to load/initialize native-bzip2 library system-native, will use pure-Java version 18/03/07 17:33:36 INFO zlib.ZlibFactory: Successfully loaded & initialized native-zlib library Native library checking: hadoop: true /home/hadoop/app/hadoop/lib/native/libhadoop.so zlib: true /lib/x86_64-linux-gnu/libz.so.1 snappy: true /home/hadoop/app/hadoop/lib/native/libsnappy.so.1 lz4: true revision:10301 bzip2: false openssl: true /usr/lib/x86_64-linux-gnu/libcrypto.so

看到snappy已经成功支持

运行mapreduce任务 hadoop jar ~/app/hadoop/share/hadoop/mapreduce/hadoop-mapreduce-examples-2.6.0-cdh5.11.0.jar wordcount /input/gisData /output 如果正常运行。则证明 snappy没有问题。如果有。 Exception in thread "main" java.lang.UnsatisfiedLinkError: org.apache.hadoop.util.NativeCodeLoader.buildSupportsSnappy()Z

请检查mapred-site.xml 的本地库配置

10 启动hbase. 先创建一张snappy的表

create 'snappyTest',{NAME=>'f',COMPRESSION => 'SNAPPY'} descibe 'snappyTest'

TTL => 'FOREVER', COMPRESSION => 'SNAPPY', MIN_VERSIONS => '0' 看到这个snappy就可以了。

重点是我们要压缩现有的表 可以在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一次

也可以hbase shell 进shell手动压缩。压缩后会发现 数据有40%左右的压缩比

java代码创建Hbase表只需要 HColumnDescriptor HColumnDesc = new HColumnDescriptor("data"); HColumnDesc.setCompressionType(Algorithm.SNAPPY);//这句是关键