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
的参数中,您不应该添加额外的双引号。因此,turnOnCronJob1
和 copyOldCronTabToNew3
的正确格式如下:
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");
此外,需要注意的是 turnOnCronJob2
和 copyOldCronTabToNew1
配置参数是传递参数的无效方式。但是,copyOldCronTabToNew2
配置参数是正确的。
我正在努力向 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,如下所示:
问题是在 HadoopJarStepConfig
的参数中,您不应该添加额外的双引号。因此,turnOnCronJob1
和 copyOldCronTabToNew3
的正确格式如下:
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");
此外,需要注意的是 turnOnCronJob2
和 copyOldCronTabToNew1
配置参数是传递参数的无效方式。但是,copyOldCronTabToNew2
配置参数是正确的。