共计 1929 个字符,预计需要花费 5 分钟才能阅读完成。
动态调配:
OS(操作系统预留)1 core 1G
core 并发能力 <=5
executor AM 预留 1 个 executor 余 executor= 总 executor-1
memory 预留每个 executor0.07 比例
MemoryOverhead max(384M, 0.07 × spark.executor.memory)
ExecutorMemory (总 m -1G(OS))/nodes_num-MemoryOverhead
例子 1 硬件资源:6 节点,每个节点 16 cores, 64 GB 内存
每个节点在计算资源时候,给操作系统和 Hadoop 的过程预留 1core,1GB,所以每个节点剩下 15 个 core 和 63GB
内存。
core 的个数 ,决定一个 executor 可能并发工作的个数。所以通常认为,一个 executor 越多的并发工作可能失去更好的性能,但有钻研显示一个利用并发工作超过 5,导致更差的性能。所以 core 的个数暂设置为 5 个。
5 个 core 是表明 executor 并发工作的能力,并不是说一个零碎有多少个 core,即便咱们一个 CPU 有 32 个 core,也设置 5 个 core 不变。
executor 个数,接下来,一个 executor 调配 5 core, 一个 node 有 15 core,从而咱们计算一个 node 上会有 3 executor(15 / 5),而后通过每个 node 的 executor 个数失去整个工作能够调配的 executors 个数。
咱们有 6 个节点,每个节点 3 个 executor,6 × 3 = 18 个 executors,额定预留 1 个 executor 给 AM,最终要配置 17 个 executors。
最初 spark-submit 启动脚本中配置 –num-executors = 17
memory,配置每个 executor 的内存,一个 node,3 executor,63G 内存可用,所以每个 executor 可配置内存为 63 / 3 = 21G
从 Spark 的内存模型角度,Executor 占用的内存分为两局部:ExecutorMemory 和 MemoryOverhead,预留出 MemoryOverhead 的内存量之后,才是 ExecutorMemory 的内存。
MemoryOverhead 的计算公式:max(384M, 0.07 × spark.executor.memory)
因而 MemoryOverhead 值为 0.07 × 21G = 1.47G > 384M
最终 executor 的内存配置值为 21G – 1.47 ≈ 19 GB
至此,Cores = 5, Executors= 17, Executor Memory = 19 GB
动态分配
如果采纳动态分配策略,executer 的个数下限是无穷大。这就意味着 Spark 工作在须要资源的状况下,会占用到集群左右资源,集群中会有其余利用也须要资源运行,所以咱们须要在集群层面上对 core 进行调配管制。
这就意味着咱们在基于用户拜访根底上,在基于 YARN 的工作中进行调配 core,咱们创立一个 spark_user,调配 min max 的 core 个数,这些 core 从 YARN 中剥离,区别于其余基于 YARN 调度利用(例如 Hadoop 等)
为了了解动静资源分配,首先须要理解一些属性配置项:
spark.dynamicAllocation.enabled:设置为 true,意味着咱们不关怀 executor 的个数,思考用到动静资源分配策略,在 stage 阶段会有一下区别:
以多少个 executor 启动 Spark 工作?
spark.dynamicAllocation.initialExecutors:初始化 executor 个数
怎么动态控制 executor 的个数?
咱们通过 spark-submit 的形式初始化 executor 个数,依据负载状况,工作在 min(
spark.dynamicAllocation.minExecutors)和 max(
spark.dynamicAllocation.maxExecutors)之间决定 executor 个数。
什么时候获取一个新的 executor 和放弃一个 executor
spark.dynamicAllocation.schedulerBacklogTimeout:依附这个参数,决定咱们什么时候获取一个新的 executor,每轮工作 executor 个数较前一轮将逞指数增长,比方第一轮 1 个 executor,后续增加 2,4,8 个 executor 的形式,在某些特定场景下,将应用 max(spark.dynamicAllocation.maxExecutors)个 executor。
spark.dynamicAllocation.executorIdleTimeout:executor 闲暇的工夫,超时之后,将 executor 移除