Spark2内存调优总结 - 内存划分 与 内存计算 与 调参方式

使用的Spark2以上版本所以只考虑UnifiedMemoryManager动态内存管理,如图:

1. 内存划分 与 内存计算 与 调参方式

1.1 三部分:Spark内存、用户内存、预留内存

  1. 预留内存:300MB 固定
  2. Spark内存和用户内存比例由参数spark.memory.fraction(默认0.75) 控制
  3. 计算公式:
    假设:我们在submit提交参数设置 executor.memeory = 10G + 300M (方便计算),我们叫他为系统内存
    那么:
    Spark内存 = (系统内存 - 预留内存) fraction = (10G + 300M - 300M) * 0.75 = 7.5G*
    用户内存 = (系统内存 - 预留内存) (1 - fraction) = 10 G * (1 - 0.75) = 2.5G*

1.2 Spark内存又分为两部分:存储内存、执行内存

  1. 存储内存、执行内存比例有spark.memory.storageFraction(默认0.5) 控制
  2. 计算公式:
    假设:1.1的计算成立
    那么:
    存储内存 = Spark内存*storageFraction = 7.5G * 0.5 = 3.75G
    执行内存 = Spark内存*storageFraction = 7.5G * (1 - 0.5) = 3.75G

2. 内存参数调优

可以看出来实际设置了10G,而执行内存却只有了3.5G,所以需要根据业务来进行参数调整。

2.1 调大spark.memory.storageFraction=0.6

如果程序中有需要使用内存Cache的而不需要太多计算shuffer之类的那么可以增加存储内存,调大spark.memory.storageFraction参数

2.2 调小spark.memory.storageFraction=0.3

  1. 如果程序没有cache而又大量shuffer就需要执行内存大一些,调小spark.memory.storageFraction参数
  2. 如果我们程序运行比较慢了,可以使用Jstat -gc pid来查看GC情况,当发现GC频繁,就说明执行内存不够,需要调小spark.memory.storageFraction参数

3. 再说一点:JVM参数调整

  1. Jstat -gc pid发现Minor GC频繁,但是Full GC几乎没有,那么就需要调整JVM参数来调大Eden伊甸园区,使用-Xmn来调整
  2. 大小设置:
    说一个案例:
    假设:
    1.Spark读取的是HDFS上的文件,HDFS上默认的Block块大小为128M
    每个executor有8个core,executor-cores来设置
  3. 估算Eden区大小应为128M * 8 大约1G,考虑survivor区-Xmn = 4/3 * 1 G 大约1.4GB
  4. 2中是没有压缩的数据,假设数据进行压缩了,还要考虑压缩方式是否可以切片,例如使用Snappy压缩不能切片,每个文件700MB,那么Eden区的设置要把解压后数据膨胀考虑进去,假设膨胀3倍
    估算Eden = 700M* 3 * 8 大约 16G
    -Xmn = 4/3 * 16G 大约 21.5GB,才能保证程序可以正常执行,要不然很容易出现OOM,当前还可以设置堆外内存来缓解压力--conf spark.memory.offHeap.size=5g
  5. 更换压缩方式,尽量使用能够切片的压缩方式,如果不能只能增加存储的文件数来减小每个task读取数据的大小,或者减少Executor core来增大每个core的内存,但是Spark的并行度会降低,执行时间变长,需要自己权衡利弊。
  6. 注意:使用G1垃圾回收器时,不要使用 -Xmn 选项或 -XX:NewRatio 等其他相关选项显式设置年轻代大小。固定年轻代的大小会覆盖暂停时间目标。可以仅使用-Xms,-Xmx和暂停时间目标-XX:MaxGCPauseMillis ,经过测试如果设置-Xmn会经常出现Full GC,去掉后Full GC为0次,而且总的GC时间大大减少,spark程序卡顿减少。

3.1 -Xmn

-Xmn这里需要多说一下,经过线上执行情况分析,一开始使用的-Xmn=18G,Spark程序执行时间2.2小时,并伴有几十次Full GC;去掉-Xmn后,Spark程序执行时间58分钟,0次Full GC。第二次测试时我将每个executor_core设置为了5,第一次为8,并没有控制变量,因为目地是优化不是测试。
在这里插入图片描述在这里插入图片描述

4.对象的使用

为了减少有些数据结构与对象的元数据占用大量空间,尽量使用:
字符串代替对象,基本数据类型(int long)代替字符串,数组代替ArrayList等
String内部是一个char数据,char采用UTF-16编码,每个字符两字节,可以设置JVM参数 -XX:+UseCompressedStrings采用8位来编码每一个ASCII字符来压缩字符。

下面是我的参数,需要根据自己的程序去修改一些参数值:

