spark调优,调优参数,shuffle调优参数,jvm调优参数

1 篇文章 0 订阅
1 篇文章 0 订阅

spark 优化参数

查看执行计划
- explain(mode="simple")    // 只展示物理执行计划
- explain(mode="extended") 	// 展示物理执行计划和逻辑执行计划。
- explain(mode="codegen") 	// 展示要Codegen生成的可执行java代码。
- expalin(mode="cost") 		// 展示优化后的逻辑执行计划以及相关的统计。
- explain(mode="formatted")	// 以分隔的方式输出,它会输出更易读的物理执行计划,并展示每个节点的详细信息。
生产环境中标准的提交方式
bin/spark-submit \
--class com.atguigu.spark.Analysis \
--master yarn					
--deploy-mode cluster			#设置driver部署模式 ,表示drvier的运行的地方 默认为client
--num-executors 80 \			#设置Executor的数量 默认为2
--driver-memory 6g \			#设置driver的内存默认为512M
--executor-memory 6g \			#设置每个Executor的内存默认为1g
--executor-cores 3 \          	#设置每个Executor的cup核心数默认为1
--conf spark.yarn.executor.memoryOverhead=2048 \ # 设置每个YARN执行器(executor)的堆外内存开销 这里为2g
--conf spark.core.connection.ack.wait.timeout=300 \  #设置Spark任务之间通信的连接确认等待超时时间 这里为300毫秒
/usr/opt/modules/spark/jar/spark.jar \
开启CBO优化
spark.conf.set("spark.sql.cbo.enabled","true")
设置并行度参数
spark.conf.set("spark.default.parallelism","500")  // 设置任务并行度,也就是Task作业的数量 一般设置为executor * core * 3  ,该参数对spark sql无效,对rdd有效,如果想要提升spark-sql的并行度可以使用repartition()算子进行设置
设置kryo序列化
spark.conf.set("spark.serializer","KryoSerializer") // 设置序列化器为kryo序列化,该序列化比默认的java序列化快10倍
调节本地化等待时长
spark.conf.set("spark.locality.wait","6")  // 调节本地化时长,默认为3s,增加等待时长,减少本地化降级出现的网络IO,根据日志输出的本地化来进行判断,但是不能设置太大,否则过犹不及
Shuffle调优
调节map端缓冲区大小
spark.conf.set("spark.shuffle.file.buffer","64")  // 增加map缓冲区大小,以减少磁盘IO,默认为32kb
调节reduce端拉取数据缓冲区大小
spark.conf.set("spark.reduce.maxSizeInFlight","96") 
// 增加reduce端缓冲区大小,以减少数据拉去的次数,减少网络传输的次数,默认为48M,
// 如果map端的数据量非常大,写出的速度非常快,此时 reduce 端的所有 task 在拉取的时候,有可能全部达到自己缓冲的最大极限
// 值,即 48MB,此时,再加上 reduce 端执行的聚合函数的代码,可能会创建大量的对象,这可难会导致内存溢出,即 OOM。如果一旦出现 
// reduce 端内存溢出的问题,我们可以考虑减小 reduce 端拉取数据缓冲区的大小,例如减少为 12MB
调节reduce端拉取数据重试次数
spark.conf.set("spark.shuffle.io.maxRetries","6")  // 增加重试次数,避免因网络异常导致失败进行重试,默认为3秒
调节reduce端拉取数据等待间隔
spark.conf.set("spark.shuffle.io.retryWait", "60s") // 因网络问题异常导致失败,在一定时间后重试,可以加大间隔时长增加shuffle的
调节SortShuffle排序操作阈值
/*
当你使用 SortShuffleManager 时,如果的确不需要排序操作,那么建议将这个参数调大一些,大于 shuffle read task 的数量,
那么此时 map-side 就不会进行排序了,减少了排序的性能开销,但是这种方式下,依然会产生大量的磁盘文件,因此 shuffle write
性能有待提高。SortShuffleManager 排序操作阈值的设置可以通过 spark.shuffle.sort. bypassMergeThreshold 
这一参数进行设置,默认值为 200
*/
spark.conf.set("spark.shuffle.sort.bypassMergeThreshold", "400")
JVM调优
调节堆内内存
// 堆内内存包含
//  	Storage内存:存储缓存的数据的内存
//  	Executor内存:执行的内存
//  	Other内存:存储自定义的类结构化数据的内存

// 下面默认值根据版本差异而不同
saprk.conf.set("spark.storage.memoryFraction","0.4")  // 控制堆内存储(Storage)内存的占比区域 默认占用系统内存的60%
spark.conf.set("spark.shuffle.memoryFraction","0.4")  //  控制堆内执行(Execution)内存的占比区域 默认占用系统内存的20%
// 还有一部分其他(Other)内存为上面占用剩余的内存,默认为0.2
spark.conf.set("spark.shuffle.safetyFraction","0.8")  //  控制堆内执行内存的占用比默认0.8,可以用来预留内存可防止OOM
spark.conf.set("spark.storage.safetyFraction","0.9")  //  控制堆内存储内存的占用比默认0.9,可以用来预留内存可防止OOM

堆内内存计算公式

systemMaxMemory:为JVM堆内可用内存大小
可用的存储内存 = systemMaxMemory * spark.storage.memoryFraction * spark.storage.safetyFraction
可用的执行内存 = systemMaxMemory * spark.shuffle.memoryFraction * spark.shuffle.safetyFraction

统一内存管理机制

  • 根据 Spark 统一内存管理机制,堆内存被划分为了两块,Storage 和 Execution。Storage 主要用于缓存数据,Execution 主要用于缓存在 shuffle 过程中产生的中间数据,两者所组成 的内存部分称为统一内存,Storage 和 Execution 各占统一内存的 50%,由于动态占用机制的 实现,shuffle 过程需要的内存过大时,会自动占用 Storage 的内存区域,因此无需手动进行 调节。
堆外内存
spark.conf.set("spark.memory.offHeap.enabled","true")  // 开启堆外内存 默认是不启用堆外内存的
spark.conf.set("spark.memory.offHeap.size","1g")  // 设置堆外内存的大小
spark.conf.set("spark.memory.storageFraction","0.5")  // 指定堆外内存的存储区域(storage)所占用内存的比例,剩余部分就为执行内存

--conf spark.yarn.executor.memoryOverhead=2048  // 在sparksubmit调节堆外内存 默认300多MB
--conf spark.core.connection.ack.wait.timeout=300  // 调节连接等待时长
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值