我的集群配置如下:-
7 个节点,每个节点有 32 个核心和 252 GB 内存。
纱线配置如下:-
yarn.scheduler.maximum-allocation-mb - 10GB
yarn.scheduler.minimum-allocation-mb - 2GB
yarn.nodemanager.vmem-pmem-ratio - 2.1
yarn.nodemanager.resource.memory-mb - 22GB
yarn.scheduler.maximum-allocation-vcores - 25
yarn.scheduler.minimum-allocation-vcores - 1
yarn.nodemanager.resource.cpu-vcores - 25
地图缩减配置如下:-
mapreduce.map.java.opts - -Xmx1638m
mapreduce.map.memory.mb - 2GB
mapreduce.reduce.java.opts - -Xmx3276m
mapreduce.reduce.memory.mb - 4Gb
火花配置如下:-
spark.yarn.driver.memoryOverhead 384
spark.yarn.executor.memoryOverhead 384
现在,我尝试通过将值设置为主纱线以及执行器内存、执行器数量、执行器核心的不同值来运行spark-shell。
- Spark-shell --master 纱线 --executor-内存 9856M --num-executors 175 --executor-cores 1
在这种情况下,执行程序内存 + 384 对于纱线调度程序来说不能超过 10GB 最大值。所以在这种情况下 9856M + 384 MB = 10GB 所以它工作正常。现在,一旦 Spark shell 启动,执行程序总数为 124 个,而不是要求的 175 个。在 Spark shell 启动日志或 Spark UI 中看到每个执行程序的存储内存为 6.7 GB(即 10GB 的 67%)。
Spark shell 进程的 top 命令输出如下:-
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+
8478 hdp66-ss 20 0 13.5g 1.1g 25m S 1.9 0.4 2:11.28
所以虚拟内存是13.5G,物理内存是1.1G
- Spark-shell --master 纱线 --executor-内存 9856M --num-executors 35 --executor-cores 5
在这种情况下,执行程序内存 + 384 对于纱线调度程序来说不能超过 10GB 最大值。所以在这种情况下 9856M + 384 MB = 10GB 所以它工作正常。现在,一旦 Spark shell 启动,执行程序的总数为 35 个。在 Spark shell 启动日志或 Spark UI 中看到每个执行程序的存储内存为 6.7 GB(即 10GB 的 67%)。
Spark shell 进程的 top 命令输出如下:-
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+
5256 hdp66-ss 20 0 13.2g 1.1g 25m S 2.6 0.4 1:25.25
所以虚拟内存是13.2G,物理内存是1.1G
- Spark-shell --master 纱线 --executor-内存 4096M --num-executors 200 --executor-cores 1
在这种情况下,执行程序内存 + 384 对于纱线调度程序来说不能超过 10GB 最大值。所以在这种情况下 4096M + 384 MB = 4GB 所以它工作正常。现在,一旦 Spark shell 启动,执行程序的总数为 200。在 Spark shell 启动日志或 Spark UI 中看到每个执行程序的存储内存为 2.7 GB(即 4GB 的 67%)。
Spark shell 进程的 top 命令输出如下:-
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+
21518 hdp66-ss 20 0 19.2g 1.4g 25m S 3.9 0.6 2:24.46
所以虚拟内存是19.2G,物理内存是1.4G。
那么有人可以解释一下这些记忆和执行者是如何开始的吗?为什么在 Spark UI 上看到的内存是执行程序内存请求的 67%?以及每个执行器的虚拟内存和物理内存是如何决定的。