一、读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上):
生成出来的索引文件后缀为.index,并存放在lzo同一目录下.在本例中产生的索引文件是存放在/home/wyp/input目录下,名称为cite.txt.lzo.index。
这个方法和上面方法产生出来的索引文件是一样的;但是上面的方法是通过启用Mapreduce任务来执行的,而这里的方法只在一台客户机上运行,效率很慢!
那么,如何在Mapreduce任务中使用lzo文件。下面分别对Mapreduce程序、Streaming程序以及Hive分别进行说明:
1、对于Mapreduce程序,我们需要把程序中所有的TextInputFormat修改为LzoTextInputFormat,如下:
LzoTextInputFormat类需要引入相应的包,如果你是使用pom文件,可以引入以下依赖:
如果你的输入格式不是LzoTextInputFormat类,那么Mapreduce程序将会把.index文件也当作是数据文件!修改完之后,需要重新编译你的Mapreduc程序。这样在运行Mapreduce程序的时候,将lzo文件所在的目录当作输入即可,Mapreduce程序会识别出.index文件的:
2、对于Streaming程序来说,可以通过-inputformat指定输入的文件格式,使用如下:
3、对于Hive,需要在建表的时候注意,如下:
二、写lzo
1.MapReduce
job.setInputFormatClass(TextInputFormat.class);
job.setOutputFormatClass(TextOutputFormat.class);
FileInputFormat.setInputPaths(job, new Path(otherArgs[0]));
FileOutputFormat.setOutputPath(job, new Path(otherArgs[1]));
FileOutputFormat.setCompressOutput(job, true);
FileOutputFormat.setOutputCompressorClass(job,LzopCodec.class);
int result = job.waitForCompletion(true)?0:1;
LzoIndexer lzoIndexer = new LzoIndexer(conf);
lzoIndexer.index(new Path(otherArgs[1]));
2、streaming
hadoop jar /usr/lib/hadoop-0.20-mapreduce/contrib/streaming/hadoop-streaming-2.0.0-mr1-cdh4.7.0.jar \
-D mapred.job.name="lzo $src_file" \
-D mapred.job.priority='LOW' \
-D mapred.reduce.tasks=1 \
-D mapred.textoutputformat.separator=, \
-D stream.map.output.field.separator=, \
-D mapred.output.compress=true \
-D mapred.output.compression.codec=com.hadoop.compression.lzo.LzopCodec \
-input $src_file \
-output $out_dir \
-mapper cat \
-reducer cat
hadoop fs -mv $out_dir/part-00000.lzo $dst_dir/$date_str.lzo && hadoop jar /opt/cloudera/parcels/HADOOP_LZO/lib/hadoop/lib/hadoop-lzo-cdh4-0.4.15-gplextras.jar com.hadoop.compression.lzo.DistributedLzoIndexer $dst_dir/$date_str.lzo