Scala 为什么';指定给火花作业的执行器内存参数是否与纱线上分配的内存匹配?
我有一个早已被遗忘的关于火花执行器记忆的问题。我在代码中为spark作业提供了这些参数 案例1:Scala 为什么';指定给火花作业的执行器内存参数是否与纱线上分配的内存匹配?,scala,apache-spark,Scala,Apache Spark,我有一个早已被遗忘的关于火花执行器记忆的问题。我在代码中为spark作业提供了这些参数 案例1: object Pickup { val conf = new SparkConf().setAppName("SPLINTER").set("spark.executor.heartbeatInterval", "120s") .set("spark.network.timeout", "12000s") .set("spark.sql.orc.filterPushdow
object Pickup {
val conf = new SparkConf().setAppName("SPLINTER").set("spark.executor.heartbeatInterval", "120s")
.set("spark.network.timeout", "12000s")
.set("spark.sql.orc.filterPushdown", "true")
.set("spark.serializer", "org.apache.spark.serializer.KryoSerializer")
.set("spark.kryoserializer.buffer.max", "512m")
.set("spark.serializer", classOf[org.apache.spark.serializer.KryoSerializer].getName)
.set("spark.streaming.stopGracefullyOnShutdown", "true")
.set("spark.yarn.driver.memoryOverhead", "8192")
.set("spark.yarn.executor.memoryOverhead", "8192")
.set("spark.shuffle.service.enabled", "true")
.set("spark.sql.tungsten.enabled", "true")
.set("spark.executor.instances", "4")
.set("spark.executor.memory", "2g")
.set("spark.executor.cores", "5")
.set("spark.files.maxPartitionBytes", "268435468")
.set("spark.sql.shuffle.partitions","20")
...
...
...
}
执行器和驱动程序开销内存为8GB。
以下是该工作在纱线上的表现:
这是正在运行的执行器数量及其内存的外观
为什么分配的内存是53248MB(52GB)?它是否也会增加开销内存值?即使它像=>4个执行器*2gb每个执行器=>8gb+(8gb驱动程序开销+8gb执行器开销),它仍然是24gb
因此,我再次更改了作业中的内存参数,如下所示:
案例2:这一次,我将驱动程序和执行程序开销内存设置为2gb,保持其余内存不变
纱线作业:
背景中的执行人:
如果添加所有内存号,它仍然是:4个执行器*每个执行器2gb=>8gb+(2gb驱动程序开销+2gb执行器开销)。它仍然是12GB,小于20gb,分配的内存参数如工作卡中所示
Spark提交命令:
SPARK_MAJOR_VERSION=2 spark-submit --class com.partition.source.Pickup --master=yarn --conf spark.ui.port=4090 --driver-class-path /home/username/jars/greenplum.jar:/home/username/jars/postgresql-42.1.4.jar:/home/username/ReconTest/inputdir/myjars/hive-jdbc-2.3.5.jar --conf spark.jars=/home/username/jars/greenplum.jar,/home/username/jars/postgresql-42.1.4.jar,/home/username/ReconTest/inputdir/myjars/hive-jdbc-2.3.5.jar --executor-cores 4 --executor-memory 2G --keytab /home/username/username.keytab --principal username@DEVUSR.COM --files /$SPARK_HOME/conf/hive-site.xml,testconnection.properties --name Splinter --conf spark.executor.extraClassPath=/home/username/jars/greenplum.jar splinter_2.11-0.1.jar SSS
我在网上搜索,看看执行器内存是如何分布在整个作业中的。
大部分信息都是关于如何调整它,而不是解释它是如何分布的。
最容易混淆的部分是红色框中标记的工作卡的分配内存参数中显示的数字。我不明白53248MB(52GB)是如何分配给每个有4个2gb执行器的作业的
我是否缺少任何链接?谁能告诉我为什么那个该死的数字这么大?执行器内存在后台是如何分布的?每个执行器的实际内存是:
spark.executor.memory
+spark.warn.executor.memoryOverhead
spark.warn.executor.memoryOverhead
(如果未指定)=最大值(384MB,占spark.executor.memory的7%
)
因此,您有4个执行者~40G。1个驱动程序(1G+8GB)=>结果~52G是可以理解的
在您的案例中也是一样#2:~20GB(4个执行器:4*4=16G,1个驱动程序:1+2=3G)告诉我您的提交命令行脚本以将作业提交到Thread Cluster。在问题中添加了它。检查我的答案:3希望它有帮助是的,缺少的概念是为整个会话计算的执行器memoryOverhead设置。它需要每个执行者应用。executor*memoryoverhead的数量将解决资源计算中的泄漏问题。