我正在使用具有ShellCommandActivity的AWS Data Pipeline,该脚本将脚本uri设置为位于s3存储桶中的bash文件 . bash文件将位于同一s3存储桶中的python脚本复制到EmrCluster,然后脚本尝试执行该python脚本 .
这是我的管道输出:
{
"objects": [
{
"name": "DefaultResource1",
"id": "ResourceId_27dLM",
"amiVersion": "3.9.0",
"type": "EmrCluster",
"region": "us-east-1"
},
{
"failureAndRerunMode": "CASCADE",
"resourceRole": "DataPipelineDefaultResourceRole",
"role": "DataPipelineDefaultRole",
"pipelineLogUri": "s3://project/bin/scripts/logs/",
"scheduleType": "ONDEMAND",
"name": "Default",
"id": "Default"
},
{
"stage": "true",
"scriptUri": "s3://project/bin/scripts/RunPython.sh",
"name": "DefaultShellCommandActivity1",
"id": "ShellCommandActivityId_hA57k",
"runsOn": {
"ref": "ResourceId_27dLM"
},
"type": "ShellCommandActivity"
}
],
"parameters": []
}
这是RunPython.sh:
#!/usr/bin/env bash
aws s3 cp s3://project/bin/scripts/Test.py ./
python ./Test.py
这是Test.py
__author__ = 'MrRobot'
import re
import os
import sys
import boto3
print "We've entered the python file"
从Stdout Log我得到:
下载:s3://project/bin/scripts/Test.py至./
从Stdeer Log我得到:
python:无法打开文件'Test.py':[Errno 2]没有这样的文件或目录
我也尝试用python Test.py替换python ./Test.py,但我得到了相同的结果 .
如何让我的AWS Data Pipeline执行我的Test.py脚本 .
编辑
当我将scriptUri设置为s3://project/bin/scripts/Test.py时,我收到以下错误:
/mnt/taskRunner/output/tmp/df-0947490M9EHH2Y32694-59ed8ca814264f5d9e65b2d52ce78a53/ShellCommandActivityIdJiZP720170209T175934Attempt1_command.sh:第1行:作者:命令未找到/mnt/taskRunner/output/tmp/df-0947490M9EHH2Y32694-59ed8ca814264f5d9e65b2d52ce78a53/ShellCommandActivityIdJiZP720170209T175934Attempt1_command.sh:第2行:进口:找不到命令/mnt/taskRunner/output/tmp/df-0947490M9EHH2Y32694-59ed8ca814264f5d9e65b2d52ce78a53/ShellCommandActivityIdJiZP720170209T175934Attempt1_command.sh:3号线:进口:找不到命令/mnt/taskRunner/output/tmp/df-0947490M9EHH2Y32694-59ed8ca814264f5d9e65b2d52ce78a53/ShellCommandActivityIdJiZP720170209T175934Attempt1_command.sh :行4:导入:命令未找到/mnt/taskRunner/output/tmp/df-0947490M9EHH2Y32694-59ed8ca814264f5d9e65b2d52ce78a53/ShellCommandActivityIdJiZP720170209T175934Attempt1_command.sh:行5:导入:命令未发现的/ mnt / taskRunner /输出/ TMP / DF-0947490M9EHH2Y32694-59ed8ca814264f5d9e65b2d52ce78a53 / ShellCommandAct ivityIdJiZP720170209T175934Attempt1_command.sh:第7行:print:未找到命令
EDIT 2
在Test.py中添加了以下行
#!/usr/bin/env python
然后我收到以下错误:
错误:第6行,在导入boto3中导入错误:没有名为boto3的模块
使用@franklinsijo的建议我在EmrCluster上创建了一个Bootstrap Action,其值如下:
s3://project/bin/scripts/BootstrapActions.sh
这是BootstrapActions.sh
#!/usr/bin/env bash
sudo pip install boto3
这工作!!!!!!!
2 回答
使用配置ShellCommandActivity
将python文件的S3 Uri路径传递为
Script Uri
.在脚本中添加shebang行
#!/usr/bin/env python
.如果脚本中使用了任何非默认的python库,请将它们安装在目标资源上 .
如果选择了
runsOn
,请将安装命令添加为EMR资源的bootstrap action .如果选择了
workerGroup
,请在管道激活之前安装Worker group上的所有库 .使用
pip
或easy_install
来安装python模块 .这是解决一个难以调试的简单问题的有用线程 . 我最终使用Resource的 - Run As User字段设置为root . 我讨厌以root身份运行(我试过ec2-user无济于事),但这是我的python脚本在site-packages上唯一的权限 . 显然,TaskRunner服务没有sudo访问权限,所以在.sh中运行sudo命令只是无声地失败 .