我们有一个包含4个节点的集群,具有上述特征:
Spark工作在处理过程中会花费很多时间,我们怎么能优化这段时间,因为我们知道我们的工作是从RStudio运行的,而且我们仍然有很多内存没有被利用。
答案 0 :(得分:1)
要在上面的答案中添加更多上下文,我想解释一下如何正确设置这些参数--num-executors
,--executor-memory
,--executor-cores
。
以下答案涵盖了标题中提到的3个主要方面 - 执行者数量,执行者内存和核心数。
可能还有其他参数,如驱动程序内存和其他参数,我在此答案中未提及。
案例1硬件 - 6个节点,每个节点16个核心,64 GB RAM
每个执行程序都是JVM实例。所以我们可以在一个Node中有多个执行器
操作系统和Hadoop守护程序需要前1个核心和1 GB,因此可用15核,每个节点63 GB RAM
从一个接一个开始,如何选择这些参数。
核心数量:
Number of cores = Concurrent tasks as executor can run
因此我们可能会认为,每个执行程序的更多并发任务将提供更好的性能。
但是研究表明,任何具有超过5个并发任务的应用程序都会导致糟糕的显示。所以坚持5。
这个数字来自执行者的能力,而不是系统拥有的核心数。所以数字5保持不变 即使CPU中有双(32)个核心。
执行人数:
回到下一步,每个执行程序有5个核心,在一个节点(CPU)中有15个可用核心 - 我们来 每个节点3个执行器。
因此,每个节点有6个节点和3个执行器 - 我们得到18个执行器。在18个中,我们在YARN中需要1个执行器(java进程),我们得到17个执行器
这是我们从spark-submit shell命令运行时使用--num-executors
给出的数字
每位遗嘱执行人的记忆:
从上面的步骤,我们每个节点有3个执行器。可用内存为63 GB
So memory for each executor is 63/3 = 21GB.
然而,还需要较小的开销内存来确定每个执行程序对YARN的完整内存请求。 头顶的公式是max(384,.07 * spark.executor.memory)
Calculating that overhead - .07 * 21 (Here 21 is calculated as above 63/3)
= 1.47
1.47 GB> 384 MB,头顶是1.47。 从上面的每个21中取出以上内容=> 21 - 1.47~19 GB
执行器内存 - 19 GB
最终数字 - 执行者 - 每个节点17个,每个执行器核心5个,执行程序内存 - 19 GB
这样,将资源正确分配给集群中的spark作业可以加快工作;有效利用现有资源。
答案 1 :(得分:0)
我建议你看一下这些参数:
--num-executors
:控制将分配多少执行程序
--executor-memory
:每个执行者的RAM
--executor-cores
:每个执行者的核心