本文旨在解析 spark on Yarn 的内存管理,使得 spark 调优思路更加清晰

内存相关参数

spark 是基于内存的计算,spark 调优大部分是针对内存的,了解 spark 内存参数有也助于我们理解 spark 内存管理

  • spark.driver.memory:默认 512M
  • spark.executor.memory:默认 512M
  • spark.yarn.am.memory:默认 512M
  • spark.yarn.driver.memoryOverhead:driver memory * 0.10, with minimum of 384
  • spark.yarn.executor.memoryOverhead:executor memory * 0.10, with minimum of 384
  • spark.yarn.am.memoryOverhead:am memory * 0.10, with minimum of 384
  • executor-cores:executor 相当于一个进程,cores 相当于该进程里的线程

内存解析

spark.xxx.memory / --xxx-memory 是 JVM 堆区域,但是 JVM 本身也会占用一定的堆空间,这部分由 spark.yarn.xxx.memoryOverhead 确定,二者关系如下图

内存分配

为了更好的利用 spark 内存,通常我们需要在 Yarn 集群中设置如下参数  【非必须】

<property>
<name>yarn.nodemanager.resource.memory-mb</name>
<value>106496</value> <!-- 104G -->
</property>
<property>
<name>yarn.scheduler.minimum-allocation-mb</name>
<value>2048</value>
</property>
<property>
<name>yarn.scheduler.maximum-allocation-mb</name>
<value>106496</value>
</property>
<property>
<name>yarn.app.mapreduce.am.resource.mb</name>
<value>2048</value>
</property>
  • yarn.app.mapreduce.am.resource.mb:am 能申请的最大内存
  • yarn.nodemanager.resource.memory-mb:nodemanager 能申请的最大内存
  • yarn.scheduler.minimum-allocation-mb:任务调度时一个 container 可申请的最小内存
  • yarn.scheduler.maximum-allocation-mb:任务调度时一个 container 可申请的最大内存

yarn.scheduler.minimum-allocation-mb 是 Container 的内存基本单位,也就是说 Container 的内存必须是 yarn.scheduler.minimum-allocation-mb 的整数倍,

比如 yarn.scheduler.minimum-allocation-mb 设置为 2G,2048M,

如果内存申请为 512M,512+384<2048M,会被分配 2G 内存,

如果内存申请为 3G,3072+384=3456M<4096M,会被分配 4G 内存,

如果申请内存为 6G,6144+614=6758<8192M,会被分配 8G 内存,          【max(6144*0.1, 384)=614】

所以当设定 --executor-memory 为 3G 时,Container 实际内存并非 3G

常见问题

常见的问题无非就是 内存不足 或者 container 被杀死

常规思路

1. 第一解决办法就是增加总内存    【此法不能解决所有问题】

2. 其次考虑数据倾斜问题,因为数据倾斜导致某个 task 内存不足,其它 task 内存足够

  // 最简单的方法是 repartition    【此法不能解决所有问题】

3. 考虑增加每个 task 的可用内存

  // 减少 Executor 数

  // 减少 executor-cores 数

参数设置注意事项

executor-memory

1. 设置过大,会导致 GC 过程很长,64G 是推荐的 内存上限  【根据硬件不同,可寻找合适的上限】

2. 设置过小,会导致 GC 频繁,影响效率

executor-cores

1. 设置过大,并行度会很高,容易导致 网络带宽占满,特别是从 HDFS 读取数据,或者是 collect 数据回传 Driver

2. 设置过大,使得多个 core 之间争夺 GC 时间以及资源,导致大部分时间花在 GC 上

参考资料:

https://www.cnblogs.com/saratearing/p/5813403.html#top

https://blog.csdn.net/pearl8899/article/details/80368018

https://www.so.com/s?q=with+minimum+of+384&src=se_zoned

https://blog.cloudera.com/how-to-tune-your-apache-spark-jobs-part-2/  英文博客

