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

时间:2017-02-09 16:57:13

标签: bash amazon-web-services amazon-s3

我正在使用具有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: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

这有效!!!!!!!

2 个答案:

答案 0 :(得分:4)

使用

配置ShellCommandActivity
  • 将python文件的S3 Uri Path作为Script Uri
  • 传递
  • 在中添加shebang行#!/usr/bin/env python 脚本。
  • 如果脚本中使用了任何非默认的python库,请将它们安装在目标资源上。
    • 如果选择runsOn,请将安装命令添加为EMR资源的bootstrap action
    • 如果选择了workerGroup,请在管道激活之前安装Worker group上的所有库。

使用pipeasy_install安装python模块。

答案 1 :(得分:0)

这是一个有用的线程,用于解决一个难以调试的简单问题。我最终使用了“资源-用户运行身份”字段设置为root。我讨厌以root身份运行(我尝试使用ec2-user无济于事),但这是唯一赋予我python脚本对站点程序包的权限的东西。显然,TaskRunner服务没有sudo访问权限,因此在.sh中运行sudo命令只会无声地失败。