# submit参数
spark-submit --master spark://192.168.11.167:7077 	\
--class $main --deploy-mode client --driver-memory 25g	\
--executor-memory 45g	\
--executor-cores 8	\
--total-executor-cores 320	\ 
--conf spark.memory.fraction=0.8	\
--conf spark.memory.storageFraction=0.3	\ 
--conf spark.memory.offHeap.enabled=true	\
--conf spark.memory.offHeap.size=5g	\
--conf spark.executor.memoryOverhead=5G	\
--conf spark.speculation=true	\
--conf spark.network.timeout=3000	\
--conf spark.executor.extraJavaOptions="-XX:+UseG1GC -XX:-TieredCompilation -XX:G1HeapRegionSize=16m -XX:InitiatingHeapOccupancyPercent=55 -XX:SoftRefLRUPolicyMSPerMB=0 -XX:-UseCompressedClassPointers -XX:MetaspaceSize=256m -XX:MaxMetaspaceSize=256m -XX:ReservedCodeCacheSize=512m -XX:+UseCodeCacheFlushing -XX:ParallelGCThreads=20 -XX:ConcGCThreads=20 -Xms20g -XX:+PrintGCDetails -XX:+PrintGCTimeStamps"	\
--conf spark.driver.extraJavaOptions="-XX:+UseG1GC" \
--jars $jars xxxx.jar $date1 $max $date2  >> log/$log_file#代码内参数
conf.set("spark.driver.maxResultSize", "8g");
conf.set("spark.serialize", "org.apache.spark.serializer.KryoSerializer");
conf.registerKryoClasses(new Class[]{ImmutableBytesWritable.class, HyperLogLog.class, HashSet.class, RegisterSet.class, IllegalArgumentException.class, FileCommitProtocol.TaskCommitMessage.class});
//conf.set("spark.kryo.registrationRequired","true"); #开启的话类没加到上面会报错
conf.set("spark.kryoserializer.buffer.mb", "10");
conf.set("spark.shuffle.file.buffer", "128");
conf.set("spark.reducer.maxSizeInFlight", "144");
conf.set("spark.shuffle.io.maxRetries", "50");
conf.set("spark.shuffle.io.retryWait", "5s");

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/437343.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java 通过id获取html代码_Maven私服安装配置,java通过私服下载代码,并打包后上传到私服(Nexus)...

Maven私服一般安装Nexus。首先,Nexus下载,访问Nexus官方网址https://www.sonatype.com/download-nexus-repo-oss下载完成后是个压缩包第二步 配置:1)将上一步下载的nexus解压2)端口和监听配置application-port:监听端口applicatio…

一些网站github等无法连接服务器的解决办法

1.打开站长工具 http://tool.chinaz.com/speedtest/ 2.搜索github.com/ 3. 点击总耗时-排序 4. 拿到延迟最低的ip地址20.205.243.166 5.修改本地dns windows:C:\Windows\System32\drivers\etc 修改hosts文件,末尾添加 20.205.243.166 github.com Lin…

【转】异步编程系列(Thread、Task、async/await、ajax等)

