集成snappy和LZO压缩格式的一般步骤如下:
- 1)编译hadoop-xxx-master.zip得到一个hadoop-xxx-0.0.1-SNAPSHOT.jar和native/Linux-amd64-64/*.so等文件;
- 2)拷贝上面的jar和so文件到hadoop或者hbase的目录
优雅的做法是:
- 1)编译hadoop-xxx-master.zip得到一个hadoop-xxx-0.0.1-SNAPSHOT.jar和native/Linux-amd64-64/*.so等文件;
- 2)拷贝上面的jar到hadoop或者hbase的目录
- 3)配置环境变量LD_LIBRARY_PATH,把所有的相关so文件目录都放进去,比如export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$HADOOP_HOME/lib/native:/usr/local/lib:/usr/local/lzo-2.10/lib
1.Apache hadoop默认安装包不支持Snappy和LZO原因
Apache hadoop官网提供的hadoop版本本身就支持Bzip2、Gzip、DEFLATE3种压缩格式,不支持Snappy和LZO格式,原因是Snappy和LZO的代码库拥有GPL开源协议许可,而不是Apache开源协议许可,关于Snappy和LZO需要hadoop运维或者hadoop提供商自己集成。关于开源代码协议GPL、BSD、MIT、Mozilla、Apache和LGPL的区别详见下图:
2.hadoop压缩优点
- 减少了存储文件所需的空间
- 加速了网络、磁盘或磁盘的数据传输
3.选择hadoop文件压缩格式考虑三个因素
- 文件压缩比例
- 文件解压缩效率
- 该压缩格式的文件是否可被切分,不能切分直接影响mapreduce的map的个数,从而导致mapreduce效率低下
4.压缩格式优缺点以及应用场景
默认Apache hadoop官网下载的安装文件默认就支持Bzip2、Gzip、DEFLATE3种压缩格式,但是不支持Snappy和LZO压缩格式。因为Snappy和LZO代码库拥有GPL许可,所以没有包含在Apache的发行版本中。
4.1 DEFLATE压缩
DEFLATE是一个标准压缩算法,该算法的标准实现是zlib。没有可用于生成EFLATE文件的常用linux命令工具,因为通常都不会用这个格式,而用gzip格式。gzip文件格式只是在DEFLATE格式上增加了文件头和一个文件尾。其文件以.deflate结尾。
4.2 gzip压缩
优点:
- 压缩率比较高,而且压缩/解压速度也比较快;
- hadoop本身支持,在应用中处理gzip格式的文件就和直接处理文本一样;
- 有hadoop native库;
- 大部分linux系统都自带gzip命令,使用方便
缺点:
- 不支持split
应用场景:
当每个文件压缩之后在130M以内的(1个块大小内),都可以考虑用gzip压缩格式。譬如说一天或者一个小时的日志压缩成一个gzip文件,运行mapreduce程序的时候通过多个gzip文件达到并发。hive程序,streaming程序,和java写的mapreduce程序完全和文本处理一样,压缩之后原来的程序不需要做任何修改。
4.3 bzip2压缩
优点:
- 支持split;
- 具有很高的压缩率,比gzip压缩率都高;
- hadoop本身支持,但不支持native;
- 在linux系统下自带bzip2命令,使用方便
缺点:
- 压缩/解压速度慢;
- 不支持native
应用场景:
适合对速度要求不高,但需要较高的压缩率的时候,可以作为mapreduce作业的输出格式;或者输出之后的数据比较大,处理之后的数据需要压缩存档减少磁盘空间并且以后数据用得比较少的情况;或者对单个很大的文本文件想压缩减少存储空间,同时又需要支持split,而且兼容之前的应用程序(即应用程序不需要修改)的情况。
4.4 lzo压缩
优点:
- 压缩/解压速度也比较快,合理的压缩率;
- 支持split,是hadoop中最流行的压缩格式;
- 支持hadoop native库;
- 可以在linux系统下安装lzop命令,使用方便
缺点:
- 压缩率比gzip要低一些;
- hadoop本身不支持,需要安装;
- 在应用中对lzo格式的文件需要做一些特殊处理(为了支持split需要建索引,还需要指定inputformat为lzo格式)
应用场景:
一个很大的文本文件,压缩之后还大于200M以上的可以考虑,而且单个文件越大,lzo优点越越明显
4.5 LZ4压缩
优点:
- 高速压缩解压库, 压缩率为 zlib 2/3, 但速度很高;
缺点:
- linux系统下没有对应的命令;
- 不支持split;
- 不支持流式操作
4.6 snappy压缩
优点:
- 高速压缩速度和合理的压缩率;
- 支持hadoop native库
缺点:
- 不支持split;
- 压缩率比gzip要低;
- hadoop本身不支持,需要安装;
- linux系统下没有对应的命令
应用场景:
当mapreduce作业的map输出的数据比较大的时候,作为map到reduce的中间数据的压缩格式;或者作为一个mapreduce作业的输出和另外一个mapreduce作业的输入.
5.集成LZO到Apache hadoop中(适用于Hadoop1.x、Hadoop2.x和Hadoop3.x)
关于LZO如何集成到Apache hadoop可以详见GitHub上hadoop-lzo的源代码https://github.com/twitter/hadoop-lzo说明,这里下面的步骤也是我参照源代码经过实践得来,关于更详细的内容(必须的依赖库,如何安装,如何处理安装中LZO找不到,如何去使用LZO)请参见源代码说明。
如果你在hadoop权威指南里看到LZO的源代码库为https://github.com/kevinweil/hadoop-lzo,不足为奇,这个源代码库依然在GitHub中,它采用的是ant进行编译,不过已经6年未更新了,新的hadoop-lzo源代码已经转移到https://github.com/twitter/hadoop-lzo,如果你非得使用https://github.com/kevinweil/hadoop-lzo,请参见本文的第7节进行集成。
5.1 hadoop-lzo在github上的代码库地址(https://github.com/twitter/hadoop-lzo)
5.2 源代码编译前的准备工作
(1) linux库LZO的安装
ubuntu中使用apt-get install lzo安装,centos中使用yum -y install lzo安装,这里我个人习惯下载lzo源代码然后编译安装。
注意:这里的linux库LZO需要在hadoop集群的每个节点都需要安装。
#linux安装lzo #下载并解压linux库lzo源代码 cd /root wget http://www.oberhumer.com/opensource/lzo/download/lzo-2.10.tar.gz tar -zxvf lzo-2.10.tar.gz #编译安装linuxlzo源代码 cd /root/lzo-2.10 #这里我指定安装linux的lzo库到linux机器的/usr/local/lzo-2.10目录 ./configure --enable-shared --prefix /usr/local/lzo-2.10 make make install
(2)JDK安装
#安装jdk-7u65-linux-x64.gz #下载jdk-7u65-linux-x64.gz放置于/opt/java/jdk-7u65-linux-x64.gz并解压 cd /opt/java/ tar -zxvf jdk-7u65-linux-x64.gz #配置linux系统环境变量 vi /etc/profile #在文件末尾追加如下内容 export JAVA_HOME=/opt/java/jdk1.7.0_65 export CLASSPATH=.:$JAVA_HOME/jre/lib/rt.jar:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar export PATH=$PATH:$JAVA_HOME/bin #使配置生效 source /etc/profile #检查JDK环境是否配置成功 java -version
(3)MAVEN安装
#1.下载apache-maven-3.3.3.tar.gz放置于/opt/下并解压 cd /opt tar zxvf apache-maven-3.3.3.tar.gz #2.配置环境变量 vi /etc/profile #添加如下内容 MAVEN_HOME=/opt/apache-maven-3.3.3 export MAVEN_HOME export PATH=${PATH}:${MAVEN_HOME}/bin #3.使配置生效 source /etc/profile #4.检测maven是否安装成功 mvn -version #5.配置maven仓库镜像,目前国内maven镜像建议使用阿里云库 vi /home/hadoop/.m2/settings.xml #内容如下: <?xml version="1.0" encoding="UTF-8"?> <settings xmlns="http://maven.apache.org/SETTINGS/1.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0 http://maven.apache.org/xsd/settings-1.0.0.xsd"> <!--默认下载依赖放置于/home/hadoop/.m2/repository目录下,这里我指定我想存放于/opt/maven-localRepository--> <localRepository>/opt/maven-localRepository</localRepository> <pluginGroups></pluginGroups> <proxies></proxies> <servers></servers> <mirrors> <!--add by aperise start--> <mirror> <id>alimaven</id> <name>aliyun maven</name> <url>http://maven.aliyun.com/nexus/content/groups/public/</url> <mirrorOf>central</mirrorOf> </mirror> <!--add by aperise end--> </mirrors> <profiles> </profiles> </settings>
5.3 hadoop-lzo库编译安装
#下载并解压源代码hadoop-lzo-master cd /home/hadoop wget https://github.com/twitter/hadoop-lzo/archive/hadoop-lzo-master.zip unzip hadoop-lzo-master.zip cd /home/hadoop/hadoop-lzo-master
#注意以下三行一起执行,前两行是指定LZO库文件所在位置,注意和之前安装的linux库LZO所在位置保持一致
C_INCLUDE_PATH=/usr/local/lzo-2.10/include \ LIBRARY_PATH=/usr/local/lzo-2.10/lib \ mvn clean package -DskipTests
编译完成后会在/home/hadoop/hadoop-lzo-master/target下得到如下文件:
其中hadoop-lzo-0.4.21-SNAPSHOT.jar和native就是我们需要的jar和库文件,在后面只需要拷贝jar和native下面的库文件到hadoop下即可完成集成,这里在/home/hadoop/hadoop-lzo-master/target/native/Linux-amd64-64/lib的库文件如下:
5.4 集成hadoop-lzo库到hadoop-2.7.4
需要拷贝hadoop-lzo-0.4.21-SNAPSHOT.jar到/home/hadoop/hadoop-2.7.4/share/hadoop/common/lib/下面,需要拷贝/home/hadoop/hadoop-lzo-master/target/native/Linux-amd64-64/lib/下的文件到/home/hadoop/hadoop-2.7.4/lib/native/下面
cp -r /home/hadoop/hadoop-lzo-master/target/native/Linux-amd64-64/lib/* /home/hadoop/hadoop-2.7.4/lib/native/ cp -r /home/hadoop/hadoop-lzo-master/target/hadoop-lzo-0.4.21-SNAPSHOT.jar /home/hadoop/hadoop-2.7.4/share/hadoop/common/lib/
6.Hadoop2.x和Hadoop3.x如何集成snappy
6.1 在Linux上安装snappy库
在GitHub上Hadoop的源码编译文件里已经明确说明如何集成snappy,详见https://github.com/apache/hadoop/blob/trunk/BUILDING.txt。
集成snappy,首先需要Linux操作系统已经安装snappy库,而安装snappy库的推荐方式为:
sudo apt-get install snappy libsnappy-dev
如果机器是离线环境,可以采用编译安装,方式如下:
#1.去https://github.com/google/snappy/releases下载snappy-1.1.3.tar.gz并解压 cd /root wget https://github.com/google/snappy/releases/download/1.1.3/snappy-1.1.3.tar.gz tar -zxvf snappy-1.1.3.tar.gz #2.在linux上编译安装 cd /root/snappy-1.1.3 ./configure make make install #3.默认安装在/usr/local/lib,在其下会有snappy相关.so结尾的库文件
6.2 编译Hadoop2.x之后源码里的Hadoop-common模块
Hadoop源码里的hadoop-common模块内置了snappy、gzip、bzip2、lz4的编解码,唯一没有的是关于lzo的编解码库:
1.下载hadoop源代码hadoop-2.7.1-src.tar.gz放置于/root下并解压缩 cd /root wget http://www.apache.org/dyn/closer.cgi/hadoop/common/hadoop-2.7.1/hadoop-2.7.1-src.tar.gz tar -zxvf hadoop-2.7.1-src.tar.gz 2.准备Hadoop编译必备环境,请参见http://aperise.iteye.com/blog/2246856 3.单独编译打包hadoop-common,获取对于snappy压缩的支持(如果想编译整个工程请参见http://aperise.iteye.com/blog/2246856) cd /root/hadoop-2.7.1-src export MAVEN_OPTS="-Xms256m -Xmx512m" mvn package -Pdist,native -DskipTests -Dtar -rf :hadoop-common -Drequire.snappy -X #如果想编译整个代码且单独指定snappy库位置,命令如下: #mvn package -Pdist,native,docs,src -DskipTests -Drequire.snappy -Dsnappy.lib=/usr/local/lib 4.编译完成后在/root/hadoop-2.7.1-src/hadoop-dist/target/hadoop-2.7.1/lib/native下得到相关库文件 5.编译完成后在/root/hadoop-2.7.1-src/hadoop-dist/target/hadoop-2.7.1/share/hadoop/common下得到相关jar,其中最重要的就是hadoop-common-2.7.1.jar
6.3 集成snappy到Hadoop和HBASE之中
1.将上面中编译的snappy支持文件拷贝到Hadoop中 #这里我安装的Hadoop位置为/home/hadoop/hadoop-2.7.1 cp -r /root/hadoop-2.7.1-src/hadoop-dist/target/hadoop-2.7.1/lib/native/* /home/hadoop/hadoop-2.7.1/lib/native/ cp /usr/local/lib/* /home/hadoop/hadoop-2.7.1/lib/native/ 2.将上面中编译的的hadoop-common-2.7.1.jar文件拷贝到Hadoop #这里我安装的Hadoop位置为/home/hadoop/hadoop-2.7.1 cp -r /root/hadoop-2.7.1-src/hadoop-dist/target/hadoop-2.7.1/share/hadoop/common/* /home/hadoop/hadoop-2.7.1/share/hadoop/common/ 3.修改hadoop的配置文件/home/hadoop/hadoop-2.7.1/etc/hadoop/core-site.xml,增加如下配置: <property> <name>io.compression.codecs</name> <value> org.apache.hadoop.io.compress.DefaultCodec, org.apache.hadoop.io.compress.GzipCodec, org.apache.hadoop.io.compress.BZip2Codec, org.apache.hadoop.io.compress.Lz4Codec, org.apache.hadoop.io.compress.SnappyCodec </value> <description>A comma-separated list of the compression codec classes that can be used for compression/decompression. In addition to any classes specified with this property (which take precedence), codec classes on the classpath are discovered using a Java ServiceLoader.</description> </property> 4.修改/home/hadoop/hadoop-2.7.1/etc/hadoop/mapred-site.xml,添加如下内容: <property> <name>mapreduce.output.fileoutputformat.compress</name> <value>true</value> <description>Should the job outputs be compressed? </description> </property> <property> <name>mapreduce.output.fileoutputformat.compress.type</name> <value>RECORD</value> <description>If the job outputs are to compressed as SequenceFiles, how should they be compressed? Should be one of NONE, RECORD or BLOCK. </description> </property> <property> <name>mapreduce.output.fileoutputformat.compress.codec</name> <value>org.apache.hadoop.io.compress.SnappyCodec</value> <description>If the job outputs are compressed, how should they be compressed? </description> </property> <property> <name>mapreduce.map.output.compress</name> <value>true</value> <description>Should the outputs of the maps be compressed before being sent across the network. Uses SequenceFile compression. </description> </property> <property> <name>mapreduce.map.output.compress.codec</name> <value>org.apache.hadoop.io.compress.SnappyCodec</value> <description>If the map outputs are compressed, how should they be compressed? </description> </property>
如果你是Hadoop2.x和Hadoop3.x版本,请采用此种方式,如果你是Hadoop1.x,请继续往下看
7.集成Snappy到Apache hadoop中(仅适用于Hadoop1.x,Hadoop2.x以后版本在hadoop-common模块已经内置snappy编解码)
关于Snappy如何集成到Apache hadoop可以详见GitHub上hadoop-snappy的源代码https://github.com/electrum/hadoop-snappy说明,这里下面的步骤也是我参照源代码经过实践得来,关于更详细的内容(必须的依赖库,如何安装)请参见源代码说明。
7.1 hadoop-snappy在github上的代码库地址(https://github.com/electrum/hadoop-snappy)
7.2 源代码编译前的准备工作
(1) linux库Snappy的安装
ubuntu中使用apt-get install snappy安装,centos中使用yum -y install snappy安装,这里我个人习惯下载snappy源代码然后编译安装。
注意:这里的linux库LZO需要在hadoop集群的每个节点都需要安装。
(2)JDK安装
#安装jdk-7u65-linux-x64.gz #下载jdk-7u65-linux-x64.gz放置于/opt/java/jdk-7u65-linux-x64.gz并解压 cd /opt/java/ tar -zxvf jdk-7u65-linux-x64.gz #配置linux系统环境变量 vi /etc/profile #在文件末尾追加如下内容 export JAVA_HOME=/opt/java/jdk1.7.0_65 export CLASSPATH=.:$JAVA_HOME/jre/lib/rt.jar:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar export PATH=$PATH:$JAVA_HOME/bin #使配置生效 source /etc/profile #检查JDK环境是否配置成功 java -version
(3)MAVEN安装
#1.下载apache-maven-3.3.3.tar.gz放置于/opt/下并解压 cd /opt tar zxvf apache-maven-3.3.3.tar.gz #2.配置环境变量 vi /etc/profile #添加如下内容 MAVEN_HOME=/opt/apache-maven-3.3.3 export MAVEN_HOME export PATH=${PATH}:${MAVEN_HOME}/bin #3.使配置生效 source /etc/profile #4.检测maven是否安装成功 mvn -version #5.配置maven仓库镜像,目前国内maven镜像建议使用阿里云库 vi /home/hadoop/.m2/settings.xml #内容如下: <?xml version="1.0" encoding="UTF-8"?> <settings xmlns="http://maven.apache.org/SETTINGS/1.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0 http://maven.apache.org/xsd/settings-1.0.0.xsd"> <!--默认下载依赖放置于/home/hadoop/.m2/repository目录下,这里我指定我想存放于/opt/maven-localRepository--> <localRepository>/opt/maven-localRepository</localRepository> <pluginGroups></pluginGroups> <proxies></proxies> <servers></servers> <mirrors> <!--add by aperise start--> <mirror> <id>alimaven</id> <name>aliyun maven</name> <url>http://maven.aliyun.com/nexus/content/groups/public/</url> <mirrorOf>central</mirrorOf> </mirror> <!--add by aperise end--> </mirrors> <profiles> </profiles> </settings>
7.3 hadoop-snappy库编译安装
#下载并解压源代码hadoop-snappy-master cd /home/hadoop wget https://github.com/electrum/hadoop-snappy/archive/hadoop-snappy-master.zip unzip hadoop-snappy-master.zip cd /home/hadoop/hadoop-snappy-master #编译中如果遇到问题,请参见http://www.cnblogs.com/shitouer/archive/2013/01/14/2859475.html进行解决 mvn package
编译完成后会在/home/hadoop/hadoop-snappy-master/target下得到如下文件:
其中hadoop-snappy-0.0.1-SNAPSHOT.tar.gz就是我们需要的文件,里面包含hadoop-snappy-0.0.1-SNAPSHOT.jar和相关库文件。
7.4 集成hadoop-snappy库到hadoop-2.7.4
需要拷贝hadoop-snappy-0.0.1-SNAPSHOT.jar到/home/hadoop/hadoop-2.7.4/share/hadoop/common/lib/下面,需要拷贝/home/hadoop/hadoop-snappy-0.0.1-SNAPSHOT/lib/native/Linux-amd64-64/下的文件到/home/hadoop/hadoop-2.7.4/lib/native/下面
#解压hadoop-snappy-0.0.1-SNAPSHOT.tar.gz cp /home/hadoop/hadoop-snappy-master/target/hadoop-snappy-0.0.1-SNAPSHOT.tar.gz /home/hadoop/ cd /home/hadoop tar -zxvf hadoop-snappy-0.0.1-SNAPSHOT.tar.gz #拷贝jar和库到 cp -r /home/hadoop/hadoop-snappy-0.0.1-SNAPSHOT/lib/native/Linux-amd64-64/* /home/hadoop/hadoop-2.7.4/lib/native/ cp -r /home/hadoop/hadoop-snappy-0.0.1-SNAPSHOT/lib/hadoop-snappy-0.0.1-SNAPSHOT.jar /home/hadoop/hadoop-2.7.4/share/hadoop/common/lib
8.集成LZO到Apache hadoop中(另一个hadoop-lzo库,GitHub已经6年未更新,不建议用,因为hadoop权威指南提到,这里把实践的集成记录一下)(适用于Hadoop1.x、Hadoop2.x和Hadoop3.x)
关于LZO如何集成到Apache hadoop可以详见GitHub上hadoop-lzo的源代码https://github.com/kevinweil/hadoop-lzo说明,这里下面的步骤也是我参照源代码经过实践得来,关于更详细的内容(必须的依赖库,如何安装,如何处理安装中LZO找不到,如何去使用LZO)请参见源代码说明。
8.1 hadoop-lzo在github上的代码库地址(https://github.com/kevinweil/hadoop-lzo)
8.2 源代码编译前的准备工作
(1) linux库LZO的安装
ubuntu中使用apt-get install lzo安装,centos中使用yum -y install lzo安装,这里我个人习惯下载lzo源代码然后编译安装。
注意:这里的linux库LZO需要在hadoop集群的每个节点都需要安装。
#linux安装lzo #下载并解压linux库lzo源代码 cd /root wget http://www.oberhumer.com/opensource/lzo/download/lzo-2.10.tar.gz tar -zxvf lzo-2.10.tar.gz #编译安装linuxlzo源代码 cd /root/lzo-2.10 ./configure --enable-shared make make install
(2)JDK安装
#安装jdk-7u65-linux-x64.gz #下载jdk-7u65-linux-x64.gz放置于/opt/java/jdk-7u65-linux-x64.gz并解压 cd /opt/java/ tar -zxvf jdk-7u65-linux-x64.gz #配置linux系统环境变量 vi /etc/profile #在文件末尾追加如下内容 export JAVA_HOME=/opt/java/jdk1.7.0_65 export CLASSPATH=.:$JAVA_HOME/jre/lib/rt.jar:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar export PATH=$PATH:$JAVA_HOME/bin #使配置生效 source /etc/profile #检查JDK环境是否配置成功 java -version
(3)ANT安装
#下载并解压apache-ant-1.8.2-bin.zip cd /home/hadoop wget http://mirrors.tuna.tsinghua.edu.cn/apache//ant/binaries/apache-ant-1.8.2-bin.zip unzip apache-ant-1.8.2-bin.zip #编辑/home/hadoop/.bashrc,在文件末尾追加如下内容 vi /home/hadoop/.bashrc export ANT_HOME=/opt/apache-ant-1.8.2 export PATH=${PATH}:${ANT_HOME}/bin #使得/home/hadoop/.bashrc配置生效 source /home/hadoop/.bashrc #测试ant是否生效 ant -version
8.3 hadoop-lzo库编译安装
#编译安装hadoop-lzo-master cd /home/hadoop wget https://github.com/kevinweil/hadoop-lzo/archive/hadoop-lzo-master.zip unzip hadoop-lzo-master.zip cd /home/hadoop/hadoop-lzo-master #注意以下三行一起执行,前两行是指定LZO库文件所在位置 CFLAGS=-m64 \ CXXFLAGS=-m64 \ ant compile-native tar
编译完成后会在/home/hadoop/hadoop-lzo-master/build下得到如下文件:
其中hadoop-lzo-0.4.15-SNAPSHOT.jar和native就是我们需要的jar和库文件,在后面只需要拷贝jar和native下面的库文件到hadoop下即可完成集成,这里在/home/hadoop/hadoop-lzo-master/build/native/Linux-amd64-64/lib的库文件如下:
8.4 集成hadoop-lzo库到hadoop-2.7.4
需要拷贝hadoop-lzo-0.4.15-SNAPSHOT.jar到/home/hadoop/hadoop-2.7.4/share/hadoop/common/lib/下面,需要拷贝/home/hadoop/hadoop-lzo-master/target/native/Linux-amd64-64/lib/下的文件到/home/hadoop/hadoop-2.7.4/lib/native/下面
cp -r /home/hadoop/hadoop-lzo-master/build/native/Linux-amd64-64/lib/* /home/hadoop/hadoop-2.7.4/lib/native/ cp -r /home/hadoop/hadoop-lzo-master/build/hadoop-lzo-0.4.15-SNAPSHOT.jar /home/hadoop/hadoop-2.7.4/share/hadoop/common/lib/
8.5 遇到的问题([javah] Error: Class org.apache.hadoop.conf.Configuration could not be found)
编译中遇到的问题错误信息如下:
ivy-retrieve-common: [ivy:retrieve] :: retrieving :: com.hadoop.gplcompression#Hadoop-GPL-Compression [ivy:retrieve] confs: [common] [ivy:retrieve] 0 artifacts copied, 3 already retrieved (0kB/6ms) [ivy:cachepath] DEPRECATED: 'ivy.conf.file' is deprecated, use 'ivy.settings.file' instead [ivy:cachepath] :: loading settings :: file = /opt/hadoop-lzo-master/ivy/ivysettings.xml init: compile-java: [javac] /opt/hadoop-lzo-master/build.xml:243: warning: 'includeantruntime' was not set, defaulting to build.sysclasspath=last; set to false for repeatable builds check-native-uptodate: compile-native: [javah] Error: Class org.apache.hadoop.conf.Configuration could not be found. BUILD FAILED /opt/hadoop-lzo-master/build.xml:266: compilation failed
解决办法如下,修改/opt/hadoop-lzo-master/build.xml中如下内容:
<target name="compile-native" depends="compile-java,check-native-uptodate" unless="native.uptodate"> <mkdir dir="${build.native}/lib"/> <mkdir dir="${build.native}/src/com/hadoop/compression/lzo"/> <javah classpath="${build.classes}" destdir="${build.native}/src/com/hadoop/compression/lzo" force="yes" verbose="yes"> <class name="com.hadoop.compression.lzo.LzoCompressor" /> <class name="com.hadoop.compression.lzo.LzoDecompressor" /> </javah>
为ant的target=compile-native指定classpath,修改后为:
<target name="compile-native" depends="compile-java,check-native-uptodate" unless="native.uptodate"> <mkdir dir="${build.native}/lib"/> <mkdir dir="${build.native}/src/com/hadoop/compression/lzo"/> <javah classpath="${build.classes}" destdir="${build.native}/src/com/hadoop/compression/lzo" force="yes" verbose="yes"> <class name="com.hadoop.compression.lzo.LzoCompressor" /> <class name="com.hadoop.compression.lzo.LzoDecompressor" /> <classpath refid="classpath"/> </javah>
9.Apache hadoop中配置压缩
9.1HDFS配置压缩
注意:这里可以配置多个
core-site.xml增加配置:
<property> <name>io.compression.codecs</name> <value> org.apache.hadoop.io.compress.DefaultCodec, org.apache.hadoop.io.compress.GzipCodec, org.apache.hadoop.io.compress.BZip2Codec, com.hadoop.compression.lzo.LzoCodec, com.hadoop.compression.lzo.LzopCodec, org.apache.hadoop.io.compress.Lz4Codec, org.apache.hadoop.io.compress.SnappyCodec </value> <description>A comma-separated list of the compression codec classes that can be used for compression/decompression. In addition to any classes specified with this property (which take precedence), codec classes on the classpath are discovered using a Java ServiceLoader.</description> </property>
注意:hadoop是根据文件的后缀去寻找编解码用哪个,之前认为com.hadoop.compression.lzo.LzoCodec对应的后缀为".lzo"是错误的,查看了hadoop-lzo源代码发现".lzo"对应的编解码为com.hadoop.compression.lzo.LzopCodec,查看了源代码发现".lzo_deflate"对应的编解码为com.hadoop.compression.lzo.LzoCodec
9.2 MAPREDUCE配置压缩
注意:这里只能配置采用一种
mapred-site.xml增加配置:
<property> <name>mapreduce.output.fileoutputformat.compress</name> <value>true</value> <description>Should the job outputs be compressed? </description> </property> <property> <name>mapreduce.output.fileoutputformat.compress.type</name> <value>RECORD</value> <description>If the job outputs are to compressed as SequenceFiles, how should they be compressed? Should be one of NONE, RECORD or BLOCK. </description> </property> <property> <name>mapreduce.output.fileoutputformat.compress.codec</name> <value>org.apache.hadoop.io.compress.SnappyCodec</value> <description>If the job outputs are compressed, how should they be compressed? </description> </property> <property> <name>mapreduce.map.output.compress</name> <value>true</value> <description>Should the outputs of the maps be compressed before being sent across the network. Uses SequenceFile compression. </description> </property> <property> <name>mapreduce.map.output.compress.codec</name> <value>org.apache.hadoop.io.compress.SnappyCodec</value> <description>If the map outputs are compressed, how should they be compressed? </description> </property>