线上示例
spark任务参数:
spark.executor.instances: 15
spark.executor.memory :8G
spark.driver.memory:4G
计算申请的内存应该是 14G+158G=124G
提交到yarn上,申请到的内存是143360M=140G
相差16G,多出来的16G是怎么来的?
spark on yarn参数
一个executor会申请到一个固定资源大小的container,相当于一个JVM进程,同时yarn也会保留一个container用来跑ApplicationMaster,就是spark任务中的driver。
yarn的默认参数:
yarn.scheduler.minimum-allocation-mb 每个container的最小内存值yarn.scheduler.maximum-allocation-mb 每个container的最大内存值**
spark的executor申请的container大小必须在两者之间,同时也要求是yarn.scheduler.minimum-allocation-mb的整数倍。
spark on yarn有一个memoryOverhead的概念,是为了防止内存溢出额外设置的一个值,可以用spark.yarn.executor.memoryOverhead和参数手动设置,如果没有设置,默认memoryOverhead的大小由以下公式计算:
memoryOverhead = max(spark.executor.memory * MEMORY_OVERHEAD_FACTOR,384)
MEMORY_OVERHEAD_FACTOR(默认0.1),对应参数spark.memory.fraction
结果
综上可以计算:
spark.executor.instances: 15
spark.executor.memory :8G
spark.driver.memory:4G
yarn.scheduler.minimum-allocation-mb :1G
申请16个container,其中driver内存是:4G+max(4G0.1,384M)=4506M,向上取1G的整数倍,就是5G
executor内存是:8G+max(8G0.1,384M)=9011M,向上取1G的整数倍,就是9G
最终申请到yarn资源为 5G+15*9G=140G=143360M,与实际相符