【问题标题】:How to get filename when running mapreduce job on EC2?在 EC2 上运行 mapreduce 作业时如何获取文件名?
【发布时间】:2011-12-25 20:38:51
【问题描述】:

我正在学习弹性 mapreduce,并从 Amazon 教程部分中提供的 Word Splitter 示例开始(代码如下所示)。该示例为提供的所有输入文档中的所有单词生成字数。

但我想通过文件名获得字数的输出,即仅在一个特定文档中的字数。由于用于字数统计的 python 代码从标准输入获取输入,我如何判断哪个输入行来自哪个文档?

谢谢。

#!/usr/bin/python

import sys
import re

def main(argv):
  line = sys.stdin.readline()
  pattern = re.compile("[a-zA-Z][a-zA-Z0-9]*")
  try:
    while line:
      for word in  pattern.findall(line):
        print  "LongValueSum:" + word.lower() + "\t" + "1"
      line =  sys.stdin.readline()
  except "end of file":
    return None
if __name__ == "__main__":
  main(sys.argv)

【问题讨论】:

    标签: python amazon-ec2 mapreduce amazon-emr


    【解决方案1】:

    在典型的 WordCount 示例中,地图文件正在处理的文件名被忽略,因为作业输出包含所有输入文件的合并字数,而不是文件级别的。但是要获得文件级别的字数,必须使用输入文件名。使用 Python 的映射器可以使用 os.environ["map.input.file"] 命令获取文件名。任务执行环境变量列表为here

    映射器不只是将键/值对发送为<Hello, 1>,还应该包含正在处理的输入文件名。以下可以是地图<input.txt, <Hello, 1>>发出的,其中input.txt是key,<Hello, 1>是value。

    现在,特定文件的所有字数将由单个 reducer 处理。然后,reducer 必须聚合该特定文件的字数。

    像往常一样,Combiner 将有助于减少映射器和化简器之间的网络通信,并更快地完成工作。

    查看Data-Intensive Text Processing with MapReduce 了解更多关于文本处理的算法。

    【讨论】:

    • 感谢您的解释!我浏览了您的博客,您向初学者推荐了“Hadoop the Defn 指南”一书。但正如你提到的,我需要以 MapReduce 的方式思考。有什么好的来源吗?这本书也足以学习 Hadoop 开发吗?
    • 检查 MR (goo.gl/kECuV) 解决的不同问题。浏览 Google 的 MR 视频 (goo.gl/RRoVP)。 《Hadoop : The Definitive Guide》这本书就像 Hadoop 的圣经。还有“Apress : Pro Hadoop”(goo.gl/VTcfa),但我不喜欢这种风格。
    • 仅供参考,在较新版本的 Hadoop 中,变量是 map_input_file。 (2.0.2的情况。)
    • @PraveenSripati 我尝试使用您提供的帮助,但出现以下错误。 input_file = os.environ["map.input.file"] 文件 "/usr/lib64/python2.7/UserDict.py",第 23 行,在 getitem 中引发 KeyError(key) KeyError: ' map.input.file'
    猜你喜欢
    • 1970-01-01
    • 2014-06-15
    • 2014-01-21
    • 1970-01-01
    • 2019-03-26
    • 1970-01-01
    • 1970-01-01
    • 2013-01-16
    • 1970-01-01
    相关资源
    最近更新 更多