hadoop lzo的使用方法

前面的文章介绍了hadoop lzo的安装和配置,本文接着介绍lzo压缩在hadoop应用程序中的使用方法,包括在mapreduce程序,streaming程序和hive中的使用。

1 给lzo文件建立索引

lzo文件需要建立索引才能支持分块(split)。

如果没有索引,lzo文件也是可以处理的,mapreduce会根据后缀名“.lzo”来对lzo文件解压,并且inputformat也不需要特别指定,但是不支持分块,整个lzo文件只用一个map来处理。

hadoop-lzo包本身提供了建立lzo索引的类,可以在本地运行程序建立索引,也可以运行mapreduce程序建立索引。

本地运行程序建立索引

1
2
3
4
$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程序建立索引

1
2
3
4
$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,

1
job.setInputFormatClass(LzoTextInputFormat. class );

注意,对于建立了索引的lzo文件,如果不把inputformat设置为LzoTextInputFormat,会把索引文件也当做是输入文件。

另外,编译的时候需要引入hadoop-lzo-0.4.20-SNAPSHOT.jar包。如果是用maven编译,在pom文件中把这个依赖加上

1
2
3
4
5
< 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,如

1
2
3
4
5
6
7
8
$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默认的,可以不用指定),如

1
2
3
4
5
create  table  lzo_test(
     int ,
     s string)
     STORED  AS  INPUTFORMAT  'com.hadoop.mapred.DeprecatedLzoTextInputFormat'
     OUTPUTFORMAT  'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat' ;

参考资料:

https://github.com/twitter/hadoop-lzo

https://github.com/kevinweil/hadoop-lzo

http://www.cloudera.com/blog/2009/11/17/hadoop-at-twitter-part-1-splittable-lzo-compression/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值