如何将Hadoop Streaming与LZO压缩序列文件一起使用?

时间:2011-02-20 23:46:53

标签: hadoop mapreduce amazon-emr

我正在尝试使用亚马逊的Elastic Map Reduce来使用Google ngrams数据集。在http://aws.amazon.com/datasets/8172056142375670有一个公共数据集,我想使用Hadoop流式传输。

对于输入文件,它说“我们将数据集存储在Amazon S3中的单个对象中。文件是序列文件格式,块级LZO压缩。序列文件键是存储为数据集的行号。 LongWritable和值是存储为TextWritable的原始数据。“

为了使用Hadoop Streaming处理这些输入文件,我需要做什么?

我尝试在我的参数中添加一个额外的“-inputformat SequenceFileAsTextInputFormat”,但这似乎不起作用 - 我的工作因某些未指明的原因而一直失败。我还缺少其他论据吗?

我尝试使用非常简单的身份作为我的mapper和reducer

#!/usr/bin/env ruby

STDIN.each do |line|
  puts line
end

但这不起作用。

4 个答案:

答案 0 :(得分:6)

lzo被打包为弹性mapreduce的一部分,因此无需安装任何东西。

我刚试过这个并且有效......

 hadoop jar ~hadoop/contrib/streaming/hadoop-streaming.jar \
  -D mapred.reduce.tasks=0 \
  -input s3n://datasets.elasticmapreduce/ngrams/books/20090715/eng-all/1gram/ \
  -inputformat SequenceFileAsTextInputFormat \
  -output test_output \
  -mapper org.apache.hadoop.mapred.lib.IdentityMapper

答案 1 :(得分:3)

由于许可问题,Lzo压缩已从Hadoop 0.20.x开始删除。如果要处理lzo压缩序列文件,必须在hadoop集群中安装和配置lzo本机库。

Kevin的Hadoop-lzo项目是我所知道的当前工作解决方案。我试过了。它有效。

在OS上安装(如果没有这样)lzo-devel软件包。这些软件包可以在操作系统级别实现lzo压缩,否则hadoop lzo压缩将无法工作。

按照hadoop-lzo自述文件中指定的说明进行编译。构建之后,你会得到hadoop-lzo-lib jar和hadoop lzo本地库。确保从配置了群集的计算机(或同一个拱门的计算机)进行编译。

还需要Hadoop标准本机库,默认情况下已在Linux发行版中提供。如果你正在使用solaris,你还需要从源代码构建hadoop以获得标准的hadoop本机库。

完成所有更改后重新启动群集。

答案 2 :(得分:1)

您可能需要查看此https://github.com/kevinweil/hadoop-lzo

答案 3 :(得分:0)

我有奇怪的结果使用lzo并且我的问题可以通过其他一些编解码器来解决

-D mapred.map.output.compression.codec=org.apache.hadoop.io.compress.SnappyCodec
-D mapred.output.compression.codec=org.apache.hadoop.io.compress.SnappyCodec

然后事情才有效。您不需要(也可能不应该)更改-inputformat

Version: 0.20.2-cdh3u4, 214dd731e3bdb687cb55988d3f47dd9e248c5690