1.安装:
(1)安装依赖:
yum -y install lzo-devel zlib-devel gcc autoconf automake libtool
(2)安装maven
wget http://mirrors.hust.edu.cn/apache/maven/maven-3/3.5.3/binaries/apache-maven-3.5.3-bin.tar.gz tar -xzvf apache-maven-3.5.3-bin.tar.gz
修改环境变量 vi /etc/profile, 添加下面两句(路径按自己的写)
export MAVEN_HOME=/data/apache-maven-3.5.3 export PATH=$PATH:$MAVEN_HOME/bin source /etc/profile
(3)安装 lzop native library
wget http://www.oberhumer.com/opensource/lzo/download/lzo-2.06.tar.gz tar -zxvf lzo-2.06.tar.gz cd lzo-2.06 export CFLAGS=-m64 ./configure -enable-shared -prefix=/usr/local/hadoop/lzo/ make && sudo make install
编译完lzo包之后,会在/usr/local/hadoop/lzo/生成一些文件,将/usr/local/hadoop/lzo目录下的所有文件打 包,并同步到集群中的所有机器上。
(4)安装hadoop-lzo
wget https://github.com/twitter/hadoop-lzo/archive/master.zip unzip master cd hadoop-lzo-master
vi修改pom.xml文件,hadoop.current.version改成实际的hadoop版本(我测试用的是2.8.1))
<properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <hadoop.current.version>2.8.1</hadoop.current.version> <hadoop.old.version>1.0.4</hadoop.old.version> </properties>
执行命令
export ACFLAGS=-m64 export CXXFLAGS=-m64 export C_INCLUDE_PATH=/usr/local/hadoop/lzo/include export LIBRARY_PATH=/usr/local/hadoop/lzo/lib mvn clean package -Dmaven.test.skip=true cd target/native/Linux-amd64-64 tar -cBf - -C lib . | tar -xBvf - -C ~ cp ~/libgplcompression* $HADOOP_HOME/lib/native/
注意target下的包的版本号(这里测试是0.4.21,其他环境版本号会不同)
cp target/hadoop-lzo-0.4.21-SNAPSHOT.jar $HADOOP_HOME/share/hadoop/common/
执行完tar -cBf – -C lib . | tar -xBvf – -C ~后,会在~目录下生成一下几个文件,其中libgplcompression.so 和libgplcompression.so.0是链接文件,指向libgplcompression.so.0.0.0,将刚刚生成的libgplcompression* 和target/hadoop-lzo-0.4.21-SNAPSHOT.jar同步到集群中的所有机器对应的目录。
(5)hadoop中配置lzo
修改 $HADOOP_HOME/etc/hadoop/hadoop-env.sh,添加下面语句
export LD_LIBRARY_PATH=/usr/local/hadoop/lzo/lib
修改$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.LzopCodec, com.hadoop.compression.lzo.LzoCodec </value> </property> <!-- lzop --> <property> <name>io.compression.codec.lzo.class</name> <value>com.hadoop.compression.lzo.LzopCodec</value> </property>
修改$HADOOP_HOME/etc/hadoop/mapred-site.xml
<!--设置map中间结果使用 lzop 压缩--> <property> <name>mapreduce.map.output.compress</name> <value>true</value> </property> <property> <name>mapreduce.map.output.compress.codec</name> <value>com.hadoop.compression.lzo.LzopCodec</value> </property> <!--设置map/reduce 整个过程使用 lzop 压缩 --> <property> <name>mapreduce.output.fileoutputformat.compress</name> <value>true</value> </property> <!-- lzop --> <property> <name>mapreduce.output.fileoutputformat.compress.codec</name> <value>com.hadoop.compression.lzo.LzopCodec</value> </property> <property> <name>mapred.child.env</name> <value>LD_LIBRARY_PATH=/usr/local/hadoop/lzo/lib</value> </property>
(6)lzop 安装
wget http://www.lzop.org/download/lzop-1.03.tar.gz tar -xzvf lzop-1.03.tar.gz cd lzop-1.03 ./configure && make && make install
2.准备数据
(1)生成1w条数据保存在uuid.txt文件中
for i in {1..100000};do echo uuid${i} >> uuid.txt ;done
(2)生成lzo文件
lzop uuid.txt
(3)du -sh * 查看文件大小, lzo文件大约只有文本文件的38%左右大小
上传到hdfs上
hadoop dfs -mkdir /data/ hadoop dfs -put uuid.txt.lzo /data/
(4)生成lzo索引(注意jar的版本)
- 本地运行程序建立索引(比较慢): com.hadoop.compression.lzo.LzoIndexer
- mapreduce程序建立索引(比较快): com.hadoop.compression.lzo.DistributedLzoIndexer
$HADOOP_HOME/bin/hadoop jar $HADOOP_HOME/share/hadoop/common/hadoop-lzo-0.4.21-SNAPSHOT.jar com.hadoop.compression.lzo.DistributedLzoIndexer /data/uuid.txt.lzo
(5)hadoop dfs -ls /data/ 查看hdfs目录,索引已生成