共计 2668 个字符,预计需要花费 7 分钟才能阅读完成。
前面的文章介绍了 Hadoop lzo 的安装和配置(见 http://www.linuxidc.com/Linux/2014-05/101090.htm),本文接着介绍 lzo 压缩在 hadoop 应用程序中的使用方法,包括在 mapreduce 程序,streaming 程序和 hive 中的使用。
————————————– 分割线 ————————————–
相关阅读 :
Ubuntu 13.04 上搭建 Hadoop 环境 http://www.linuxidc.com/Linux/2013-06/86106.htm
Ubuntu 12.10 +Hadoop 1.2.1 版本集群配置 http://www.linuxidc.com/Linux/2013-09/90600.htm
Ubuntu 上搭建 Hadoop 环境(单机模式 + 伪分布模式)http://www.linuxidc.com/Linux/2013-01/77681.htm
Ubuntu 下 Hadoop 环境的配置 http://www.linuxidc.com/Linux/2012-11/74539.htm
单机版搭建 Hadoop 环境图文教程详解 http://www.linuxidc.com/Linux/2012-02/53927.htm
Hadoop LZO 安装教程 http://www.linuxidc.com/Linux/2013-01/78397.htm
Hadoop 集群上使用 Lzo 压缩 http://www.linuxidc.com/Linux/2012-05/60554.htm
————————————– 分割线 ————————————–
1 给 lzo 文件建立索引
lzo 文件需要建立索引才能支持分块 (split)。
如果没有索引,lzo 文件也是可以处理的,mapreduce 会根据后缀名“.lzo”来对 lzo 文件解压,并且 inputformat 也不需要特别指定,但是不支持分块,整个 lzo 文件只用一个 map 来处理。
hadoop-lzo 包本身提供了建立 lzo 索引的类,可以在本地运行程序建立索引,也可以运行 mapreduce 程序建立索引。
本地运行程序建立索引
$HADOOP_HOMOE/bin/hadoop jar \
$HADOOP_HOMOE/share/hadoop/mapreduce/lib/hadoop-lzo-0.4.20-SNAPSHOT.jar \
com.hadoop.compression.lzo.LzoIndexer \
/hdfs/path/to/file.lzo
运行 mapreduce 程序建立索引
$HADOOP_HOMOE/bin/hadoop jar \
$HADOOP_HOMOE/share/hadoop/mapreduce/lib/hadoop-lzo-0.4.20-SNAPSHOT.jar \
com.hadoop.compression.lzo.DistributedLzoIndexer \
/hdfs/path/to/file.lzo
从类名 DistributedLzoIndexer 可以看出是通过 mapreduce 分布式程序来建立索引的。
两个程序运行成功之后,都会在 hdfs 目录 /hdfs/path/to/ 下生成一个索引文件 file.lzo.index。
2 在 mapreduce 程序中使用 lzo 压缩
把 inputformat 设置成 LzoTextInputFormat,
job.setInputFormatClass(LzoTextInputFormat.class);
注意,对于建立了索引的 lzo 文件,如果不把 inputformat 设置为 LzoTextInputFormat,会把索引文件也当做是输入文件。
另外,编译的时候需要引入 hadoop-lzo-0.4.20-SNAPSHOT.jar 包。如果是用 maven 编译,在 pom 文件中把这个依赖加上
<dependency>
<groupId>com.hadoop.gplcompression</groupId>
<artifactId>hadoop-lzo</artifactId>
<version>0.4.20</version>
</dependency>
3 在 streaming 程序中使用 lzo 压缩
把 inputformat 设置为 DeprecatedLzoTextInputFormat,还要设置参数 stream.map.input.ignoreKey=true,如
$HADOOP_HOME/bin/hadoop jar \
$HADOOP_HOME/share/hadoop/tools/lib/hadoop-streaming-2.2.0.jar \
-D stream.map.input.ignoreKey=true \
-inputformat com.hadoop.mapred.DeprecatedLzoTextInputFormat \
-input /path/to/input \
-output /path/to/output \
-mapper cat \
-reducer wc
如果不加上 stream.map.input.ignoreKey=true 参数,会把 map 的 key 值(key 值是行在文件中的偏移量,value 值是每行的文本)也会传入 mapper 程序中,这个 key 值我们是不需要的。
4 在 hive 中使用 lzo 压缩
同样在建表的时候需要指定 inputformat 为 DeprecatedLzoTextInputFormat,outputformat 为 HiveIgnoreKeyTextOutputFormat(这个是 hive 默认的,可以不用指定),如
create table lzo_test(
i int,
s string)
STORED AS INPUTFORMAT ‘com.hadoop.mapred.DeprecatedLzoTextInputFormat’
OUTPUTFORMAT ‘org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat’;
更多 Hadoop 相关信息见 Hadoop 专题页面 http://www.linuxidc.com/topicnews.aspx?tid=13