我正在尝试在EMR中同时运行两个步骤。然而,我总是让第一步运行,第二步挂起。
我的纱线配置如下:
{
"Classification": "capacity-scheduler",
"Properties": {
"yarn.scheduler.capacity.resource-calculator": "org.apache.hadoop.yarn.util.resource.DominantResourceCalculator",
"yarn.scheduler.capacity.maximum-am-resource-percent": "0.5"
}
}
当我在本地Mac上运行时,我可以在Yarn上运行具有类似配置的2应用程序,其中的更改实际上是spark-submit资源请求,以匹配所需的集群容量和性能。
换句话说,My yarn被设置为运行多个应用程序。
因此,在深入研究之前,我想知道是否真的可以同时或仅串行运行该步骤?
否则,是否有任何提示或特定的东西可以同时运行到作业?
我的集群在每个工作请求方面都能力过剩。因此,我不明白为什么它不能同时运行。
-
是否可以同时或仅串行运行该步骤?
- 从AWS支持人员那里确认,我们不能并行(并发(运行多个步骤,这些步骤是串行的,所以你看到的(即第二个作业处于挂起状态(是意料之中的
-
是否有任何提示或特定内容可以同时运行到作业?
- 您可以简单地将spark-submit放在bash脚本中并运行bash脚本,但您可能会在AWS web控制台上丢失一些直接调试信息(imo已经很慢了(,您可以在
spark-history server
上看到这些调试信息
- 您可以简单地将spark-submit放在bash脚本中并运行bash脚本,但您可能会在AWS web控制台上丢失一些直接调试信息(imo已经很慢了(,您可以在
On your local mac, you are able to run multiple YARN application in parallel because you are submitting the applications to yarn directly, whereas in EMR the yarn/spark applications are submitted through AWS's internal `command-runner.jar`, it does a bunch of other logging/bootstrapping etc to be able to see the `emr step` info on the web console.
看来AWS最终在EMR 5.28.0中实现了这一功能!
该参数在控制台向导中称为"并发",或在API中称为StepConcurrencyLevel:
指定可以同时执行的步骤数。默认值为1。最大值为256。
AWS EMR Yarn中有两种运行应用程序的模式:
- 客户端
- 群集
如果使用客户端模式,那么在给定时间只有一个步骤处于运行状态。但是,有一个选项,在中可以同时运行1个以上的步骤。
尝试在blow模式下提交步骤:spark-submit--master yarn--部署模式集群--执行器内存1G--num执行器2--驱动程序内存1G--执行器内核2--conf spark.yarn.submit.waitAppCompletion=false--class WordCount.word.App/home/hadop/word.jar
- 与其让AWS EMR定义内存分配,不如尝试定义您的分配。请参阅链接:http://site.clairvoyantsoft.com/understanding-resource-allocation-configurations-spark-application/
- spark.yarn.submit.waitAppCompletion=false:在yarn集群模式中,控制客户端是否等待退出,直到应用程序完成。如果设置为true,客户端进程将保持活动状态,报告应用程序的状态。否则,客户端进程将在提交后退出
希望这能对你有所帮助。
AWS现在允许您在EMR的后续版本中同时运行步骤。https://aws.amazon.com/about-aws/whats-new/2019/11/amazon-emr-now-allows-you-to-run-multiple-steps-in-parallel-cancel-running-steps-and-integrate-with-aws-step-functions/
在执行此操作时需要注意的一件事是要注意资源,因为您的应用程序将为可用资源而斗争,其中一个应用程序可能最终处于可接受状态,直到另一个完成才启动,从而破坏目的。
您可以始终将步骤放在后台。如果您处理日志记录和比赛条件,应该不会成为问题。
stepjob.sh
#!/bin/bash
function main(){
do_this
do_that
}
if [[ "$1" == "1" ]]; then
main
else
/bin/bash "$0" 1 $@ &
fi