文件未在AWS Elastic Mapreduce上缓存

时间:2012-04-30 22:49:55

标签: python hadoop amazon-web-services elastic-map-reduce

我正在AWS Elastic MapReduce上运行以下MapReduce:

  

./ elastic-mapreduce --create --stream --name CLI_FLOW_LARGE --mapper   s3://classify.mysite.com/mapper.py --reducer   s3://classify.mysite.com/reducer.py --input   s3n://classify.mysite.com/s3_list.txt --output   s3://classify.mysite.com/dat_output4/ --cache   s3n://classify.mysite.com/classifier.py#classifier.py --cache-archive   s3n://classify.mysite.com/policies.tar.gz#policies --bootstrap-action   s3://classify.mysite.com/bootstrap.sh --enable-debugging   --master-instance-type m1.large --slave-instance-type m1.large --instance-type m1.large

由于某种原因,缓存文件classifier.py没有被缓存,看起来似乎如此。 reducer.py尝试导入时出现此错误:

  File "/mnt/var/lib/hadoop/mapred/taskTracker/hadoop/jobcache/job_201204290242_0001/attempt_201204290242_0001_r_000000_0/work/./reducer.py", line 12, in <module>
    from classifier import text_from_html, train_classifiers
ImportError: No module named classifier

classifier.py最明确地出现在s3n://classify.mysite.com/classifier.py。对于它的价值,政策档案似乎加载得很好。

2 个答案:

答案 0 :(得分:4)

我不知道如何在EC2中解决这个问题,但我之前在传统的Hadoop部署中看到过Python。希望课程可以翻译过来。

我们需要做的是将目录reduce.py添加到python路径中,因为大概classifier.py也在那里。无论出于何种原因,这个地方不在python路径中,因此无法找到classifier

import sys
import os.path

# add the directory where reducer.py is to the python path
sys.path.append(os.path.dirname(__file__))
# __file__ is the location of reduce.py, along with "reduce.py"
# dirname strips the file name and only gives the directory
# sys.path is the python path where it looks for modules

from classifier import text_from_html, train_classifiers

您的代码可能在本地工作的原因是因为您运行它的当前工作目录。 Hadoop可能没有从当前工作目录的相同位置运行它。

答案 1 :(得分:1)

orangeoctopus因其评论而值得称赞。必须附加工作目录系统路径:

sys.path.append('./')

此外,我建议任何有类似问题的人阅读这篇关于在AWS上使用分布式缓存的好文章: https://forums.aws.amazon.com/message.jspa?messageID=152538