微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

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

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

希望这可以帮助。

解决方法

我有一个目前在大型大学计算机集群上运行的管道。出于发布目的,我想将其转换为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流映射器/还原器,将特别令人高兴。我无法想象我是第一个尝试这样做的人!实际上,这是另一条询问基本相同问题的帖子,但尚未得到答复。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。