Hadoop-2.2.0使用lzo压缩文件作为输入文件

本文介绍如何在Hadoop2.2.0环境下利用lzo压缩文件,重点讨论了如何建立lzo文件索引来支持切分操作。此外,提供了在Mapreduce、Streaming和Hive中使用lzo文件的具体方法和注意事项。

 在 《Hadoop 2.2.0安装和配置lzo》 文章中介绍了如何基于 Hadoop 2.2.0安装lzo。里面简单介绍了如果在Hive里面使用lzo数据。今天主要来说说如何在Hadoop 2.2.0中使用lzo压缩文件当作的数据。
  lzo压缩默认的是不支持切分的,也就是说,如果直接把lzo文件当作Mapreduce任务的输入,那么Mapreduce只会用一个Map来处理这个输入文件,这显然不是我们想要的。其实我们只需要对lzo文件建立索引,这样这个lzo文件就会支持切分,也就可以用多个Map来处理lzo文件。我们可以用 《Hadoop 2.2.0安装和配置lzo》 文章中编译的hadoop-lzo-0.4.20-SNAPSHOT.jar包来对lzo文件建立索引(假如在/home/wyp/input目录下有个cite.txt.lzo文件,这个目录是在HDFS上):

1$ $HADOOP_HOMOE/bin/hadoop jar                 
2                 $HADOOP_HOMOE/share/hadoop/common/hadoop-lzo-0.4.20-SNAPSHOT.jar
3                 com.hadoop.compression.lzo.DistributedLzoIndexer
4                 /home/wyp/input/cite.txt.lzo

生成出来的索引文件后缀为.index,并存放在lzo同一目录下.在本例中产生的索引文件是存放在/home/wyp/input目录下,名称为cite.txt.lzo.index。

我们也可以用下面的方法对lzo文件来建立索引:

1$ $HADOOP_HOMOE/bin/hadoop jar                 
2              $HADOOP_HOMOE/share/hadoop/common/hadoop-lzo-0.4.20-SNAPSHOT.jar
3              com.hadoop.compression.lzo.LzoIndexer
4              /home/wyp/input/cite.txt.lzo

这个方法和上面方法产生出来的索引文件是一样的;但是上面的方法是通过启用Mapreduce任务来执行的,而这里的方法只在一台客户机上运行,效率很慢!

那么,如何在Mapreduce任务中使用lzo文件。下面分别对Mapreduce程序、Streaming程序以及Hive分别进行说明:

1、对于Mapreduce程序,我们需要把程序中所有的TextInputFormat修改为LzoTextInputFormat,如下:
1job.setInputFormatClass(TextInputFormat.class);
2 
3修改为
4 
5job.setInputFormatClass(LzoTextInputFormat.class);

LzoTextInputFormat类需要引入相应的包,如果你是使用pom文件,可以引入以下依赖:

1<dependency>
2            <groupId>com.hadoop.gplcompression</groupId>
3            <artifactId>hadoop-lzo</artifactId>
4            <version>0.4.19</version>
5</dependency>

如果你的输入格式不是LzoTextInputFormat类,那么Mapreduce程序将会把.index文件也当作是数据文件!修改完之后,需要重新编译你的Mapreduc程序。这样在运行Mapreduce程序的时候,将lzo文件所在的目录当作输入即可,Mapreduce程序会识别出.index文件的:

1$ /home/q/hadoop-2.2.0/bin/hadoop jar
2                                  statistics2.jar com.wyp.Sts
3                                  -Dmapreduce.job.queuename=queue1
4                                  /home/wyp/input
5                                  /home/wyp/resluts
2、对于Streaming程序来说,可以通过-inputformat指定输入的文件格式,使用如下:
1$ bin/hadoop jar
2             $HADOOP_HOMOE/share/hadoop/tools/lib/hadoop-streaming-2.2.0.jar
3             -inputformat com.hadoop.mapred.DeprecatedLzoTextInputFormat
4             -input /home/wyp/input
5             -output /home/wyp/results
6             -mapper /bin/cat
7             -reducer wc
对应Streaming作业还需要注意的是,使用DeprecatedLzoTextInputFormat输入格式,会把文本的行号当作key传送到reduce的,所以我们需要将行号去掉,可以用下面方法实现:

1$ bin/hadoop jar
2             $HADOOP_HOMOE/share/hadoop/tools/lib/hadoop-streaming-2.2.0.jar
3             -inputformat com.hadoop.mapred.DeprecatedLzoTextInputFormat
4             -input /home/wyp/input
5             -D stream.map.input.ignoreKey=true
6             -output /home/wyp/results
7             -mapper /bin/cat
8             -reducer wc
3、对于Hive,需要在建表的时候注意,如下:
1hive> create table lzo(
2    > id int,
3    > name string)
4    > STORED AS INPUTFORMAT 'com.hadoop.mapred.DeprecatedLzoTextInputFormat'
5    > OUTPUTFORMAT 'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat';
6OK
7Time taken: 3.423 seconds

注意4,5行代码。这样就可以使用lzo文件了,并支持分割。

转载于:https://my.oschina.net/u/1169079/blog/225071

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值