当前位置: 首页 > 面试题库 >

Hadoop流:映射器“包装”二进制可执行文件

万高洁
2023-03-14
问题内容

我有一个目前在大型大学计算机集群上运行的管道。出于发布目的,我想将其转换为mapreduce格式,以便任何人都可以使用hadoop集群(如亚马逊网络服务(AWS))运行它。管道当前由一系列Python脚本组成,这些Python脚本包装了不同的二进制可执行文件,并使用python子进程和tempfile模块管理输入和输出。不幸的是,我没有编写二进制可执行文件,并且其中许多不采用STDIN或不以“可用”方式发出STDOUT(例如,仅将其发送到文件中)。这些问题就是为什么我将大多数包装在python中的原因。

到目前为止,我已经能够修改我的Python代码,以使我拥有可以在本地计算机上以标准“测试格式”运行的映射器和化简器。

$ cat data.txt | mapper.py | reducer.py

映射器按照包装它的二进制文件的方式格式化每一行数据,使用subprocess.popen将文本发送到二进制文件(这也使我能够屏蔽很多虚假的STDOUT),然后收集所需的STOUT并对其进行格式化转换成适合减速器的文字行。当我尝试在本地hadoop安装上复制命令时,就会出现问题。我可以让映射器执行,但是它给出一个错误,表明它找不到二进制可执行文件。

main()中的文件“ /Users/me/Desktop/hadoop-0.21.0/./phyml.py”,第69行,文件“
/Users/me/Desktop/hadoop-0.21.0/./mapper.py”主phyml(无)文件“
/Users/me/Desktop/hadoop-0.21.0/./mapper.py”中第66行,在phyml中第46行,ft =
Popen(cli_parts,stdin = PIPE,stderr = PIPE ,stdout = PIPE)文件“
/Library/Frameworks/Python.framework/Versions/6.1/lib/python2.6/subprocess.py”,第621行,
init errread,errwrite)文件“ /Library/Frameworks/Python.framework
/Versions/6.1/lib/python2.6/subprocess.py“,行1126,在_execute_child中引发child_exception
OSError:[Errno 13]权限被拒绝

我的hadoop命令如下所示:

./bin/hadoop jar /Users/me/Desktop/hadoop-0.21.0/mapred/contrib/streaming/hadoop-0.21.0-streaming.jar \
-input /Users/me/Desktop/Code/AWS/temp/data.txt \
-output /Users/me/Desktop/aws_test \
-mapper  mapper.py \
-reducer  reducer.py \
-file /Users/me/Desktop/Code/AWS/temp/mapper.py \
-file /Users/me/Desktop/Code/AWS/temp/reducer.py \
-file /Users/me/Desktop/Code/AWS/temp/binary

如前所述,在我看来,映射器似乎不知道二进制文件-
也许它没有发送到计算节点?不幸的是,我无法真正分辨出问题所在。任何帮助将不胜感激。看到一些用python编写的打包二进制可执行文件的hadoop流映射器/还原器,将特别令人高兴。我无法想象我是第一个尝试这样做的人!实际上,这是另一条询问基本相同问题的帖子,但尚未得到答复。

Hadoop / Elastic Map
Reduce具有二进制可执行文件?


问题答案:

经过大量的搜索(等等)之后,我想出了如何包括可执行的二进制文件/脚本/模块,您的映射器/还原器可以访问这些文件。诀窍是先将所有文件上传到hadoop。

$ bin/hadoop dfs -copyFromLocal /local/file/system/module.py module.py

然后,您需要像以下模板一样格式化流命令:

$ ./bin/hadoop jar /local/file/system/hadoop-0.21.0/mapred/contrib/streaming/hadoop-0.21.0-streaming.jar \
-file /local/file/system/data/data.txt \
-file /local/file/system/mapper.py \
-file /local/file/system/reducer.py \
-cacheFile hdfs://localhost:9000/user/you/module.py#module.py \
-input data.txt \
-output output/ \
-mapper mapper.py \
-reducer reducer.py \
-verbose