序 经过一番努力,我写的异步编程系列也算有头有尾,当然不是说这个系列已经更新完毕,这个头尾只是表示新旧知识点都有简单涉及到,接下去我还会丰富这一系列并且有机会整个小应用(愿景是弄一个开源组件吧,结合…

linux里qt画直线_Qt与Web混合开发(一)简单使用

前言《Qt与Web混合开发》系列文章,主要讨论Qt与Web混合开发相关技术。这类技术存在适用场景,例如:Qt项目使用Web大量现成的组件/方案做功能扩展,Qt项目中性能无关/频繁更新迭代的页面用html单独实现,Qt项目提供Web形式…

ES curator离线安装与部署

1.版本: es:6.5.1 curator:5.8.4 下载地址:https://www.elastic.co/guide/en/elasticsearch/client/curator/current/yum-repository.html#_signing_key_2 2.连接不上网站怎么办? 出现无法访问此网页的话&#xff0…

【转】1.1异步编程:线程概述及使用

从此图中我们会发现 .NET 与C# 的每个版本发布都是有一个“主题”。即:C#1.0托管代码→C#2.0泛型→C#3.0LINQ→C#4.0动态语言→C#5.0异步编程。现在我为最新版本的“异步编程”主题写系列分享,期待你的查看及点评。 传送门:异步编程系列目录……

安装python3.7.0的步骤_python 3.7.0 安装配置方法图文教程

本文记录了python 3.7.0 安装配置方法,供大家参考,具体内容如下 s1登入python官网 s2下载后缀为exe的可执行文件,并根据自己电脑/主机的系统选择32位还是64位。双击选择“python for windows”() 出现选择下载页面&…

ES:记录curator+nfs进行索引备份、创建快照的一次实践

1. 安装curator工具 下面是我离线安装的过程 https://blog.csdn.net/weixin_43736084/article/details/121775484?spm1001.2014.3001.5501 2.使用fs建立es存储库 我们使用NFS,下面是官网给出的几种仓库类型 2.1 fs建立存储库的注意事项 注意事项,…

【转】1.2异步编程:使用线程池管理线程

从此图中我们会发现 .NET 与C# 的每个版本发布都是有一个“主题”。即:C#1.0托管代码→C#2.0泛型→C#3.0LINQ→C#4.0动态语言→C#5.0异步编程。现在我为最新版本的“异步编程”主题写系列分享,期待你的查看及点评。 传送门:异步编程系列目录……

python matplotlib画散点图_python matplotlib库绘制散点图例题解析

假设通过爬虫你获取到了北京2016年3,10月份每天白天的最高气温(分别位于列表a,b),那么此时如何寻找出气温随时间(天)变化的某种规律? a [11,17,16,11,12,11,12,6,6,7,8,9,12,15,14,17,18,21,16…

Hadoop集群HDFS各节点磁盘使用率不平衡,使用balancer做数据平衡

HDFS上各节点磁盘大小不一致,新增节点 数据平衡前,是非常不均衡的,某些节点已经接近90了 集群的数据平衡已经迫在眉睫,必须要搞一搞了。 1.设置传输速率 我这里是万兆网卡,就先设置100M了 在两台master上分别执行&a…

【转】1.3异步编程:线程同步基元对象

开始《异步编程:同步基元对象(上)》 示例:异步编程:线程同步基元对象.rar 如今的应用程序越来越复杂,我们常常需要多线程技术来提高我们应用程序的响应速度。每个线程都由自己的线程ID,当前指令…

怎么查询共享使用人_企业微信微盘怎么共享使用?企业微信如何设置微盘权限?...

使用企业微信办公时,如果有文件需要共享给员工,我们可以将文件上传到微盘的共享空间中,让员工自行下载并查看。那么在企业微信中,我们该如何创建共享空间呢?1如何创建微盘共享空间企业微信微盘共享空间分为两种&#x…

HDFS和Spark配置LZO压缩,Spark读取LZO创建正常Task数量

1.说明 为了解决,数据日益增长并且目前使用Snappy压缩导致的Spark读取时会出现OOM,并且处理起来速度过慢的问题,决定使用LZOIndex来解决问题。 线上Hadoop版本3.2.1,Spark2.3.1,Lzo使用最新版0.4.21 2.未解决的问题…

提供写入的数据少于指定的数据_指定范围数据的汇总

下图(左表)记录的是某公司各部门员工的月薪,现需要根据下图(右表)对指定范围内的月薪进行汇总1、汇总月薪在【2000-4000元】范围内的工资总额。本案例的难点是:【工资总额】数据即是求和列,也是条件列,那么求和函数应该怎么写呢&a…

【转】1.4异步编程:轻量级线程同步基元对象

开始《异步编程:同步基元对象(下)》 示例:异步编程:轻量级线程同步基元对象.rar 在《异步编程:线程同步基元对象》中我介绍了.NET4.0之前为我们提供的各种同步基元(包括Interlocked、Monitor\l…

Windows高级编程学习笔记(一)

写在前面的话 之前学的Windows编程都是界面啊、网络编程啊之类的纯应用层面的东西,总是感觉而自己没有达到自己期望中的水平。什么水平呢?如果让你编写监控系统资源的工具,或者DLL注入相关软件,或者底层安全软件,可以胜…

【转】1.5异步编程:.NET4.X 数据并行

任务并行库 (TPL) 是 .NET Framework 4的 System.Threading 和 System.Threading.Tasks 命名空间中的一组公共类型和 API。TPL的目的在于简化向应用程序中添加并行性和并发性的过程,从而提高开发人员的工作效率。TPL会动态地按比例调节并发程度,以便最有…

idea全局搜索搜不全的BUG

搜不全真是坑坏我了,修改业务后,差点就卷铺盖走人了… 修改配置 打开help -> Find Action 输入registry后搜索(点击框内任意一行后,直接输入就是搜索) page.size 将100的值改大,一步到位100000

【转】1.6异步编程:IAsyncResult异步编程模型 (APM)

传送门:异步编程系列目录…… 大部分开发人员,在开发多线程应用程序时,都是使用ThreadPool的QueueUserWorkItem方法来发起一次简单的异步操作。然而,这个技术存在许多限制。最大的问题是没有一个内建的机制让你知道操作在什么时候…