AWS EMR HadoopJarStepConfig 步骤函数参数不起作用

AWS EMR HadoopJarStepConfig step function arguments not working

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

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

但是,函数失败,退出代码为 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% 确定问题出在我传递的参数中,没有正确转义某些字符。如果有人遇到过这种情况,您是如何解决的?谢谢!

问题是在 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 配置参数是传递参数的无效方式。但是,copyOldCronTabToNew2 配置参数是正确的。