EMR-4.2.0 运行自定义 jar(命令运行程序)时出错

问题描述 投票:0回答:4

我正在 AWS - EMR-4.2.0 版本中运行 sqoop 安装脚本,遵循 此文档。 创建集群后(在步骤中),我已提交 sqoop 脚本作为参数,并将 s3://elasticmapreduce/libs/script-runner/script-runner.jar/ command-runner.jar 作为 jar 文件提交,但出现类似错误这。你能帮我看看原因和问题是什么吗?

错误:

Exception in thread "main" java.lang.RuntimeException: java.io.IOException: Cannot run program "s3://bmsgcm/spark/install-sqoop.sh" (in directory "."): error=2, No such file or directory
    at com.amazonaws.emr.command.runner.ProcessRunner.exec(ProcessRunner.java:139)
    at com.amazonaws.emr.command.runner.CommandRunner.main(CommandRunner.java:13)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:606)
    at org.apache.hadoop.util.RunJar.run(RunJar.java:221)
    at org.apache.hadoop.util.RunJar.main(RunJar.java:136)
Caused by: java.io.IOException: Cannot run program "s3://bmsgcm/spark/install-sqoop.sh" (in directory "."): error=2, No such file or directory
    at java.lang.ProcessBuilder.start(ProcessBuilder.java:1047)
    at com.amazonaws.emr.command.runner.ProcessRunner.exec(ProcessRunner.java:92)
    ... 7 more
Caused by: java.io.IOException: error=2, No such file or directory
    at java.lang.UNIXProcess.forkAndExec(Native Method)
    at java.lang.UNIXProcess.<init>(UNIXProcess.java:187)
    at java.lang.ProcessImpl.start(ProcessImpl.java:130)
    at java.lang.ProcessBuilder.start(ProcessBuilder.java:1028)
    ... 8 more
java amazon-web-services amazon-emr
4个回答
1
投票

command-runner.jar 只能读取本地文件。您可以添加引导脚本以将文件从 S3 复制到本地文件系统。


1
投票

Piggybox 是正确的。与 2.x 和 3.x EMR AMI 上使用的

script-runner.jar
不同,
command-runner.jar
只能运行本地命令。引导脚本是执行此操作的最佳方法。

例如,如果您在 S3 上有一些 Spark 驱动程序,并且有一个 shell 脚本(也在 S3 上)将它们复制到主节点,以便稍后在作业流程步骤中使用

spark-submit
,那么您可能已经有了像这样的步骤:

Steps=[
    {
        'Name': 'Install My Spark Drivers',
        'ActionOnFailure':'TERMINATE_JOB_FLOW',
        'HadoopJarStep':
            'Jar': 's3://us-east-1.elasticmapreduce/libs/script-runner/script-runner.jar',
            'Args': [
                's3://my-bucket/spark-driver-install.sh',
            ]
        }
   },
   ...other steps...
]

正如您所经历的,如果您只是将

command-runner.jar
替换为
script-runner.jar
,那么在 EMR 4.x 上将会失败。

相反,执行引导操作来调用脚本,例如:

BootstrapActions=[
    {
        'Name': 'Install My Spark Drivers',
        'ScriptBootstrapAction': {
            'Path': 's3://my-bucket/spark-driver-install.sh',
            'Args': []
        }
    }
]

上面的例子表示为boto3 run_job_flow kwargs。不过,对于我来说,如何在网络控制台中完成同样的事情并不是很明显。


0
投票

要执行脚本,您可以使用 script-runner。我也面临着同样的问题。我的脚本有 ^M 字符导致了这个问题。删除那些有效的。


0
投票

将 shell 脚本的

EOL_CONVERSION
更改为 Unix LF 后,它对我来说适用于类似的错误

© www.soinside.com 2019 - 2024. All rights reserved.