使用 python MRJob 在 EMR 上引导库
Posted
技术标签:
【中文标题】使用 python MRJob 在 EMR 上引导库【英文标题】:Bootstrapping libraries on EMR using python MRJob 【发布时间】:2014-05-03 05:15:26 【问题描述】:问题陈述:
我正在尝试使用 python MRJob 库在 Amazon EMR 中运行 map-reduce 作业,但在使用必需的库和包引导节点时遇到了问题。
详情:
我的示例python mrjob
代码:
import re
from mrjob.job import MRJob
from sentClassifier import sentClassify
import nltk
.. do something ..
有一些像 NLTK 这样的库需要导入,还有一些我正在导入的本地模块,比如 from sentClassifier import sentClassify
我想知道引导 EMR 节点以使这些方法和包可用的最佳方法是什么。该代码在我的本地机器上运行良好。
我的样本mrjob.conf
文件:
runners:
emr:
aws_access_key_id: ***
aws_secret_access_key: ***
ec2_core_instance_type: m1.large
ec2_key_pair: mykey
ec2_key_pair_file: mykey.pem
num_ec2_core_instances: 5
pool_wait_minutes: 2
pool_emr_job_flows: true
ssh_tunnel_is_open: true
ssh_tunnel_to_job_tracker: true
hadoop:
setup:
- virtualenv venv
- . venv/bin/activate
- pip install mr3po simplejson
- sudo easy_install https://code.google.com/p/nltk/downloads/detail?name=nltk-2.0b9-py2.6.egg&can=2&q=
但是工作失败了。
我已经阅读了以下参考资料并尝试了他们所有的各种方法,但仍然没有运气:
MRJob documentation EMR Runner configuration MRJob documentation Hadoop Runner configuration Salmon Run's blog post错误日志:
Scanning SSH logs for probable cause of failure
Probable cause of failure (from ssh://ec2-54-86-50-115.compute-1.amazonaws.com!172.31.19.60/mnt/var/log/hadoop/userlogs/job_201405030101_0006/attempt_201405030101_0006_m_000002_3/stderr):
Traceback (most recent call last):
File "obidroidMR.py", line 5, in <module>
import nltk
ImportError: No module named nltk
(while reading from s3://mrjob- 51b9493c1a467671/tmp/obidroidMR.shreyas.20140503.012933.336228/files/STDIN)
Attempting to terminate job...
Job appears to have already been terminated
Killing our SSH tunnel (pid 12909)
Traceback (most recent call last):
File "obidroidMR.py", line 107, in <module>
ObidroidReview.run()
File "/Users/shreyas/anaconda/envs/obidroid/lib/python2.7/site-packages/mrjob/job.py", line 494, in run
mr_job.execute()
File "/Users/shreyas/anaconda/envs/obidroid/lib/python2.7/site-packages/mrjob/job.py", line 512, in execute
super(MRJob, self).execute()
File "/Users/shreyas/anaconda/envs/obidroid/lib/python2.7/site-packages/mrjob/launch.py", line 147, in execute
self.run_job()
File "/Users/shreyas/anaconda/envs/obidroid/lib/python2.7/site-packages/mrjob/launch.py", line 208, in run_job
runner.run()
File "/Users/shreyas/anaconda/envs/obidroid/lib/python2.7/site-packages/mrjob/runner.py", line 458, in run
self._run()
File "/Users/shreyas/anaconda/envs/obidroid/lib/python2.7/site-packages/mrjob/emr.py", line 809, in _run
self._wait_for_job_to_complete()
File "/Users/shreyas/anaconda/envs/obidroid/lib/python2.7/site-packages/mrjob/emr.py", line 1599, in _wait_for_job_to_complete
raise Exception(msg)
Exception: Job on job flow j-2R8G1Q3RIE9ED failed with status WAITING: Waiting after step failed
Probable cause of failure (from ssh://ec2-54-86-50-115.compute-1.amazonaws.com!172.31.19.60/mnt/var/log/hadoop/userlogs/job_201405030101_0006/attempt_201405030101_0006_m_000002_3/stderr):
Traceback (most recent call last):
File "obidroidMR.py", line 5, in <module>
import nltk
ImportError: No module named nltk
任何帮助将不胜感激
【问题讨论】:
【参考方案1】:在mrjob.conf
中,安装软件包所需的行可能不在它们应该在的位置。应该为在 EMR 上运行的作业应用的内容应列在 emr:
而不是 hadoop:
下(这是在本地 Hadoop 安装上运行作业时的配置。
如果是简单的 Linux 命令,如 pip
或 apt-get
,那么您应该可以像这样安装软件包:
runners:
emr:
aws_access_key_id: ***
... all the other stuff ...
bootstrap_cmds:
- sudo apt-get install -y python-boto
- sudo pip install simplejson
我从来没有尝试过专门安装 NLTK,所以我无法帮助你,但你应该可以按照这条线安装。
对于可能更复杂的安装,我建议使用 EMR CLI 在您的主节点上 ssh
ing:
$ ./elastic-mapreduce -j JOB_FLOW_ID --ssh
并实际尝试安装软件包。如果您找到一系列成功安装软件包的 shell 命令,那么您只需将其复制并粘贴到您的mrjob.conf
。
【讨论】:
现在试试。所以如果我 ssh 进入,我只能在主节点或所有节点中安装软件包?感谢您的所有回复。 实际上,我应该补充一点,您应该创建一个持久性测试实例(如果您使用 CLI,请使用--keep-alive
选项...确保在实验完成后终止该工作流程)并尝试查看您是否可以使用apt-get
、pip
等在该实例上成功安装所需的包。如果您在“真实”运行中使用相同类型的实例,则在@987654333 下添加完全相同的行@ 在你的 mrjob.conf
应该在所有实例中安装包。这只是一种确定您的命令是否正确安装软件包的方法。
试过这个。没用。错误日志:异常:作业流 j-PKIO9JHCITI3 上的作业失败,状态为 FAILED:在主实例 (i-b619c2e6) 上,引导操作 1 返回非零返回码
好的。现在试试看。但是仍然..非常感谢您的所有帮助。安装后弹性 mapreduce 工具不起作用。重新检查我的错误【参考方案2】:
鉴于 Amazon Elastic Map Reduce 使用 AMI based on Amazon Linux,我验证我可以使用以下命令在 Amazon Linux AMI 2014.03.1 - ami-fb8e9292(64 位)上安装 nltk
sudo easy_install -U pip
sudo easy_install -U distribute
sudo pip install -U pyyaml nltk
您可以尝试将这 3 行合并到您的 mrjob.conf 中
【讨论】:
试过这个。没用。错误日志:异常:作业流 j-PKIO9JHCITI3 上的作业失败,状态为 FAILED:在主实例 (i-b619c2e6) 上,引导操作 1 返回非零返回码 你能找到任何与 mrjob 合作的 EMR 工作吗?即,不需要标准 Python 库以外的任何库的测试作业? 哦,是的。 NLTK 用于另一个项目。但是如果没有库,我的 mrjob 可以工作(Soteria 之一),因为所有特征都已经在数据库中提取以上是关于使用 python MRJob 在 EMR 上引导库的主要内容,如果未能解决你的问题,请参考以下文章
如何在 EMR 上使用 MrJob 0.4.2 设置 IAM 角色
mrjob 在 Amazon EMR 5.x 上不起作用,但在 EMR4.8.3 上运行