Spark UI执行程序



在Spark UI中,添加了18个执行器,删除了6个执行器。当我查看遗嘱执行人标签时,我看到了许多死亡和被排除在外的遗嘱执行人。目前,EMR中使用动态分配。

我查阅了一些关于已故遗嘱执行人的帖子,但这些帖子大多与工作失败有关。就我的情况而言,这项工作本身似乎并没有失败,但可以看到死亡和被排斥的执行者。

这些";死的";以及";排除";遗嘱执行人?它如何影响当前火花组配置的性能?(如果影响性能(那么提高性能的好方法是什么?

在启用动态alocation的情况下,spark正试图将执行者的数量调整为活动阶段中的任务数量。让我们看看这个例子:

  1. 作业开始,第一阶段是从巨大的源读取的,这需要一些时间。假设这个源是分区的,Spark生成了100个任务来获取数据。如果你的执行器有5个核心,Spark将生成20个执行器以确保最佳并行性(20个执行者x 5个核心=100个并行任务(

  2. 假设在下一步中,您正在进行重新分区或sor合并联接,将shuffle分区设置为200,spark将生成200个任务。他足够聪明,可以计算出他目前只有100个核心可飞行,因此如果新资源可飞行,他将尝试产生另外20个执行者(40个执行者x 5个核心=200个并行任务(

  3. 现在连接完成了,在下一阶段,您只有50个分区,要并行计算,您不需要40个执行器,10个就可以了(10个执行器x5个核心=50个并行任务(。现在,若这个过程需要足够的时间,Spark可以释放一些资源,并且您将看到被删除的执行器。

  4. 现在我们有了涉及重新分区的下一阶段。分区数等于200。有了10个执行器,你只能在paracell中处理50个分区。Spark将尝试获得新的执行器。。。

您可以阅读以下博客文章:https://aws.amazon.com/blogs/big-data/best-practices-for-successfully-managing-memory-for-apache-spark-applications-on-amazon-emr/

spark.dynamicAllocation.enabled属性的问题在于它要求您设置子属性。一些示例子属性包括spark.dynamicAllocationinitialExecutors、minExecutors和maxExecutors。在大多数情况下,使用集群中应用程序的适当数量的执行程序,尤其是当您需要同时运行多个应用程序时。背景子属性需要大量的尝试和错误才能得到数字正确的如果他们不正确,容量可能会被保留,但永远不会实际使用。这会导致资源浪费或内存错误其他应用程序。

在这里你会发现一些提示,根据我的经验,如果你要在同一集群中并行运行几个作业,那么设置maxExecutors是值得的,因为大多数时候,仅仅为了从一个作业中获得100%的效率而饿死其他作业是不值得的

相关内容

  • 没有找到相关文章

最新更新