hadoop-lzo
经过我上一篇博文的介绍,大家都知道在我们大数据开发的过程中,其实我们都会对数据进行压缩的,但不同的压缩方式会有不同的效果,今天我来介绍一下lzo这种hadoop原生并不支持的压缩方式的配置和使用,最后我们将跑一次基于lzo的压缩的文件的wordcount。
hadoop支持lzo
由于hadoop原生并不支持lzo,所以即使我们使用了编译版的hadoop好像也不能使用lzo这中压缩方式的。
安装lzop native library
yum -y install lzo-devel zlib-devel gcc autoconf automake libtool
wget www.oberhumer.com/opensource/lzo/download/lzo-2.06.tar.gz tar -zxf lzo-2.06.tar.gz
cd lzo-2.06
export CFLAGS=-m64
./configure //如果你想指定具体的安装目录的话,可以添加参数–prefix==your_path
make && make install //这个过程要注意权限问题,所以我建议你还是使用root用户来操作
安装maven
这里我就不对maven进行介绍了,这个我们后面要用来编译的
wget mirrors.hust.edu.cn/apache/maven/maven-3/3.5.2/binaries/apache-maven-3.5.2-bin.tar.gz tar -zxf apache-maven-3.5.2-bin.tar.gz
将maven配置到环境变量当中去,vi ~/.bash_profile 然后进入到编辑模式,输入:
export MAVEN_HOME=your_maven_path
export PATH=PATH
然后退出~/.bash_profile,source ~/.bash_profile使其生效
试着在控制台输入mvn -v看看有没有maven的信息输出,输出就对了。
安装hadoop-lzo
wget https://github.com/twitter/hadoop-lzo/archive/master.zip unzip master
vi hadoop-lzo-master/pom.xml
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<hadoop.current.version>2.7.4</hadoop.current.version> #这里修改成对应的hadoop版本号
<hadoop.old.version>1.0.4</hadoop.old.version>
</properties>
cd hadoop-lzo-master/
export CFLAGS=-m64
export CXXFLAGS=-m64
export C_INCLUDE_PATH=lzo-2.06/include //这里是指定你lzo-2.06的地址里面的include目录,这就是为什么我们要安装配置lzo-2.06的原因了
export LIBRARY_PATH=lzo-2.06/lib //同上
mvn clean package -Dmaven.test.skip=true //使用maven编译
出现这个界面就是对的了
cd target/native/Linux-amd64-64
tar -cBf - -C lib . | tar -xBvf - -C ~
cp ~/libgplcompression* $HADOOP_HOME/lib/native/ //将这个包里面的所有东西都cp到hadoop目录下的lib下的native里面,最好你是编译过的hadoop,否则你的native里面是空的
cp target/hadoop-lzo-0.4.21-SNAPSHOT.jar $HADOOP_HOME/share/hadoop/common/ //这个非常重要,你能否正常使用lzo就看这个了
ls -l /root/libgplcompression.*
修改一下hadoop的配置文件
vi $HADOOP_HOME/etc/hadoop/hadoop-env.sh 添加下面的配置参数
export LD_LIBRARY_PATH=lzo-2.06/lib
vi $HADOOP_HOME/etc/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,
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>
//注意io.compression.codecs的value里面不要有空格,我之前就是因为这个搞得我hive的输出都出错了
vi $HADOOP_HOME/etc/hadoop/mapred-site.xml
<property>
<name>mapred.child.env </name>
<value>LD_LIBRARY_PATH=/usr/local/lzo-2.06/lib</value>
</property>
<property>
<name>mapreduce.map.output.compress</name>
<value>true</value>
</property>
<property>
<name>mapreduce.map.output.compress.codec</name>
<value>com.hadoop.compression.lzo.LzoCodec</value>
</property>
重启你hadoop集群
lzop的安装
这个就是lzo压缩解压的工具,你可以使用lzop file 来压缩文件成lzo文件,也可以使用lzop -d file.lzo来解压lzo文件
wget www.lzop.org/download/lzop-1.04.tar.gz tar zxf lzop-1.04.tar.gz
cd lzop-1.04
/configure
make && make install
配置环境变量
lzop -V
输出这个就够了
测试hadoop上是否支持lzo文件了
上传你的lzo文件到hdfs上面
hdfs dfs -put file.lzo /… //后面那个指的是你HDFS上面的地址
然后text一下,如果能输出内容就是Hadoop支持lzo了
如果还是显示没有找到com.hadoop.compression.lzo.LzoCodec这个东西的话,就是你上面的步骤应该出错了
###来跑一波wc
我上一篇博文说过,lzo一般情况下是不支持分片的,不支持分片就没有了分布式的意义了,所以我们先来看下不支持分片下的lzo的怎么跑的
cd $HADOOP_HOME/share/hadoop/mapreduce
hadoop jar hadoop-mapreduce-examples-2.6.0-cdh5.7.0.jar wordcount /file.lzo /output_file //最后两个一个是你HDFS上面的lzo文件的放置地址,后面一个是你想将跑完的结果放到HDFS上的那个目录文件夹下,注意这个文件夹不用事先创建的,否则会报错的
仔细看控制台的输出,你会发现无论你文件多大
mapreduce.JobSubmitter: number of splits:1
这里都是1的
建立索引
要建立索引就要用到我们之前的那个jar包了
hadoop jar /home/hadoop/hadoop/share/hadoop/mapreduce/lib/hadoop-lzo-0.4.21-SNAPSHOT.jar com.hadoop.compression.lzo.LzoIndexer /your_lzofile_path
hadoop jar /home/hadoop/hadoop/share/hadoop/mapreduce/lib/hadoop-lzo-0.4.21-SNAPSHOT.jar com.hadoop.compression.lzo.DistributedLzoIndexer /your_lzofile_path
上面两种方法都可以,第二种快一点,所以会在lzo文件相同的目录下,所以你最好文件你这个要跑的lzo文件单独建一个目录,这个时候目录下有两个文件了,如果再跑一次wc的话,以这个目录为输入那么你将会看到
mapreduce.JobSubmitter: number of splits:2 这个输出了,但不要惊喜,这个时候还是没成功,hadoop只是把lzo和索引文件单独看成两个文件而已,我们还需要一个参数。
完成一次lzo的带索引的wc
hadoop jar hadoop-mapreduce-examples-2.6.0-cdh5.7.0.jar wordcount
-Dmapreduce.job.inputformat.class=com.hadoop.mapreduce.LzoTestInputFormat /input /output
就是添加这个参数了:-Dmapreduce.job.inputformat.class=com.hadoop.mapreduce.LzoTestInputFormat
好了,这个时候你就会看到你的mapreduce.JobSubmitter: number of splits:是多个了,说明你成果了