如果要链接python模块,则需要将以下代码添加到mapper / reducer脚本中:

import sys 
sys.path.append('.')
import module

如果要通过子处理访问二进制文件,则命令应如下所示:

cli = "./binary %s" % (argument)
cli_parts = shlex.split(cli)
mp = Popen(cli_parts, stdin=PIPE, stderr=PIPE, stdout=PIPE)
mp.communicate()[0]

希望这可以帮助。



 类似资料:
  • 我有一个应用程序,创建每一行的文本文件,并将其转储到HDFS。这个位置反过来被用作hadoop流作业的输入目录。 预期映射器的数量将等于“输入文件拆分”,在我的例子中,这等于文件的数量。有些映射器没有被触发,我在流输出转储中看到了一个奇怪的问题: 原因:java.io.ioException:无法运行程序“/mnt/var/lib/hadoop/tmp/nm-local-dir/usercache

  • vendor 文件是什么? 任何一个 Composer 程序包想要传递给安装包的用户的命令行脚本都应该被列为 vendor 文件。 如果包包含了包用户不需要的其他脚本(如构建或编译脚本),则代码不应被列为 vendor 文件。 它是如何定义的? 它是通过将 bin 键添加到项目中来定义的 composer.json。它被指定为文件数组,因此可以为任何给定项目添加多个二进制文件。 { "bi

  • 问题内容: 我的用例如下: 我有一个仅地图的mapreduce作业,该作业需要一个输入文件,进行了大量的解析和调整,然后再写回。但是,某些行的格式可能正确也可能不正确,如果是这样,我想将原始行写入单独的文件中。 看来,执行此操作的一种方法是将文件名添加到我正在打印的行的前面,并使用multipleOutputFormat参数。例如,如果我最初有: 我可以改为: 此解决方案唯一的问题是我不希望fil

  • 我有一个应用程序,创建文本文件,每一行,并转储到HDFS。这个位置又被用作hadoop流作业的输入目录。 期望映射器的数量将等于“输入文件拆分”,在我的例子中,该拆分等于文件的数量。所有映射器都没有被触发,我在流输出转储中看到了一个奇怪的问题: 原因:java.io.ioException:无法运行程序“/mnt/var/lib/hadoop/tmp/nm-local-dir/usercache/

  • 问题 你想内存映射一个二进制文件到一个可变字节数组中,目的可能是为了随机访问它的内容或者是原地做些修改。 解决方案 使用 mmap 模块来内存映射文件。 下面是一个工具函数,向你演示了如何打开一个文件并以一种便捷方式内存映射这个文件。 import os import mmap def memory_map(filename, access=mmap.ACCESS_WRITE): siz

  • 我使用的是hadoop版本0.20和hadoop-core:1.2.0.jar 有没有可能使用新的hadoop API做到这一点?

  • 问题内容: 我为dlopen编写了一个程序 但我收到“分段错误”错误,我使用.so库测试了该程序,它可以工作,但无法使其自身运行 问题答案: 您需要编写代码: 仔细阅读dlopen(3),始终检查那里的&函数是否成功,并在失败时使用。 并用编译上面的文件 不要忘记获得所有警告和标志(以便能够将自己的符号放入动态表中)。 在我的Debian / Sid / x86-64系统上(版本4.8.2和版本2

  • 问题内容: 首先,我已经在Google上进行了搜索,但只找到了将压缩文件(例如)嵌入到Shell脚本中的示例。 基本上,如果我有一个打印字符串的C程序(),请说 Hello World! 。 我编译它以获得可执行的二进制文件 现在我有一个shell脚本 我要问的是是否有可能将二进制( hello )嵌入到shell脚本中,以便在我运行时 它执行二进制文件以打印 Hello World! 。 澄清