【问题标题】:Doing multiple mapreduce jobs in Python在 Python 中执行多个 mapreduce 作业
【发布时间】:2015-07-14 14:26:23
【问题描述】:

我目前正在编写在 Python 中的 hadoop 流上运行的代码。但是,我正在尝试做一个映射和两个归约工作。

当我尝试使用以下命令运行代码时,只有一个减速器 - 第一个 - 正在工作。

我正在使用这个命令:

hadoop jar /usr/hdp/2.2.0.0-2041/hadoop-mapreduce/hadoop-streaming.jar -Dmapreduce.job.queuename=user -Dmapreduce.map.memory.mb=4096 -Dmapreduce.map.java.opts=-Xmx3276m -Dmapred.output.compress=false -file mapper.py -file reducer_tf_hcuot.py -mapper mapper.py -reducer reducer_tf_hcuot.py -input text -output o_text

你能告诉我如何处理它吗?

【问题讨论】:

  • 欢迎来到stackoverflow!看起来您实际上并未在问题中包含命令或代码。
  • 请澄清您所说的“一个映射和两个归约工作”是什么意思
  • 我想运行一个映射器,然后运行两个减速器。
  • 根据我的经验,您可能必须运行 mapper、reducer、identity mapper,然后是第二个 reducer,但是我已经有一两年没有使用 hadoop,所以这可能已经过时了。编辑:我过去曾使用 yelp 的 Mrjob 来处理这样的一些流程(将多个工作捆绑在一起)。值得一看吗?

标签: python hadoop mapreduce hadoop-streaming


【解决方案1】:

在 hadoop 流中,一次只能运行 1 个 map 和 1 个 reduce 作业(目前)。

通过将第一个映射函数的输出通过管道传输到第二个映射函数,您基本上可以在一个作业中运行 2 个映射器(或任意数量的映射器)。

hadoop jar $HADOOP_JAR -mapper 'map1.py | map2.py | map3.py' -reducer 'reduce.py' ...

但是对于多个 reducer,正如 Ned Rockson 所说,通过在第二个作业中使用身份映射器,您将拥有 2 个独立的作业

hadoop jar $HADOOP_JAR -mapper 'map.py' -reducer 'reduce1.py' ...
hadoop jar $HADOOP_JAR -mapper '/bin/cat' -reducer 'reduce2.py' ...

【讨论】:

    【解决方案2】:

    这可能是你想要的:

    “hadoop-multiple-streaming 扩展了 Hadoop-Streaming,它是 Hadoop 发行版附带的实用程序。 该实用程序不仅允许您执行 Hadoop-Streaming,还允许您使用任何可执行文件或脚本为“一个”输入创建和运行“多个”Map/Reduce 作业。例如:

    hadoop jar hadoop-multiple-streaming.jar \  
      -input    myInputDirs \  
      -multiple "outputDir1|mypackage.Mapper1|mypackage.Reducer1" \  
      -multiple "outputDir2|mapper2.sh|reducer2.sh" \  
      -multiple "outputDir3|mapper3.py|reducer3.py" \  
      -multiple "outputDir4|/bin/cat|/bin/wc" \  
      -libjars  "libDir/mypackage.jar" \
      -file     "libDir/mapper2.sh" \  
      -file     "libDir/mapper3.py" \  
      -file     "libDir/reducer2.sh" \  
      -file     "libDir/reducer3.py"
    

    这个项目是maven项目。因此,您可以简单地执行 maven build 命令来制作 hadoop-multiple-streaming.jar 文件。更详细地说,'mvn clean package' 命令将编译源代码并打包到 ${project_home}/target 文件夹。”

    取自https://github.com/hyonaldo/hadoop-multiple-streaming

    【讨论】:

      【解决方案3】:

      按照前面所说的 'map1.py | map2.py | map3.py',这个不行,只能执行map1.py。

      正确的做法是使用mrjob(Python MapReduce 库),希望对您有所帮助

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-01-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多