欢迎关注Hadoop、Spark、Flink、Hive、Hbase、Flume等大数据资料分享微信公共账号:iteblog_hadoop
  1. 文章总数:978
  2. 浏览总数:11,966,593
  3. 评论:3937
  4. 分类目录:106 个
  5. 注册用户数:6126
  6. 最后更新:2018年12月15日
过往记忆博客公众号iteblog_hadoop
欢迎关注微信公众号:
iteblog_hadoop
大数据技术博客公众号bigdata_ai
大数据猿:
bigdata_ai

Hadoop-2.2.0使用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上):

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

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

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

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

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

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

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

修改为

job.setInputFormatClass(LzoTextInputFormat.class);

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

<dependency>
            <groupId>com.hadoop.gplcompression</groupId>
            <artifactId>hadoop-lzo</artifactId>
            <version>0.4.19</version>
</dependency>

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

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

$ bin/hadoop jar 
             $HADOOP_HOMOE/share/hadoop/tools/lib/hadoop-streaming-2.2.0.jar 
             -inputformat com.hadoop.mapred.DeprecatedLzoTextInputFormat 
             -input /home/wyp/input
             -D stream.map.input.ignoreKey=true 
             -output /home/wyp/results 
             -mapper /bin/cat 
             -reducer wc
3、对于Hive,需要在建表的时候注意,如下:
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

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

本博客文章除特别声明,全部都是原创!
转载本文请加上:转载自过往记忆(https://www.iteblog.com/)
本文链接: 【Hadoop-2.2.0使用lzo压缩文件作为输入文件】(https://www.iteblog.com/archives/996.html)
喜欢 (8)
分享 (0)
发表我的评论
取消评论

表情
本博客评论系统带有自动识别垃圾评论功能,请写一些有意义的评论,谢谢!
(7)个小伙伴在吐槽
  1. 请问,我在设置setInputFormat(LzoTextInputFormat.class)时,eclipse报错The method setInputFormat(Class<? extends InputFormat>) in the type JobConf is not applicable for the arguments (Class<LzoTextInputFormat>)我加入的jar包如下import org.apache.hadoop.fs.Path;import org.apache.hadoop.io.IntWritable;import org.apache.hadoop.io.LongWritable;import org.apache.hadoop.io.NullWritable;import org.apache.hadoop.io.Text;import org.apache.hadoop.mapred.FileInputFormat;import org.apache.hadoop.mapred.FileOutputFormat;import org.apache.hadoop.mapred.InputFormat;import org.apache.hadoop.mapred.JobClient;import org.apache.hadoop.mapred.JobConf;import org.apache.hadoop.mapred.MapReduceBase;import org.apache.hadoop.mapred.Mapper;import org.apache.hadoop.mapred.OutputCollector;import org.apache.hadoop.mapred.Reporter;import org.apache.hadoop.mapred.TextOutputFormat;import com.hadoop.mapreduce.LzoTextInputFormat;这是什么情况?
    Rec_Jimmy2015-11-22 00:45 回复
    • 传进JobConf的setInputFormat方法的参数和签名不一致。
      w3970907702015-11-24 11:36 回复
      • 签名是什么意思?我是新手不是很懂,麻烦讲的清楚一点,谢谢~
        Rec_Jimmy2015-11-24 12:22 回复
        • 就是函数要求的类型和你传进去的类型不一致。
          w3970907702015-11-24 13:35 回复
          • 我传的是lzo文件,按道理添加了hadoop-lzo的jar包不就应该可以了嘛?
            Rec_Jimmy2015-11-24 13:37
        • 按道理是这样的,你代码编译是没问题吗?如果是运行时候出现的问题,可能是因为你运行的时候类库依赖有问题了。
          w3970907702015-11-24 13:52 回复
          • 那没有哦,就在eclipse里面提示错误,我hadoop上用别的方式跑过了,是可以跑lzo文件的
            Rec_Jimmy2015-11-24 13:53