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

Java EMR-4.2.0运行自定义jar(命令运行程序)时出错,java,amazon-web-services,amazon-emr,Java,Amazon Web Services,Amazon Emr,我正在AWS-EMR-4.2.0版本中运行sqoop安装脚本,如下所示。 创建集群之后(在步骤中),我已经将我的sqoop脚本作为参数提交,并将s3://elasticmapreduce/libs/script runner/script-runner.jar/command-runner.jar作为jar文件提交,但得到的错误如下所示。你能帮我吗?原因和问题是什么? 错误: 线程“main”java.lang.RuntimeException:java.io.IOException:无法运行

我正在AWS-EMR-4.2.0版本中运行sqoop安装脚本,如下所示。 创建集群之后(在步骤中),我已经将我的sqoop脚本作为参数提交,并将s3://elasticmapreduce/libs/script runner/script-runner.jar/command-runner.jar作为jar文件提交,但得到的错误如下所示。你能帮我吗?原因和问题是什么?

错误:

线程“main”java.lang.RuntimeException:java.io.IOException:无法运行程序“s3://bmsgcm/spark/install sqoop.sh”(在目录“.”中):错误=2,没有这样的文件或目录 位于com.amazonaws.emr.command.runner.ProcessRunner.exec(ProcessRunner.java:139) 位于com.amazonaws.emr.command.runner.CommandRunner.main(CommandRunner.java:13) 在sun.reflect.NativeMethodAccessorImpl.invoke0(本机方法)处 在sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)中 在sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)中 位于java.lang.reflect.Method.invoke(Method.java:606) 位于org.apache.hadoop.util.RunJar.run(RunJar.java:221) 位于org.apache.hadoop.util.RunJar.main(RunJar.java:136) 原因:java.io.IOException:无法运行程序“s3://bmsgcm/spark/install sqoop.sh”(在目录“.”中):错误=2,没有这样的文件或目录 位于java.lang.ProcessBuilder.start(ProcessBuilder.java:1047) 位于com.amazonaws.emr.command.runner.ProcessRunner.exec(ProcessRunner.java:92) ... 还有7个 原因:java.io.IOException:error=2,没有这样的文件或目录 位于java.lang.UNIXProcess.forkAndExec(本机方法) 位于java.lang.UNIXProcess(UNIXProcess.java:187) 在java.lang.ProcessImpl.start(ProcessImpl.java:130) 位于java.lang.ProcessBuilder.start(ProcessBuilder.java:1028) ... 8个以上
command-runner.jar只能读取本地文件。您可以添加引导脚本以将文件从S3复制到本地文件系统。

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...
]
正如您所经历的那样,如果您只是将
命令runner.jar
交换为
脚本runner.jar
,它将在EMR4.x上失败

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

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

上述示例表示为。不过,我并不清楚如何在web控制台中完成同样的任务

要执行脚本,可以使用脚本运行程序。我也面临同样的问题。我的脚本中有^M个字符导致了此问题。删除这些文件是有效的