首页 文章

如何制作AWS Data Pipeline ShellCommandActivity脚本执行python文件

提问于
浏览
3

我正在使用具有ShellCommandActivity的AWS Data Pipeline,该脚本将脚本uri设置为位于s3存储桶中的bash文件 . bash文件将位于同一s3存储桶中的python脚本复制到EmrCluster,然后脚本尝试执行该python脚本 .

enter image description here

这是我的管道输出:

{
  "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 回答

  • 0

    使用配置ShellCommandActivity

    • 将python文件的S3 Uri路径传递为 Script Uri .

    • 在脚本中添加shebang行 #!/usr/bin/env python .

    • 如果脚本中使用了任何非默认的python库,请将它们安装在目标资源上 .

    • 如果选择了 runsOn ,请将安装命令添加为EMR资源的bootstrap action .

    • 如果选择了 workerGroup ,请在管道激活之前安装Worker group上的所有库 .

    使用 pipeasy_install 来安装python模块 .

  • 3

    这是解决一个难以调试的简单问题的有用线程 . 我最终使用Resource的 - Run As User字段设置为root . 我讨厌以root身份运行(我试过ec2-user无济于事),但这是我的python脚本在site-packages上唯一的权限 . 显然,TaskRunner服务没有sudo访问权限,所以在.sh中运行sudo命令只是无声地失败 .

相关问题