spark调优篇-Spark ON Yarn 内存管理(汇总)
本文旨在解析 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 被杀死
- Removing executor 5 with no recent heartbeats: 120504 ms exceeds timeout 120000 ms
- Container killed by YARN for exceeding memory limits
- Consider boosting spark.yarn.executor.memoryOverhead
- spark-OutOfMemory:GC overhead limit exceeded
常规思路
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 内存管理(汇总)的更多相关文章
- spark调优篇-spark on yarn web UI
spark on yarn 的执行过程在 yarn RM 上无法直接查看,即 http://192.168.10.10:8088,这对于调试程序很不方便,所以需要手动配置 配置方法 1. 配置 spa ...
- 【翻译】Spark 调优 (Tuning Spark) 中文版
由于Spark自己的调优guidance已经覆盖了很多很有价值的点,因此这里直接翻译一份过来.也作为一个积累. Spark 调优 (Tuning Spark) 由于大多数Spark计算任务是在内存中运 ...
- spark调优篇-oom 优化(汇总)
spark 之所以需要调优,一是代码执行效率低,二是经常 OOM 内存溢出 内存溢出无非两点: 1. Driver 内存不够 2. Executor 内存不够 Driver 内存不够无非两点: 1. ...
- Android性能调优篇之探索JVM内存分配
开篇废话 今天我们一起来学习JVM的内存分配,主要目的是为我们Android内存优化打下基础. 一直在想以什么样的方式来呈现这个知识点才能让我们易于理解,最终决定使用方法为:图解+源代码分析. 欢迎访 ...
- spark调优篇-数据倾斜(汇总)
数据倾斜 为什么会数据倾斜 spark 中的数据倾斜并不是说原始数据存在倾斜,原始数据都是一个一个的 block,大小都一样,不存在数据倾斜: 而是指 shuffle 过程中产生的数据倾斜,由于不同的 ...
- Android性能调优篇之探索垃圾回收机制
开篇废话 如果我们想要进行内存优化的工作,还是需要了解一下,但这一块的知识属于纯理论的,有可能看起来会有点枯燥,我尽量把这一篇的内容按照一定的逻辑来走一遍.首先,我们为什么要学习垃圾回收的机制,我大概 ...
- 【Spark篇】---Spark调优之代码调优,数据本地化调优,内存调优,SparkShuffle调优,Executor的堆外内存调优
一.前述 Spark中调优大致分为以下几种 ,代码调优,数据本地化,内存调优,SparkShuffle调优,调节Executor的堆外内存. 二.具体 1.代码调优 1.避免创建重复的RDD,尽 ...
- (转)Spark性能优化:资源调优篇
在开发完Spark作业之后,就该为作业配置合适的资源了.Spark的资源参数,基本都可以在spark-submit命令中作为参数设置.很多Spark初学者,通常不知道该设置哪些必要的参数,以及如何 ...
- 【转载】 Spark性能优化:资源调优篇
在开发完Spark作业之后,就该为作业配置合适的资源了.Spark的资源参数,基本都可以在spark-submit命令中作为参数设置.很多Spark初学者,通常不知道该设置哪些必要的参数,以及如何设置 ...
随机推荐
- pandas入门之DataFrame
创建DataFrame - DataFrame是一个[表格型]的数据结构.DataFrame由按一定顺序排列的多列数据组成.设计初衷是将Series的使用场景从一维拓展到多维.DataFrame既有行 ...
- c++ 排序,<< 运算符重载
#include <iostream> #include <functional> #include <list> using namespace std; ost ...
- springboot中web应用的统一异常处理
在web应用中,请求处理过程中发生异常是非常常见的情况.springboot为我们提供了一个默认的映射:/error,当处理中抛出异常之后,会转到该请求中处理,并且该请求有一个全局的错误页面用来展示异 ...
- 【面试题总结】1、统计字符串中某个单词出现的次数(1-C++实现)
[解决方法一]C++ map解决 一.map中的find函数: 用于查找map中是否包含某个关键字条目,传入的参数是要查找的key,最后返回一个迭代器,如果没有找到,则返回的迭代器等于end()返回的 ...
- csp-s模拟106
这场其实心态十分爆炸,首先一下午改上次破T3卡常一下午没过,心情十分暴躁.上来开题不顺利,T1想了一个小时没动.于是跳到T2,看T2的80pts貌似可拿就先打了.T3只会判10分,又想打个$2^{2N ...
- Mac 上卸载node和npm
Mac 上卸载node和npm 卸载node依次在终端执行下面的脚本 sudo npm uninstall npm -gsudo rm -rf /usr/local/lib/node /usr/loc ...
- 在基于Android以及Jetson TK平台上如何写32位的Thumb-2指令
由于Android以及Jetson TK的编译工具链中的汇编器仍然不支持大部分的32位Thumb-2指令,比如add.w,因此我们只能通过手工写机器指令码来实现想要的指令.下面我将简单地介绍如何在AR ...
- Qt编写安防视频监控系统3-通道交换
一.前言 最开始写通道交换的功能的时候,走了很多弯路,比如最开始用最初级的办法,触发交换的时候,先关闭视频,然后设置新的url重新打开视频,这样处理非常低级而且耗内存还卡还很慢,毕竟重新打开视频都需要 ...
- mysql大数据量下优化
1 优化sql和索引2 增加缓存如:redis3 主从复制或主主复制,读写分离4 利用mysql自带分区表5 先做垂直拆分,将一个大系统分为多个小系统,也就是分布式6 水平切分,要选择一个合理的sha ...
- 运行React Native项目出现白屏,无法运行
运行React Native出现白屏,无法运行,查看终端报错如下: 原因: 代码中有语法错误,导致运行失败. 其实到这里可以去Xcode查看控制台打印,会提示哪个文件出现错误的. 解决办法: 找到报错 ...