Hadoop提供了bzip2、gzip、DEFALTE等多种传统压缩算法,亦实现了这些算法的JAVA实现。因为,既可以用FileSystem API对文件进行压缩和解压,也可以通过MapReduce输入输出格式化来实现。这些算法的缺点是:压缩格式不可分割,即不可分片!
然而,Hadoop的一个作业流程中,是由输入文件字节数与数据块的字节数(默认数据块是64MB)决定mapper启动的数量。亦即每个mapper都将接收到需要处理的数据块,称之为数据分片。于是,LZO压缩算法随之产生。
操作步骤:
1、安装lzo和lzo-devel包。
Red Hat Linux:# yum install liblzo-devel
Ubuntu:apt-get install liblzo2-devel
2、进入hadoop-lzo源码解压的路径编译:
# cd kevinweil-hadoop-lzo-6bb1b7f/
# export JAVA_HOME=/path/to/jdk
# ./setup.sh
# BUILD SUCCESSFUL ----编译成功
3、复制编译好的JAR文件到集群上的hadoop类库目录下,以及core-site.xml、hadoop-env.sh的配置:
# cp build/hadoop-lzo*.jar /path/to/hadoop/lib/
# tar -cBf - -C build/hadoop-lzo-0.4.15/lib/native/ . | tar -xBvf -C /path/to/hadoop/lib/native
-------start 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,com.hadoop.compression.lzo.LzoCodec,com.hadoop.compression.lzo.LzopCodec</value>
</property>
<property>
<name>io.compression.codec.lzo.class</name>
<value>com.hadoop.compression.lzo.LzoCodec</value>
</property>
-------end core-site.xml--------
-------start hadoop-env.sh--------
export HADOOP_CLASSPATH=/path/to/hadoop/lib/hadoop-lzo-X.X.XX.jar
export JAVA_LIBRARY_PATH=/path/to/hadoop/lib/native/hadoop-lzo-native-lib:/path/to/hadoop/lib/native/other-native-libs
-------end hadoop-env.sh--------
4、测试并试用:
# lzop 88_99.txt ###压缩数据
# hadoop fs -put 88_99.txt.lzo /tt/88_99.txt.lzo ###上传
# hadoop java /usr/lib/hadoop/lib/hadoop-lzo-0.4.15.jar com.hadoop.compression.lzo.DistributedLzoIndexer /tt/88_99.txt.lzo ###创建索引