前言
承接上文,本文演示使用堆外内存及参数设置。
提到堆外内存,必须先去提到在yarn申请资源的单位,容器。在Spark on yarn模式中,一个容器到底会去申请多少内存资源是由堆外加上堆内两块内存决定的。
yarn的配置项里一个容器可以申请多大内存由yarn.scheduler.maximum-allocation-mb决定。而Spark当中则有
spark.executor.memoryOverhead,spark.executor.memory,spark.memory.offHeap.size
spark.executor.pyspark.memory,四个参数决定,也就是这四个参数相加的和不能大于yarn.scheduler.maximum-allocation-mb
的值(如果不使用pyspark可以忽略spark.executor.pyspark.memory此参数)。
三个参数:
1. spark.executor.memory: spark提交任务时指定的堆内内存。
2. spark.executor.memoryOverhead:spark堆外内存参数,内存额外开销,默认开启,默认值为spark.executor.memory*0.1并且会与最小值384mb做对比,取两个值较大的值。
3. spark.memory.offHeap.size:堆外内存参数,spark中默认关闭,
需要将spark.memory.enable.offheap.enable参数设置为true
测试参数控制
修改对应yarn参数配置,yarn.scheduler.maximum-allocation-mb修改为4G。
提交spark on yarn任务并指定参数,故意将
spark.executor.memoryOverhead+spark.executor.memory+spark.memory.offHeap.size 申请的资源大于4G
spark-submit --master yarn --deploy-mode client --driver-memory 1g --num-executors 3 --executor-cores 4 --conf spark.memory.offHeap.enabled=true --conf spark.memory.offHeap.size=2g --executor-memory 2g --queue spark --class com.atguigu.sparksqltuning.SMBJoinTuning spark-sql-tuning-1.0-SNAPSHOT-jar-with-dependencies.jar
堆内内存申请为2g,spark.memory.offHeap.size堆外为2g,
spark.executor.memoryOverhead默认值2g*0.1在与384mb比较取最大值这时为384mb,三个参数相加大于4G,所以这时会提示错误
这时可修改参数,重新提交
spark-submit --master yarn --deploy-mode client --driver-memory 1g --num-executors 3 --executor-cores 4 --conf spark.memory.offHeap.enabled=true --conf spark.memory.offHeap.size=1g --executor-memory 2g --queue spark --class com.atguigu.sparksqltuning.SMBJoinTuning spark-sql-tuning-1.0-SNAPSHOT-jar-with-dependencies.jar
堆外内存参数
spark.memory.offHeap.size和spark.executor.memoryOverhead两个参数都是控制堆外内存大小,在3.0之前的版本
spark.memory.offHeap.size此参数包含于spark.executor.memoryOverhead内也就是spark.memory.offHeap.size的参数值应小于spark.executor.memoryOverhead的参数。而到了3.0之后两块内存互相独立了,不再是包含关系。
查看2.4.5和3.0.0的yarn申请源码。
使用堆外内存缓存
import com.atguigu.sparksqltuning.MemoryTuning.CoursePay
import org.apache.spark.SparkConf
import org.apache.spark.sql.SparkSession
import org.apache.spark.storage.StorageLevel
object OFFHeapCache {
def main(args: Array[String]): Unit = {
val sparkConf = new SparkConf().setAppName("test")
val sparkSession = SparkSession.builder().config(sparkConf).enableHiveSupport().getOrCreate()
import sparkSession.implicits._
val result = sparkSession.sql("select * from dwd.dwd_course_pay ").as[CoursePay]
result.persist(StorageLevel.OFF_HEAP)
result.foreachPartition((p: Iterator[CoursePay]) => p.foreach(item => println(item.orderid)))
while (true) {
}
}
}
提交yarn任务查看Storage内存消耗
结论
何时使用堆外内存。堆外内存不受JVM垃圾收集器机制管理,有助于GC的开销,当需要缓存非常多GB的数据时可以考虑使用堆外内存,将数据缓存的工作交给堆外降低Java垃圾收集器带来的压力。让JAVA GC专心为应用程序计算工作,缓存交给堆外。
大数据和云计算的关系
大数据项目架构
大数据HBase原理
大数据技术生态体系
大数据面试题整合
页面更新:2024-05-21
本站资料均由网友自行发布提供,仅用于学习交流。如有版权问题,请与我联系,QQ:4156828
© CopyRight 2020-2024 All Rights Reserved. Powered By 71396.com 闽ICP备11008920号-4
闽公网安备35020302034903号