我正在尝试在配置spark应用程序时从我的集群中挤出每一位,但似乎我并不完全理解所有内容。所以我在AWS EMR集群上运行应用程序,其中包含m3.xlarge类型的1个主节点和2个核心节点(每个节点15G ram和4个vCPU)。这意味着默认情况下,为纱线调度的应用程序在每个节点上保留11.25 GB。因此主节点仅由资源管理器(yarn)使用,这意味着剩余的2个核心节点将用于调度应用程序(因此我们有22.5G用于此目的)。到现在为止还挺好。但是这里出现了我没有得到的部分。我正在使用以下参数启动spark应用程序:
- 驱动程序内存4G --num-executors 4 --executor-cores 7 --executor-memory 4G
这意味着我的看法(来自我发现的信息)是因为驱动程序将被分配4G而4个执行程序将与4G一起启动。因此粗略估计它使5 * 4 = 20G(让它们具有预期的内存储备21G),这应该没问题,因为我们有22.5G的应用程序。以下是发布后hadoop纱线UI的截图:
我们可以看到应用程序使用的是17.63,但这比预期的~21G稍微少一点,这引发了第一个问题 - 这里发生了什么?
然后我转到spark UI的执行者页面。这是一个更大的问题:
执行程序是3(不是4),为它们分配的内存和驱动程序是2.1G(不是指定的4G)。所以hadoop纱线使用17.63G,但火花说8.4G被分配。那么,这里发生了什么?这与容量调度程序有关(从文档中我无法得出这个结论)?
答案 0 :(得分:0)
您可以查看是否已启用spark.executor.instances
。如果是这种情况,则火花您的应用程序可能会在不再使用资源时将资源返回给群集。启动时启动的最小执行程序数将由5*4+5*384MB
决定。
如果不是这样,那么你的spark应用源是什么以及为此设置的分区大小是什么,如果你的源只有10个分区,那么spark会将分区大小映射到spark核心,当你尝试分配15个内核,它只使用10个内核,因为这就是所需要的。我想这可能是火花已经启动3个执行器而不是4的原因。关于内存,我建议重新考虑,因为你要求4个执行器和1个4Gb驱动器,每个22GB
约等于{{ 1}}并且你正试图用尽所有东西,而你的操作系统和节点管理员没有多少工作,这不是理想的做法。