Hadoop使用lzo格式-问题汇总

需要注意的是,lzo本身是不支持split的。故如果需要使用lzo,一般有2种办法:

1)合理控制生成的lzo大小,建议不要超过一个block大小。因为如果没有lzo的index文件,该lzo会由一个map处理。如果lzo过大,会导致某个map处理时间过长。

2)配合lzo.index文件使用。好处是文件大小不受限制,可以将文件设置的稍微大点,这样有利于减少文件数目。坏处是生成lzo.index文件本身需要开销。


1、给lzo文件建立索引


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' ;


0

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值