【问题标题】:Use Hadoop Streaming to run binary via script使用 Hadoop Streaming 通过脚本运行二进制文件
【发布时间】:2012-11-30 20:55:16
【问题描述】:

我是 Hadoop 新手,我正在尝试找出一种方法来执行以下操作:

  1. 我有多个输入图像文件。
  2. 我有处理这些文件的二进制可执行文件。
  3. 这些二进制可执行文件将文本文件作为输出写入。
  4. 我有一个包含所有这些可执行文件的文件夹。
  5. 我有一个脚本,它以特定顺序运行所有这些可执行文件,并将图像位置作为参数传递。

我的问题是:我可以使用 Hadoop 流通过这些二进制文件处理这些图像并从文本文件中输出结果吗?

我目前正在尝试这个。

我的 Hadoop 集群正在运行。我通过二进制文件和我的图像上传到 HDFS。

我已经设置了一个脚本,当 hadoop 运行时应该将目录更改为包含图像的文件夹并执行另一个执行二进制文件的脚本。

然后脚本通过 stdout 吐出结果。

但是,我不知道如何将我的地图脚本更改为 HDFS 上的图像文件夹,然后执行其他脚本。

谁能给我一个提示?

    sudo ./hadoop/bin/hadoop jar ../hduser/hadoop/contrib/streaming/hadoop-streaming-1.1.0.jar \
-numReduceTasks 0 \
-file /home/hduser/RunHadoopJob.sh \
-input  /user/hduser/7posLarge \
-output /user/hduser/output5 \
-mapper RunHadoopJob.sh  \
-verbose

还有我的 RunHadoopJob.sh:

#!/bin/bash
cd /user/hduser/7posLarge/;
/user/hduser/RunSFM/RunSFM.sh;

我的 HDFS 如下所示:

hadoop fs -ls
Warning: $HADOOP_HOME is deprecated.

Found 4 items
drwxr-xr-x   - hduser supergroup          0 2012-11-28 17:32 /user/hduser/7posLarge
drwxr-xr-x   - hduser supergroup          0 2012-11-28 17:39 /user/hduser/RunSFM
drwxr-xr-x   - root   supergroup          0 2012-11-30 14:32 /user/hduser/output5

我知道这不是 MapReduce 的标准用法。我只是在寻找一种方法,无需编写太多开销即可在具有不同输入的同一程序的不同集群上启动多个作业。看起来这是可能的看Hadoop Streaming documentation

"如何使用 Hadoop Streaming 运行任意一组 (半)独立任务?

通常您不需要 Map Reduce 的全部功能,而只需要 运行同一程序的多个实例 - 在不同的部分上 的数据,或在相同的数据上,但具有不同的参数。你 可以使用 Hadoop Streaming 来做到这一点。 "

如果这是不可能的,AmazonAWS 上是否有其他工具可以为我做这件事?

更新: 看起来有类似的解决方案,但我很难遵循它们。他们是herehere

【问题讨论】:

    标签: hadoop hadoop-streaming


    【解决方案1】:

    在处理 Hadoop 流和二进制文件时存在几个问题:

    • Hadoop 不知道自己如何处理图像文件
    • mappers 正在逐行从标准输入中获取输入,因此您需要创建一个中间 shell 脚本来写入图像 从标准输入到某个温度的数据。然后通过的文件 到可执行文件。

    仅仅将目录位置传递给可执行文件并不是很有效,因为在这种情况下,您将失去数据的局部性。我不想重复关于这个主题已经很好回答的问题,所以这里是链接:
    Using Amazon MapReduce/Hadoop for Image Processing
    Hadoop: how to access (many) photo images to be processed by map/reduce?

    另一种方法是将图像文件转换为可拆分的SequenceFiles。即:每条记录将是 SequenceFile 中的一个图像。然后使用它作为输入格式,映射器将在他们获得的每条记录上调用可执行文件。请注意,您必须事先向 TaskTracker 节点提供正确的文件权限,以便它们可以从 java 代码中执行。
    有关此主题的更多信息:
    Hadoop: Example process to generating a SequenceFile with image binaries to be processed in map/reduce

    【讨论】:

      【解决方案2】:

      我能够使用“hack”来制作解决方法的原型。

      我仍在尝试此方法,我认为这不适用于弹性集群,因为您必须根据集群的操作系统架构重新编译二进制文件。但是,如果您有一个私有集群,这可能是一个解决方案。

      使用 hadoop 流,您可以将二进制文件打包成 .jar 文件并将它们发送到节点,然后在脚本运行之前将它们解包。

      我在 pics.jar 中有我的图像,我的程序处理在 BinaryProgramFolder.jar 中启动程序的目录中找到的所有图像。在文件夹中,我有一个启动程序的脚本。

      我的流式传输作业将图像和二进制程序 + 脚本发送到节点并启动它们。同样,这是一种变通方法......不是解决问题的“真正”解决方案。

      所以,

      sudo ./hadoop/bin/hadoop jar ../hduser/hadoop/contrib/streaming/hadoop-streaming-1.1.0.jar \
          -archives 'hdfs://master:54310/user/hduser/pics.jar#pics','hdfs://master:54310/user/hduser/BinaryProgramFolder.jar#BinaryProgramFolder' \
          -numReduceTasks 0 \
          -file /home/hduser/RunHadoopJob.sh \
          -input  /user/hduser/input.txt \
          -output /user/hduser/output \
          -mapper RunHadoopJob.sh  \
          -verbose
      

      填充输入文件text.txt:

      Filler text for streaming job.
      

      RunHadoopJob.sh

      cp -Hr BinaryProgramFolder ./pics; #copy a sym link to your unpacked program folder into your pics directory.
      cd ./pics;
      ./BinaryProgramFolder/BinaryProgramLauncScript.sh <params>; #lunch your program following the symlink to the programs folder, I also used a script to launch my bin program which was in the same folder as the launch script.
      

      注意:您必须先将程序和图像放入 jar 存档中,然后将它们复制到 HDFS。使用hadoop fs -copyFromLocal ./&lt;file location&gt; ./&lt;hadoop fs location&gt;

      【讨论】:

        猜你喜欢
        • 2011-04-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-08-06
        • 2015-08-27
        • 2020-09-12
        • 2017-05-31
        • 1970-01-01
        相关资源
        最近更新 更多