Hadoop lzo的使用方法

--------------------------------------分割线 --------------------------------------

相关阅读

--------------------------------------分割线 --------------------------------------
 
1 给lzo文件建立索引

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

如果没有索引,lzo文件也是可以处理的,mapreduce会根据后缀名“.lzo”来对lzo文件解压,并且inputformat也不需要特别指定,但是不支持分块,整个lzo文件只用一个map来处理。
 
hadoop-lzo包本身提供了建立lzo索引的类,可以在本地运行程序建立索引,也可以运行mapreduce程序建立索引。

本地运行程序建立索引

$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程序建立索引

$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,

job.setInputFormatClass(LzoTextInputFormat.class);


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

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


<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,如


$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默认的,可以不用指定),如


create table lzo_test(

    i int,

    s string)

    STORED AS INPUTFORMAT 'com.hadoop.mapred.DeprecatedLzoTextInputFormat'

    OUTPUTFORMAT 'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat';

相关推荐