如何使用 bash 命令将 EMR 步骤添加到 cloudformation

发布于 2025-01-12 05:15:12 字数 2443 浏览 2 评论 0原文

我尝试通过 Cloudformation 将以下步骤添加到我的 EMR 集群,但失败并提示文件未找到错误。我尝试转义双引号但没有用。

 SetupHiveStep:
        Type: AWS::EMR::Step
        Properties:
            Name: SetupHive
            ActionOnFailure: CANCEL_AND_WAIT
            JobFlowId: !Ref Cluster
            HadoopJarStep:
                Jar: "command-runner.jar"
                Args:
                    - !Sub bash -c "aws s3 cp s3://test-emr/scripts/init.sh /home/hadoop/init.sh;sudo chmod +x /home/hadoop/init.sh;sh /home/hadoop/init.sh;"

以下是 EMR 的实际步骤配置:

JAR location :command-runner.jar
Main class :None
Arguments :bash -c "aws s3 cp s3://test-emr/scripts/init.sh /home/hadoop/init.sh;sudo chmod +x /home/hadoop/init.sh;sh /home/hadoop/init.sh;"
Action on failure:Terminate cluster

以下是 EMR 失败步骤的错误:

Exception in thread "main" java.lang.RuntimeException: java.io.IOException: Cannot run program "bash -c "aws s3 cp s3://test-emr/scripts/init.sh /home/hadoop/init.sh;sudo chmod +x /home/hadoop/init.sh;sh /home/hadoop/init.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:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at org.apache.hadoop.util.RunJar.run(RunJar.java:323)
    at org.apache.hadoop.util.RunJar.main(RunJar.java:236)
Caused by: java.io.IOException: Cannot run program "bash -c "aws s3 cp s3://preddy-test-emr/scripts/init.sh /home/hadoop/init.sh;sudo chmod +x /home/hadoop/init.sh;sh /home/hadoop/init.sh;"" (in directory "."): error=2, No such file or directory
    at java.lang.ProcessBuilder.start(ProcessBuilder.java:1048)
    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:247)
    at java.lang.ProcessImpl.start(ProcessImpl.java:134)
    at java.lang.ProcessBuilder.start(ProcessBuilder.java:1029)
    ... 8 more

I am trying to add below step to my EMR cluster via Cloudformation but it fails saying file not found error. I tried escaping the double quotes but no use.

 SetupHiveStep:
        Type: AWS::EMR::Step
        Properties:
            Name: SetupHive
            ActionOnFailure: CANCEL_AND_WAIT
            JobFlowId: !Ref Cluster
            HadoopJarStep:
                Jar: "command-runner.jar"
                Args:
                    - !Sub bash -c "aws s3 cp s3://test-emr/scripts/init.sh /home/hadoop/init.sh;sudo chmod +x /home/hadoop/init.sh;sh /home/hadoop/init.sh;"

Here is the actual step configuration from EMR :

JAR location :command-runner.jar
Main class :None
Arguments :bash -c "aws s3 cp s3://test-emr/scripts/init.sh /home/hadoop/init.sh;sudo chmod +x /home/hadoop/init.sh;sh /home/hadoop/init.sh;"
Action on failure:Terminate cluster

Below is the error from EMR failed step:

Exception in thread "main" java.lang.RuntimeException: java.io.IOException: Cannot run program "bash -c "aws s3 cp s3://test-emr/scripts/init.sh /home/hadoop/init.sh;sudo chmod +x /home/hadoop/init.sh;sh /home/hadoop/init.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:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at org.apache.hadoop.util.RunJar.run(RunJar.java:323)
    at org.apache.hadoop.util.RunJar.main(RunJar.java:236)
Caused by: java.io.IOException: Cannot run program "bash -c "aws s3 cp s3://preddy-test-emr/scripts/init.sh /home/hadoop/init.sh;sudo chmod +x /home/hadoop/init.sh;sh /home/hadoop/init.sh;"" (in directory "."): error=2, No such file or directory
    at java.lang.ProcessBuilder.start(ProcessBuilder.java:1048)
    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:247)
    at java.lang.ProcessImpl.start(ProcessImpl.java:134)
    at java.lang.ProcessBuilder.start(ProcessBuilder.java:1029)
    ... 8 more

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

聊慰 2025-01-19 05:15:12

我能够通过修改命令来完成这项工作,如下所示。必须添加 && 以及 bash -c

SetupHiveStep:
        Type: AWS::EMR::Step
        Properties:
            Name: SetupHive
            ActionOnFailure: CANCEL_AND_WAIT
            JobFlowId: !Ref Cluster
            HadoopJarStep:
                Jar: "command-runner.jar"
                Args:
                    - "bash"
                    - "-c" 
                    - !Sub "aws s3 cp s3://${S3ConfPrefix}/scripts/init.sh /home/hadoop/init.sh && sudo chmod +x /home/hadoop/init.sh && sh /home/hadoop/init.sh"
                    - !Ref S3ConfPrefix

I was able to make this work by modifying the command as shown below. Had to add && along with bash -c

SetupHiveStep:
        Type: AWS::EMR::Step
        Properties:
            Name: SetupHive
            ActionOnFailure: CANCEL_AND_WAIT
            JobFlowId: !Ref Cluster
            HadoopJarStep:
                Jar: "command-runner.jar"
                Args:
                    - "bash"
                    - "-c" 
                    - !Sub "aws s3 cp s3://${S3ConfPrefix}/scripts/init.sh /home/hadoop/init.sh && sudo chmod +x /home/hadoop/init.sh && sh /home/hadoop/init.sh"
                    - !Ref S3ConfPrefix
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文