Hadoop流:映射器“包装”二进制可执行文件
我有一个目前在大型大学计算机集群上运行的管道。出于发布目的,我想将其转换为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。
$ 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]
希望这可以帮助。