0

0

使用 Airflow 触发 EMR Step 执行失败问题排查与解决

花韻仙語

花韻仙語

发布时间:2025-09-26 17:58:01

|

188人浏览过

|

来源于php中文网

原创

使用 airflow 触发 emr step 执行失败问题排查与解决

在使用 Airflow 触发 EMR Step 执行时,可能会遇到 "java.io.IOException: Cannot run program 's3://shell script path': error=2, No such file or directory" 错误。这通常是由于使用了 command-runner.jar 尝试直接执行 S3 上的 shell 脚本引起的。本文将深入探讨此问题的原因,并提供解决方案,同时还会提供一种更高效的替代方案,以避免不必要的 EMR 资源消耗。

问题分析

错误信息表明,EMR 无法找到并执行位于 S3 路径 s3://shell script path 的脚本。尽管文件存在且 EMR 实例配置和 Service Role 拥有 S3 的完全访问权限,但直接使用 command-runner.jar 运行 S3 上的脚本是不正确的。

command-runner.jar 主要用于执行 Hadoop 命令或 Java 程序,而不能直接执行 shell 脚本。因此,需要使用 script-runner.jar 来执行 S3 上的 shell 脚本。

解决方案:使用 script-runner.jar

script-runner.jar 是 EMR 提供的用于执行脚本的工具。它会从指定位置下载脚本,并在 EMR 集群上执行。

以下是在 Airflow 中使用 script-runner.jar 的示例代码:

def add_step(cluster_id, script_path):
    response = client.add_job_flow_steps(
        JobFlowId=cluster_id,
        Steps=[
            {
                'Name': 'Run Script from S3',
                'ActionOnFailure': 'CONTINUE',
                'HadoopJarStep': {
                    'Jar': 's3://us-west-2.elasticmapreduce/libs/script-runner/script-runner.jar', # 替换为你的区域
                    'Args': [script_path]
                }
            },
        ]
    )
    return response['StepIds'][0]

dag = DAG(
    dag_id="EMR_START_DAG",
    description="Trial for EMR start",
    start_date=days_ago(1)
)

EMR_STEP_1 = PythonOperator(
    task_id='EMR_STEP_1',
    python_callable=add_step,
    op_kwargs={'cluster_id': '{{ti.xcom_pull("EMR_START")["JobFlowId"]}}',
               'script_path': 's3://shell script path'},
    dag=dag
)

注意事项:

TemPolor
TemPolor

AI音乐生成器,一键创作免版税音乐

下载
  • 确保 script-runner.jar 的路径与你的 EMR 集群所在区域匹配。
  • script_path 参数应为 S3 上脚本的完整路径。
  • EMR 实例角色需要有权限访问 S3 上的脚本文件。

替代方案:在 Airflow 中直接运行 AWS CLI

如果脚本的功能仅仅是从外部下载数据并上传到 S3,可以考虑直接在 Airflow 中运行 AWS CLI 命令,而无需启动 EMR 集群。这样可以避免不必要的资源消耗。

首先,确保 Airflow 服务器上安装了 AWS CLI,并配置了正确的 AWS 凭证。

然后,可以使用 BashOperator 在 Airflow 中执行 AWS CLI 命令:

from airflow.operators.bash_operator import BashOperator

dag = DAG(
    dag_id="EMR_START_DAG",
    description="Trial for EMR start",
    start_date=days_ago(1)
)

DOWNLOAD_AND_UPLOAD = BashOperator(
    task_id='download_and_upload',
    bash_command='wget -O - https://archive.ics.uci.edu/ml/machine-learning-databases/iris/iris.data | aws s3 cp - s3path',
    dag=dag
)

注意事项:

  • 确保 Airflow 服务器具有访问外部网站和 S3 的权限。
  • 替换 s3path 为你的 S3 目标路径。
  • 根据实际情况调整命令和参数。

总结

当在使用 Airflow 触发 EMR Step 执行时遇到 "java.io.IOException: Cannot run program" 错误时,首先应检查是否使用了正确的 Jar 文件。对于执行 S3 上的 shell 脚本,应使用 script-runner.jar。此外,如果脚本的功能相对简单,可以考虑直接在 Airflow 中运行 AWS CLI 命令,以避免不必要的 EMR 资源消耗。选择哪种方案取决于脚本的复杂度和对 EMR 集群资源的需求。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
scripterror怎么解决
scripterror怎么解决

scripterror的解决办法有检查语法、文件路径、检查网络连接、浏览器兼容性、使用try-catch语句、使用开发者工具进行调试、更新浏览器和JavaScript库或寻求专业帮助等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

248

2023.10.18

500error怎么解决
500error怎么解决

500error的解决办法有检查服务器日志、检查代码、检查服务器配置、更新软件版本、重新启动服务、调试代码和寻求帮助等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

305

2023.10.25

hadoop是什么
hadoop是什么

hadoop是一个由Apache基金会所开发的分布式系统基础架构。用户可以在不了解分布式底层细节的情况下,开发分布式程序。本专题为大家免费提供hadoop相关的文章、下载和课程。

209

2023.06.30

hadoop三大核心组件介绍
hadoop三大核心组件介绍

Hadoop的三大核心组件分别是:Hadoop Distributed File System(HDFS)、MapReduce和Yet Another Resource Negotiator(YARN)。想了解更多hadoop的相关内容,可以阅读本专题下面的文章。

399

2024.03.13

hadoop的核心
hadoop的核心

hadoop的核心由分布式文件系统 (hdfs) 和资源管理框架 (mapreduce) 组成。想了解更多hadoop的相关内容,可以阅读本专题下面的文章。

334

2024.05.16

Java 大数据处理基础(Hadoop 方向)
Java 大数据处理基础(Hadoop 方向)

本专题聚焦 Java 在大数据离线处理场景中的核心应用,系统讲解 Hadoop 生态的基本原理、HDFS 文件系统操作、MapReduce 编程模型、作业优化策略以及常见数据处理流程。通过实际示例(如日志分析、批处理任务),帮助学习者掌握使用 Java 构建高效大数据处理程序的完整方法。

380

2025.12.08

go语言 注释编码
go语言 注释编码

本专题整合了go语言注释、注释规范等等内容,阅读专题下面的文章了解更多详细内容。

32

2026.01.31

go语言 math包
go语言 math包

本专题整合了go语言math包相关内容,阅读专题下面的文章了解更多详细内容。

23

2026.01.31

go语言输入函数
go语言输入函数

本专题整合了go语言输入相关教程内容,阅读专题下面的文章了解更多详细内容。

16

2026.01.31

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
最新Python教程 从入门到精通
最新Python教程 从入门到精通

共4课时 | 22.4万人学习

Django 教程
Django 教程

共28课时 | 3.8万人学习

SciPy 教程
SciPy 教程

共10课时 | 1.4万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号