我正在独立模式下运行aws fargate上的spark批处理作业。在计算机环境中,我有 8 vcpu
作业定义有1个vcpu和2048 mb内存。在spark应用程序中,我可以指定要使用多少内核,并使用下面的代码执行此操作
sparkSess = SparkSession.builder.master("local[8]")\
.appName("test app")\
.config("spark.debug.maxToStringFields", "1000")\
.config("spark.sql.sources.partitionOverwriteMode", "dynamic")\
.getOrCreate()
``` `local[8]` 正在指定8个核心/线程(这是我的假设)。最初我运行spark应用程序时没有指定内核,我认为作业是在单线程中运行的,大约需要10分钟才能完成,但有了这个数字,它减少了处理时间。我从2开始,几乎减少到5分钟,然后我已经改为4,8,现在几乎需要4分钟。但是我不明白vcpu和spark线程之间的关系。不管我为核心指定了多少, `sparkContext.defaultParallelism` 向我展示了这个价值。
这样对吗?这个数字和我在作业定义或计算环境中指定的vcpu之间有什么关系吗。
1条答案
按热度按时间bq9c1y661#
您正在spark本地模式下运行。关于本地模式,learning spark有这样的说法:
spark驱动程序运行在单个jvm上,比如笔记本电脑或单个节点
spark executor与驱动程序在同一个jvm上运行
群集管理器在同一主机上运行
丹吉,朱尔斯s.,韦尼格,布鲁克,达斯,如来,李,丹尼。学习Spark(p。30). 奥莱利媒体。kindle版。
local[N]
以n个线程启动。给定上述本地模式的定义,这n个线程必须由本地模式驱动程序、执行器和集群管理器共享。因此,从可用的vcpu中,为驱动程序线程分配一个vcpu,为集群管理器分配一个vcpu,为操作系统分配一个vcpu,为executor分配其余的vcpu似乎是合理的。
执行器的线程/vCPU的最佳数量将取决于数据的分区数。