spark提交任务时,需要为其分配执行资源,--num-executors --executor-memory --execuor-cores
如何设置资源参数配置,首先需要了解几个关键知识点:
Hadoop/Yarn/OS 守护进程:在集群上跑spark应用时,集群各节点上会有一些在后台执行的守护进程。如NameNode,Secondary NameNode,DataNode,JobTracker,TaskTracker等。因此在指定资源时,需要给这些守护进程预留足够的资源(每个节点约 1 core)
Yarn ApplicationMaster (AM):负责从ResourceManager申请应用所需资源,与NodeManagers协调启动ontainers,并监控资源的消耗状态,通常需要为AM预留 1 Executor 和 1024MB内存
HDFS 吞吐量:HDFS不擅长处理高并发的线程,通常在每个 Executor 有 5 个并发线程时达到最大的吞吐量
内存开销:下图展示了 spark on yarn 的内存使用情况,一般会有约 7% 的额外内存开销
- executor内存过大会导致较高的垃圾回收延迟
- 小executor(仅分配1core 和必要的内存)无法发挥同一个 JVM 内的多线程优势
小 Executor
每个executor 分配较少的cores以及内存,总的 executor 数量较多。
- 无法利用单个节点内同一 JVM 的多线程优势
- 广播变量等共享数据需要为每一个 executor 复制一份
大 Executor
每个 executor 分配较多 cores 和内存,总的 executor 数量较少
- 影响 AM 和 yarn各节点守护进程所必须的资源
- 影响 HFDS 的吞吐量
- 增加垃圾回收的延迟
在配置时需要对上述的优劣心中有数,在大、小 Executor 之间做折中选择。