0

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

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

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

我目前正在尝试这个。

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

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

然后脚本通过标准输出结果吐出。

但是,我不知道如何将我的地图脚本更改为 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 文档

“如何使用 Hadoop Streaming 运行任意(半)独立的任务集?

通常,您不需要 Map Reduce 的全部功能,而只需要运行同一程序的多个实例——无论是在数据的不同部分,还是在相同的数据上,但参数不同。您可以使用 Hadoop Streaming 来执行此操作。"

如果这不可能,AmazonAWS 上是否有其他工具可以为我做到这一点?

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

4

2 回答 2

0

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

  • Hadoop 不知道自己如何处理图像文件
  • 映射器逐行从标准输入获取输入,因此您需要创建一个中间 shell 脚本,将图像数据从标准输入写入某个临时文件。然后传递给可执行文件的文件。

仅将目录位置传递给可执行文件并不是很有效,因为在这种情况下,您将失去数据局部性。我不想重复关于这个主题已经很好回答的问题,所以这里是链接:
使用 Amazon MapReduce/Hadoop 进行图像处理
Hadoop:如何访问要由 map/reduce 处理的(许多)照片图像?

另一种方法是将图像文件转换为 splittable SequenceFiles。即:每条记录将是序列文件中的一个图像。然后使用它作为输入格式,映射器将在他们获得的每条记录上调用可执行文件。请注意,您必须TaskTracker事先为节点提供正确的文件权限,以便它们可以从 java 代码中执行。
有关此主题的更多信息:
Hadoop:生成带有要在 map/reduce 中处理的图像二进制文件的 SequenceFile 的示例过程

于 2012-12-01T22:27:02.937 回答
0

我能够使用“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.

运行HadoopJob.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 ./<file location> ./<hadoop fs location>

于 2012-12-11T07:41:19.520 回答