desehawk 发表于 2015-2-9 23:26:03

Hadoop 2.x安装和配置lzo

问题导读 


1.为什么使用lzo?
2.如何安装配置lzo?
3.如何使用lzo?

static/image/hrline/4.gif





Hadoop经常用于处理大量的数据,如果期间的输出数据、中间数据能压缩存储,对系统的I/O性能会有提升。综合考虑压缩、解压速度、是否支持split,目前lzo是最好的选择。LZO(LZO是Lempel-Ziv-Oberhumer的缩写)是一种高压缩比和解压速度极快的编码,它的特点是解压缩速度非常快,无损压缩,压缩后的数据能准确还原,lzo是基于block分块的,允许数据被分解成chunk,能够被并行的解压。LZO库实现了许多有下述特点的算法:
  (1)、解压简单,速度非常快。
  (2)、解压不需要内存。
  (3)、压缩相当地快。
  (4)、压缩需要64 kB的内存。
  (5)、允许在压缩部分以损失压缩速度为代价提高压缩率,解压速度不会降低。
  (6)、包括生成预先压缩数据的压缩级别,这样可以得到相当有竞争力的压缩比。
  (7)、另外还有一个只需要8 kB内存的压缩级别。
  (8)、算法是线程安全的。
  (9)、算法是无损的。
本文针对Hadoop 2.2.0,介绍如何安装和使用lzo。

一、下载、解压并编译lzo包

$ 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/生成一些文件,目录结构如下:

$ ls -l
total 12
drwxr-xr-x 3 root root 4096 Mar 21 17:23 include
drwxr-xr-x 2 root root 4096 Mar 21 17:23 lib
drwxr-xr-x 3 root root 4096 Mar 21 17:23 share 将/usr/local/hadoop/lzo目录下的所有文件打包,并同步到集群中的所有机器上。

 在编译lzo包的时候,需要一些环境,可以用下面的命令安装好lzo编译环境

$ yum -y installlzo-devel   \
               zlib-develgcc autoconf automake libtool
二、安装Hadoop-LZO


这里下载的是Twitter hadoop-lzo,可以用Maven进行编译。
$ wget https://github.com/twitter/hadoop-lzo/archive/master.zip下载后的文件名是master,它是一个zip格式的压缩包,可以进行解压:

$ unzip master解压后的文件夹名为hadoop-lzo-master

当然,如果你电脑安装了git,你也可以用下面的命令去下载

$ git clone https://github.com/twitter/hadoop-lzo.git​
hadoop-lzo中的pom.xml依赖了hadoop2.1.0-beta,由于我们这里用到的是Hadoop 2.2.0,所以建议将hadoop版本修改为2.2.0:

<properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <hadoop.current.version>2.2.0</hadoop.current.version>
    <hadoop.old.version>1.0.4</hadoop.old.version>
</properties>
然后进入hadoop-lzo-master目录,依次执行下面的命令
$ export CFLAGS=-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/
$cp target/hadoop-lzo-0.4.18-SNAPSHOT.jar   \
                                 $HADOOP_HOME/share/hadoop/common/其实在tar -cBf – -C lib . | tar -xBvf – -C ~命令之后,会在~目录下生成一下几个文件:

$ ls -l
-rw-r--r--1 libgplcompression.a
-rw-r--r--1 libgplcompression.la
lrwxrwxrwx1 libgplcompression.so -> libgplcompression.so.0.0.0
lrwxrwxrwx1 libgplcompression.so.0 -> libgplcompression.so.0.0.0
-rwxr-xr-x1 libgplcompression.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=/usr/local/hadoop/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>
四、如何使用

这里在Hive中使用一下lzo,在hive中创建一个lzo表:

hive> create table lzo(
    > id int,
    > name string)
    > STORED AS INPUTFORMAT 'com.hadoop.mapred.DeprecatedLzoTextInputFormat'
    > OUTPUTFORMAT 'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat';
OK
Time taken: 3.423 seconds
如果在创建lzo表出现了如下错误:
FAILED: Error in metadata: Class not found:   \
com.hadoop.mapred.DeprecatedLzoTextInputFormat
FAILED: Execution Error,
return code 1 from org.apache.hadoop.hive.ql.exec.DDLTask请检查你的环境是否配置好。

然后在本地用lzo压缩一个文件,先看看users.txt的内容:

$ cat users.txt
1^Awyp
2^Azs
3^Als
4^Aww
5^Awyp2
6^Awyp3
7^Awyp4
8^Awyp5
9^Awyp6
10^Awyp7
11^Awyp8
12^Awyp5
13^Awyp9
14^Awyp20
$ lzop users.txt
$ ls -l users.txt*
-rw-r--r-- 1 wyp wyp 97Mar 25 15:40 users.txt
-rw-r--r-- 1 wyp wyp 154 Mar 25 15:40 users.txt.lzo
将users.txt.lzo的数据导入到lzo表里面:
hive> load data local inpath '/home/wyp/users.txt.lzo' into table lzo;
Copying data from file:/home/wyp/users.txt.lzo
Copying file: file:/home/wyp/users.txt.lzo
Loading data to table default.lzo
Table default.lzo stats: [num_partitions: 0, num_files: 1,
               num_rows: 0, total_size: 154, raw_data_size: 0]
OK
Time taken: 0.49 seconds
hive> select * from lzo;
OK
1        wyp
2        zs
3        ls
4        ww
5        wyp2
6        wyp3
7        wyp4
8        wyp5
9        wyp6
10        wyp7
11        wyp8
12        wyp5
13        wyp9
14        wyp20
Time taken: 0.244 seconds, Fetched: 14 row(s)
好了,我们可以在Hadoop中使用lzo了











原文链接:http://my.oschina.net/u/1169079/blog/225070


hery 发表于 2015-2-10 09:37:45

{:soso_e179:}

allenswf 发表于 2015-3-24 07:57:12

感谢楼主 点赞

peterzor 发表于 2015-8-7 16:16:42

正需要!!!
页: [1]
查看完整版本: Hadoop 2.x安装和配置lzo