繁体   English   中英

AWS EMR HadoopJarStepConfig 步骤 function arguments 不工作

[英]AWS EMR HadoopJarStepConfig step function arguments not working

我正在努力向 AWS EMR 添加步骤函数,这将在“crontab -e”中添加额外的一行。 因为我不想 append 直接到 crontab 文件,因为我可能有重复的 cron 作业,所以我正在获取所有现有作业,添加新作业并删除重复作业,如下所示:

HadoopJarStepConfig turnOnCronJob1 = new HadoopJarStepConfig()
                .withJar("command-runner.jar")
                .withArgs("bash", "-c", "\"(crontab -l; echo '*/5 * * * * /mnt/" + scriptName + "')", "|", "sort -u", "|", "crontab -\"");

但是,function 失败,退出代码为 1。我直接在我的 EMR 集群上运行了这个命令:

hadoop jar /var/lib/aws/emr/step-runner/hadoop-jars/command-runner.jar bash -c "(crontab -l; echo '*/5 * * * * /mnt/reademrpushmetrics.sh') | sort -u | crontab -"

而且,这工作正常,没有错误。 我试过遵循 HadoopJarStepConfig,但它们也不起作用:

HadoopJarStepConfig turnOnCronJob2 = new HadoopJarStepConfig()
                .withJar("command-runner.jar")
                .withArgs("(crontab -l; echo '*/5 * * * * /mnt/" + scriptName + "')", "|", "sort -u", "|", "crontab -");
HadoopJarStepConfig copyOldCronTabToNew1 = new HadoopJarStepConfig()
                .withJar("command-runner.jar")
                .withArgs("crontab -l", ">", "/mnt/newCronTab");
HadoopJarStepConfig copyOldCronTabToNew2 = new HadoopJarStepConfig()
                .withJar("command-runner.jar")
                .withArgs("crontab", "-l", ">", "/mnt/newCronTab");
HadoopJarStepConfig copyOldCronTabToNew3 = new HadoopJarStepConfig()
                .withJar("command-runner.jar")
                .withArgs("bash", "-c", "\"crontab -l > /mnt/newCronTab\"");

最后三个代码配置文件是我尝试创建一个新的“newCronTab”文件并存储我的新 crontab 作业的替代方法,然后再将它们全部添加到“crontab -e”。 最后一个配置实际上给出了不同的 exitCode 错误 127,而不是 1,如下所示: 在此处输入图像描述 在此处输入图像描述 如果我使用 hadoop 命令直接在 EMR 集群上运行它们,所有这些命令似乎都有效。 我 99% 确定问题出在我传递的 arguments 中,但某些字符不正确 escaping 。 如果有人遇到过这种情况,您是如何解决的? 谢谢!

问题是在 HadoopJarStepConfig 的HadoopJarStepConfig中,您不应该添加额外的双引号。 因此, turnOnCronJob1copyOldCronTabToNew3的正确格式如下所示:

HadoopJarStepConfig turnOnCronJob1 = new HadoopJarStepConfig()
                    .withJar("command-runner.jar")
                    .withArgs("bash", "-c", "(crontab -l; echo '*/5 * * * * /mnt/" + scriptName + "') | sort -u | crontab -");
HadoopJarStepConfig copyOldCronTabToNew3 = new HadoopJarStepConfig()
                    .withJar("command-runner.jar")
                    .withArgs("bash", "-c", "crontab -l > /mnt/newCronTab");

另外,需要注意的是, turnOnCronJob2copyOldCronTabToNew1 config arguments 是传递 arguments 的无效方式。但是, copyOldCronTabToNew2 config arguments 是正确的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM