【问题标题】:How to make a AWS Data Pipeline ShellCommandActivity Script execute a python file如何使 AWS Data Pipeline ShellCommandActivity 脚本执行 python 文件
【发布时间】:2017-06-27 19:21:36
【问题描述】:

我正在使用具有 ShellCommandActivity 的 AWS 数据管道,它将脚本 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"

从我得到的标准输出日志:

下载:s3://project/bin/scripts/Test.py 到./

我从 Stdeer 日志中得到:

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/output/tmp/df-0947490M9EHH2Y32694-59ed8ca814264f5d9e65b2d52ce78a53/ShellCommandActivityIdJiZP720170209T175934Attempt1_command.sh:第 7 行:打印:找不到命令

编辑 2

在 Test.py 中添加以下行

#!/usr/bin/env python

然后我收到以下错误:

错误:第 6 行,在 import boto3 ImportError: No module named boto3

使用 @franklinsijo 的建议,我在 EmrCluster 上创建了一个引导操作,其值如下:

s3://project/bin/scripts/BootstrapActions.sh

这是 BootstrapActions.sh

#!/usr/bin/env bash
sudo pip install boto3

成功了!!!!!!!

【问题讨论】:

  • 为什么不在ScriptUri中直接引用python脚本呢?
  • 感谢您的建议,我从 ref 收到以下错误。 ScriptUri 中的 python 脚本:s3://project/bin/scripts/Test.py:没有这样的文件或目录。我的 s3 链接是:s3.amazonaws.com/project/bin/scripts/Test.py
  • 改了名字还是一样的错误。
  • 并且您确定该文件存在于具有相同前缀的存储桶中?
  • 我现在正在看。我应该在 ScriptUri 中添加 amazonaws.com 吗?

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


【解决方案1】:

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

使用pipeasy_install 安装python 模块。

【讨论】:

  • 那行得通。我希望我能再投票 10 次!
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-18
    • 2021-10-04
    • 1970-01-01
    • 1970-01-01
    • 2011-11-14
    相关资源
    最近更新 更多