Hadoop使用lzo格式-问题汇总

原创 2013年12月02日 20:46:02

需要注意的是,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

相关文章推荐

Hadoop2.2.0+hive使用LZO压缩那些事

废话不多说,我在apache Hadoop2.2.0测试集群上配置支持使用LZO进行压缩的时候,遇到很多坑,不过最后到搞定了,这里把具体过程记录下来,以供参考。 环境: Centos6.4 64位 H...

运行一个Hadoop Job所需要指定的属性

1、设置job的基础属性 Job job = new Job(); job.setJarByClass(***.class); job.setJobName(“job name”); job.setN...

mapreduce 读写Lzo

1.读lzo文件 需要添加以下代码,并导入lzo相关的jar包 job.setInputFormatClass(LzoTextInputFormat.class); 2.写lzo文件 ...

hadoop中使用lzo的压缩

在hadoop中使用lzo的压缩算法可以减小数据的大小和数据的磁盘读写时间,不仅如此,lzo是基于block分块的,这样他就允许数据被分解成chunk,并行的被hadoop处理。这样的特点,就可以让l...

对TextFile格式文件的lzo压缩建立index索引

hadoop中可以对文件进行压缩,可以采用gzip、lzo、snappy等压缩算法。 对于lzo压缩,常用的有LzoCodec和lzopCodec,可以对sequenceFile和TextFile进...

LzoIndexer对TextFile格式文件的lzo压缩建立index索引

hadoop中可以对文件进行压缩,可以采用gzip、lzo、snappy等压缩算法。 对于lzo压缩,常用的有LzoCodec和lzopCodec,可以对sequenceFile和TextFil...

hadoop支持lzo完整过程

简介 部署 安装lzop native library 安装hadoop-lzo 配置hadoop环境变量 验证lzo通过hive测试 创建lzo表 导入数据 索引LZO文件 利用hive执行mr任务...
  • meiyuli
  • meiyuli
  • 2015年12月21日 19:49
  • 3388

Hadoop集群上使用Lzo压缩

转载地址:http://www.tech126.com/hadoop-lzo/ 自从Hadoop集群搭建以来,我们一直使用的是Gzip进行压缩 当时,我对gzip压缩过的文件和原始的log...

hive中使用lzo

1,创建表的时候指定为lzo格式 CREATE EXTERNAL TABLE foo (      columnA string,      columnB string ) PART...
  • wisgood
  • wisgood
  • 2015年04月08日 10:16
  • 2004

hadoop lzo并行map

Hadoop集群中启用了lzo后,还需要一些配置,才能使集群能够对单个的lzo文件进行并行的map操作,以提升job的执行速度。 首先,要为lzo文件创建index。下面的命令对某个目录里的lz...
  • wisgood
  • wisgood
  • 2013年11月30日 18:31
  • 1417
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Hadoop使用lzo格式-问题汇总
举报原因:
原因补充:

(最多只允许输入30个字)