我正在使用12个虚拟机的集群,每个虚拟机具有16 GB内存和6个内核(主节点除外,只有2个内核)。对每个工作节点分配了12GB内存和4个内核。
当我向yarn提交spark应用程序时,我将执行程序的数量设置为10(1作为主管理器,1作为应用程序主管),并且为了最大化我的应用程序的并行性,我的大多数RDD都有40个分区相同作为所有执行者的核心数量。
以下是我遇到的问题:在某些随机阶段,某些任务需要处理的时间比其他任务长得多,这会导致并行性差。正如我们在第一张图片中看到的那样,执行程序9执行其任务超过30秒,而其他任务可以完成1秒。此外,消耗大量时间的原因也是随机的,有时仅仅是因为计算,但有时是调度程序延迟,反序列化或随机读取。我们可以看到,第二张图片的原因与第一张图片不同。
我猜这种情况发生的原因是一旦某个任务被分配到特定的插槽,相应的机器上没有足够的资源,所以jvm正在等待cpus。我猜是正确的吗?以及如何设置群集的配置以避免这种情况?
答案 0 :(得分:1)
要获得具体答案,您需要分享更多关于您正在做的事情,但很可能您在一个或多个阶段获得的分区是不平衡的 - 即有些比其他阶段大得多。结果是减速,因为这些分区由特定任务处理。解决此问题的一种方法是增加分区数量或更改分区逻辑 当一项大任务完成将数据运送到其他任务时也需要更长时间,这就是为什么其他任务可能需要很长时间