spark调优篇-Spark ON Yarn 内存管理(汇总)的更多相关文章

  1. spark调优篇-spark on yarn web UI

    spark on yarn 的执行过程在 yarn RM 上无法直接查看,即 http://192.168.10.10:8088,这对于调试程序很不方便,所以需要手动配置 配置方法 1. 配置 spa ...

  2. 【翻译】Spark 调优 (Tuning Spark) 中文版

    由于Spark自己的调优guidance已经覆盖了很多很有价值的点,因此这里直接翻译一份过来.也作为一个积累. Spark 调优 (Tuning Spark) 由于大多数Spark计算任务是在内存中运 ...

  3. spark调优篇-oom 优化(汇总)

    spark 之所以需要调优,一是代码执行效率低,二是经常 OOM 内存溢出 内存溢出无非两点: 1. Driver 内存不够 2. Executor 内存不够 Driver 内存不够无非两点: 1. ...

  4. Android性能调优篇之探索JVM内存分配

    开篇废话 今天我们一起来学习JVM的内存分配,主要目的是为我们Android内存优化打下基础. 一直在想以什么样的方式来呈现这个知识点才能让我们易于理解,最终决定使用方法为:图解+源代码分析. 欢迎访 ...

  5. spark调优篇-数据倾斜(汇总)

    数据倾斜 为什么会数据倾斜 spark 中的数据倾斜并不是说原始数据存在倾斜,原始数据都是一个一个的 block,大小都一样,不存在数据倾斜: 而是指 shuffle 过程中产生的数据倾斜,由于不同的 ...

  6. Android性能调优篇之探索垃圾回收机制

    开篇废话 如果我们想要进行内存优化的工作,还是需要了解一下,但这一块的知识属于纯理论的,有可能看起来会有点枯燥,我尽量把这一篇的内容按照一定的逻辑来走一遍.首先,我们为什么要学习垃圾回收的机制,我大概 ...

  7. 【Spark篇】---Spark调优之代码调优,数据本地化调优,内存调优,SparkShuffle调优,Executor的堆外内存调优

    一.前述 Spark中调优大致分为以下几种 ,代码调优,数据本地化,内存调优,SparkShuffle调优,调节Executor的堆外内存. 二.具体    1.代码调优 1.避免创建重复的RDD,尽 ...

  8. (转)Spark性能优化:资源调优篇

      在开发完Spark作业之后,就该为作业配置合适的资源了.Spark的资源参数,基本都可以在spark-submit命令中作为参数设置.很多Spark初学者,通常不知道该设置哪些必要的参数,以及如何 ...

  9. 【转载】 Spark性能优化:资源调优篇

    在开发完Spark作业之后,就该为作业配置合适的资源了.Spark的资源参数,基本都可以在spark-submit命令中作为参数设置.很多Spark初学者,通常不知道该设置哪些必要的参数,以及如何设置 ...

随机推荐

  1. Python经典练习题1:一个整数,它加上100后是一个完全平方数,再加上168又是一个完全平方数,请问该数是多少?

    Python经典练习题 网上能够搜得到的答案为: for i in range(1,85): if 168 % i == 0: j = 168 / i; if i > j and (i + j) ...

  2. JAVA基础知识|枚举

    将代码中经常使用的常量,放在枚举中,是一个很好的编码习惯.便于统一修改,同时也增强代码的严谨和稳定性.当然,枚举的应用有很多,这里我只做一个简单的演示,以后看到有趣的使用,会慢慢丰富 package ...

  3. SO2O連接報錯javax.net.ssl.SSLException: Received fatal alert: protocol_version)

    原文:https://blog.csdn.net/gudejundd/article/details/89640741 1.什么是TLSSSL 是“Secure Sockets Layer”的缩写,中 ...

  4. 通过xshell在本地win主机和远程linux主机传输文件

    1.下载和安装xshell此处不再介绍 2.安装lrzsz的软件 yum install lrzsz 3.通过xshell上传文件 只需要在XShell的菜单中点击File – Transfer – ...

  5. LeetCode 被围绕的区域

    给定一个二维的矩阵,包含 'X' 和 'O'(字母 O). 找到所有被 'X' 围绕的区域,并将这些区域里所有的 'O' 用 'X' 填充. 示例: X X X X X O O X X X O X X ...

  6. Kotlin 中类函数

    在kotlin中函数可以在类外部定义也可以在类内部定义,前者即为全局函数,后者,是类成员函数,语法一样 package loaderman.demo class Person { fun demo(n ...

  7. JS中的prototype、__proto__与constructor(图解)

    作为一名前端工程师,必须搞懂JS中的prototype.__proto__与constructor属性,相信很多初学者对这些属性存在许多困惑,容易把它们混淆,本文旨在帮助大家理清它们之间的关系并彻底搞 ...

  8. javascript两个数组内容合并

    需求: ,,]; ,,]; 最终结果: [,,,,,] 代码: Array.prototype.addAll= function(arr) { this.push.apply(this, arr); ...

  9. 免费申请https

    https://blog.csdn.net/MariaOzawa/article/details/81877756 实测有效

  10. 【JS新手教程】弹出两层div,及在LODOP内嵌上层

    前面的博文有个简单的弹出div层[JS新手教程]浏览器弹出div层1,有一层,不过为了提示,一般会不让用户可以点击该提示之外的地方的.如果让用户弹出层后,把其他的按钮和链接都设置不可用应该比较麻烦,如 ...