我正在使用具有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:line 1:作者:找不到命令 /mnt/taskRunner/output/tmp/df-0947490M9EHH2Y32694-59ed8ca814264f5d9e65b2d52ce78a53/ShellCommandActivityIdJiZP720170209T175934Attempt1_command.sh:line 2:import:command not found /mnt/taskRunner/output/tmp/df-0947490M9EHH2Y32694-59ed8ca814264f5d9e65b2d52ce78a53/ShellCommandActivityIdJiZP720170209T175934Attempt1_command.sh:line 3:import:command not found /mnt/taskRunner/output/tmp/df-0947490M9EHH2Y32694-59ed8ca814264f5d9e65b2d52ce78a53/ShellCommandActivityIdJiZP720170209T175934Attempt1_command.sh:line 4:import:command not found /mnt/taskRunner/output/tmp/df-0947490M9EHH2Y32694-59ed8ca814264f5d9e65b2d52ce78a53/ShellCommandActivityIdJiZP720170209T175934Attempt1_command.sh:line 5:import:command not found /mnt/taskRunner/output/tmp/df-0947490M9EHH2Y32694-59ed8ca814264f5d9e65b2d52ce78a53/ShellCommandActivityIdJiZP720170209T175934Attempt1_command.sh:line 7:print:command not found
编辑2
将以下行添加到Test.py
#!/usr/bin/env python
然后我收到以下错误:
错误:第6行,导入中boto3 ImportError:没有名为boto3的模块
使用@franklinsijo的建议我在EmrCluster上创建了一个Bootstrap Action,其值如下:
S3://project/bin/scripts/BootstrapActions.sh
这是BootstrapActions.sh
#!/usr/bin/env bash
sudo pip install boto3
这有效!!!!!!!
答案 0 :(得分:4)
使用
配置ShellCommandActivityScript Uri
。#!/usr/bin/env python
脚本。runsOn
,请将安装命令添加为EMR资源的bootstrap action。workerGroup
,请在管道激活之前安装Worker group上的所有库。使用pip
或easy_install
安装python模块。
答案 1 :(得分:0)
这是一个有用的线程,用于解决一个难以调试的简单问题。我最终使用了“资源-用户运行身份”字段设置为root。我讨厌以root身份运行(我尝试使用ec2-user无济于事),但这是唯一赋予我python脚本对站点程序包的权限的东西。显然,TaskRunner服务没有sudo访问权限,因此在.sh中运行sudo命令只会无声地失败。