任务提交脚本脚本模板我们在向YARN提交Spark作业时,通常使用如下脚本模板:spark-submit--classclass-name--masteryarn--deploy-modecluster--driver-memory4g--num-executors2--executor-memory2g--executor-cores2参数解释具体参数含义如下图所示:executor-cores每个executor的最大core数num-executors=pernode的个数executors*worknodesnumberofexecutorspernode=总核数/每个executor最大cup核数,具体通过参数yarn.nodemanager.resource.cpu-vcores进行配置,例如,该值配置为:33,参数executor-cores的值为:5,则每个节点的executor数量=(33-1[操作系统保留])/5=6,假设集群节点数量为10,则num-executors=6*10=60executor-memory这个的值参数取决于:yarn-nodemanager.reaource.memory-mb,该参数限制了每个节点的容器的最大内存值。该参数的值=yarn-nodemanager.reaource.memory-mb/每个节点的executor数量,如果yarn的参数配置为160,则yarn-nodemanager.reaource.memory-mb/每个节点的executor数量=160/6≈26GBSpark程序提交运行过程submitjobresourcemanagerallocateresourcesstartappmasterAppmaster和Driver会同步创建Sparkdriver与resourcemanager通信获取各个节点的可用资源resourcemanager分配资源sparkdriver在工作节点上启动executor执行器向驱动程序发送心跳信息。驱动程序将结果发送给客户端。内存管理图Spark2.X的内存管理模型如下图所示:Spark中的内存使用大致包括两种:执行和存储。执行内存是指用于shuffle、join、sorting、aggregation等计算的内存存储。内存是指集群内部用于持久化和广播内部数据的内存。在Spark中,执行内存和存储内存共享一个统一的区域。当不使用执行内存时,存储内存可以占用所有可用内存,反之亦然。执行内存可以在必要时消耗存储空间,但前提是总存储内存使用量低于某个阈值。这种设计确保了几个理想的特性。首先,不使用缓存的应用程序可以使用整个空间执行,从而避免不必要的磁盘溢出。其次,使用缓存的应用程序可以保留最小的存储空间。最后,这种方法为各种工作负载提供了合理的开箱即用性能,而无需用户具备内部内存分区方面的专业知识。虽然有两个相关的配置,但通常不需要调整它们,因为默认值适用于大多数工作负载:spark.memory.fraction默认为(JVMheapmemory-300MB)的一小部分(默认0.6)。剩余空间(40%)保留用于用户数据结构、Spark中的内部元数据以及在稀疏和异常大的记录的情况下防止OOM错误。spark.memory.storageFraction默认大小为(JVM堆内存-300MB)0.60.5。
