由于lzo的压缩/解压速度也比较快,合理的压缩率;支持split,是hadoop中最流行的压缩格式;支持hadoop native库;可以在linux系统下安装lzop命令,使用方便。
所以选lzo作为hadoop中hdfs的压缩文件的格式,但是lzo文件需要手动安装,下面介绍Hadoop的lzo插件的安装,以及测试是否安装成功。
在ambari环境中
1.hadoop-lzo-0.4.20-SNAPSHOT.jar需要放到/usr/hdp/2.2.6.0-2800/hadoop/下
2../libgplcompression.so.0.0.0
./libgplcompression.so.0
./libgplcompression.so
./libgplcompression.la
./libgplcompression.a需要放到/usr/hdp/2.2.6.0-2800/hadoop/lib/native/下
注意事项:本安装的软件的根目录都在/data/softwares(自己修改成自己的目录)
一、下载、解压并编译lzo包
[work@mie-bj-bigdata-webservice ~]$ sudo su -
//在编译lzo包的时候,需要一些环境,可以用下面的命令安装好lzo编译环境
[root@mie-bj-bigdata-webservice ~]$ yum -y install lzo-devel \
zlib-devel gcc autoconf automake libtool
[root@mie-bj-bigdata-webservice ~]$ cd /data/softwares
[root@mie-bj-bigdata-webservice softwares]$wget http://www.oberhumer.com/opensource/lzo/download/lzo-2.06.tar.gz
[root@mie-bj-bigdata-webservice softwares]$ tar -zxvf lzo-2.06.tar.gz
[root@mie-bj-bigdata-webservice softwares]$ cd lzo-2.06
[root@mie-bj-bigdata-webservice softwares]$ export CFLAGS=-m64
[root@mie-bj-bigdata-webservice softwares]$./configure -enable-shared -prefix=/data/softwares/lzo
[root@mie-bj-bigdata-webservice softwares]$ make && make install
//编译完lzo包之后,会在/data/softwares/lzo生成一些文件,目录结构如下:
[root@mie-bj-bigdata-webservice softwares]$ ls -l
total 12
drwxr-xr-x 3root root 4096Mar 2117:23include
drwxr-xr-x 2root root 4096Mar 2117:23lib
drwxr-xr-x 3root root 4096Mar 2117:23share
//将/data/softwares/lzo目录下的所有文件打包,并同步到集群中的所有机器上
二、安装Hadoop-LZO
// 这里下载的是Twitter hadoop-lzo,可以用Maven(如何安装Maven请参照http://www.iteblog.com/archives/775)进行编译
[root@mie-bj-bigdata-webservice softwares]$ wget https://github.com/twitter/hadoop-lzo/archive/master.zip
//下载后的文件名是master,它是一个zip格式的压缩包,可以进行解压:
[root@mie-bj-bigdata-webservice softwares]$ unzip master
//解压后的文件夹名为hadoop-lzo-master,hadoop-lzo-master中的pom.xml依赖了hadoop 2.4.0,由于我们这里用到的是Hadoop 2.6.4,所以建议将hadoop版本修改为2.6.4:
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<hadoop.current.version>2.6.4</hadoop.current.version>
<hadoop.old.version>1.0.4</hadoop.old.version>
</properties>
//然后进入hadoop-lzo-master目录,依次执行下面的命令
[root@mie-bj-bigdata-webservice hadoop-lzo-master]$ export CFLAGS=-m64
[root@mie-bj-bigdata-webservice hadoop-lzo-master]$ export CXXFLAGS=-m64
[root@mie-bj-bigdata-webservice hadoop-lzo-master]$ export C_INCLUDE_PATH=/data/softwares/lzo/include
[root@mie-bj-bigdata-webservice hadoop-lzo-master]$ export LIBRARY_PATH=/data/softwares/lzo/lib
[root@mie-bj-bigdata-webservice hadoop-lzo-master]$ mvn clean package -Dmaven.test.skip=true
[root@mie-bj-bigdata-webservice hadoop-lzo-master]$ tar -cBf - -C target/native/Linux-amd64-64/lib . | tar -xBvf - -C /data/softwares/hadoop/lib/native/
[root@mie-bj-bigdata-webservice hadoop-lzo-master]$ cp target/hadoop-lzo-0.4.20-SNAPSHOT.jar /data/softwares/hadoop/share/hadoop/common/
//其实在tar -cBf - -C target/native/Linux-amd64-64/lib . | tar -xBvf - -C /data/softwares/hadoop/lib/native/命令之后,会在native目录下生成一下几个文件:
[root@mie-bj-bigdata-webservice native]$ ls -l
-rw-r--r-- 1libgplcompression.a
-rw-r--r-- 1libgplcompression.la
lrwxrwxrwx 1libgplcompression.so -> libgplcompression.so.0.0.0
lrwxrwxrwx 1libgplcompression.so.0-> libgplcompression.so.0.0.0
-rwxr-xr-x 1libgplcompression.so.0.0.0
//其中libgplcompression.so和libgplcompression.so.0是链接文件,指向libgplcompression.so.0.0.0,将刚刚生成的libgplcompression*和target/hadoop-lzo-0.4.18-SNAPSHOT.jar同步到集群中的所有机器对应的目录。
三、配置Hadoop环境变量
1.在Hadoop中的$HADOOP_HOME/etc/hadoop/hadoop-env.sh加上下面配置:
export LD_LIBRARY_PATH=/data/softwares/lzo/lib
2.在$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,com.hadoop.compression.lzo.LzoCodec,com.hadoop.compression.lzo.LzopCodec,org.apache.hadoop.io.compress.BZip2Codec</value>
</property>
<property>
<name>io.compression.codec.lzo.class</name>
<value>com.hadoop.compression.lzo.LzoCodec</value>
</property>
3.在$HADOOP_HOME/etc/hadoop/mapred-site.xml加上如下配置
<property>
<name>mapred.compress.map.output</name>
<value>true</value>
</property>
<property>
<name>mapred.map.output.compression.codec</name>
<value>com.hadoop.compression.lzo.LzoCodec</value>
</property>
<property>
<name>mapred.child.env</name>
<value>LD_LIBRARY_PATH=/usr/local/hadoop/lzo/lib</value>
</property>
//将刚刚修改的配置文件全部同步到集群的所有机器上,并重启Hadoop集群,这样就可以在Hadoop中使用lzo。
四、hive如何使用lzo
这里在Hive中使用一下lzo,在hive中创建一个lzo表:
hive> create table lzo(id int,name string) ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t' STORED AS INPUTFORMAT 'com.hadoop.mapred.DeprecatedLzoTextInputFormat' OUTPUTFORMAT 'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat';
//先用yum install lzop安装linux的lzop打包工具
//然后在本地用lzo压缩一个文件,users.txt的内容的内容为
1 x
2 y
3 z
//将/root目录下面的users.txt压缩为users.txt.lzo
[root@mie-bj-bigdata-webservice ~]$ lzop users.txt
//将users.txt.lzo的数据导入到lzo表里面:
hive>load data local inpath '/root/users.txt.lzo'into table lzo;
//再查询看看lzo格式hive是否能解析
hive> select * from lzo;
//这样,我们就可以在Hive中使用lzo了