gpt4 book ai didi

Hadoop 流媒体 API : how to remove unwanted delimiters

转载 作者:可可西里 更新时间:2023-11-01 14:59:08 24 4
gpt4 key购买 nike

假设我在 HDFS 上有一个文件:

1
2
3

我想把它变成

a
b
c

我写了一个mapper.py:

#!/usr/bin/python
import sys
for line in sys.stdin:
print chr(int(line) + ord('a') - 1)

然后使用流媒体 api:

hadoop jar $HADOOP_HOME/contrib/streaming/hadoop-streaming-*.jar \
-mapper mapper.py -file mapper.py -input /input -output /output

但是/output 中的结果是 "a\t\nb\t\nc\t\n":

a\t
b\t
c\t

注意那些额外的不可打印的制表符,我用'\t'代替。已记录 here :

If there is no tab character in the line, then entire line is considered as key and the value is null.

所以标签是通过流式 api 作为分隔符添加的。但是无论我如何修改分隔符相关的选项,我都无法让它消失。

因此我的问题是,有没有一种方法可以干净利落地完成这项工作,而无需像标签这样的额外东西?

或者更清楚地说,有没有一种方法可以将 hadoop 用作分布式过滤器,而忽略其键/值机制?

====

更新@2013.11.27

正如我和 friend 讨论的那样,没有简单的方法可以实现这个目标,我通过在输出中使用制表符作为字段分隔符来解决这个问题,并在配置单元中也将制表符设置为字段分隔符。

我的一些 friend 建议使用 -D mapred.textoutputformat.ignoreseparator=true,但该参数不起作用。我调查了这个文件:

hadoop-1.1.2/src/mapred/org/apache/hadoop/mapred/TextOutputFormat.java

并没有找到该选项。但作为替代解决方案,流式 api 接受参数 -outputformat 指定另一种输出格式。

根据 this article ,你可以复制TextOutputFormat.java,去掉默认的'\t',编译它,然后将它打包成一个jar,并用-libjars yourjar.jar -outputformat path.to.your调用streaming api .输出格式。但是我在 hadoop-1.1.2 上并没有成功。写下来供其他人引用。

最佳答案

您应该能够通过指定您的作业是仅限 map 的作业来摆脱这些分隔符 - 这实际上是您希望成为分布式过滤器的内容,并且您的映射器的输出将是最终输出。

要在 Hadoop 流中执行此操作,您可以使用以下选项:

-D mapred.reduce.tasks=0

所以对于完整的命令,这看起来像这样:

hadoop jar $HADOOP_HOME/contrib/streaming/hadoop-streaming-*.jar -D mapred.reduce.tasks=0 -mapper mapper.py -file mapper.py -input /input -output /output

关于Hadoop 流媒体 API : how to remove unwanted delimiters,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20137618/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com