我无法配置yarn和spark以利用我在GCP上的Dataproc Spark集群上的所有资源。
我正在运行一个1个主(4个核心)集群和2个工作(16个核心)集群,我希望我的spark应用程序使用工作实例上32个可用核心中的30个核心。但是,当我查看yarn UI时,它说仅使用了5个核心。当我查看Spark Executors UI时,它说正在使用20个内核。当我查看工人的CPU活动时,几乎没有任何活动。
我完全感到困惑。请帮助。
创建dataproc集群的命令:
gcloud dataproc clusters create default-cluster \
--region europe-west1 --subnet default --zone europe-west1-d \
--master-machine-type n1-standard-4 --master-boot-disk-size 500 \
--num-workers 2 --worker-machine-type n1-standard-16 --worker-boot-disk-size 500 \
--image-version 1.4-debian9 \
--project product-normalyzr
提交作业的命令:
gcloud dataproc jobs submit spark --cluster=default-cluster \
--region=europe-west1 \
--properties=spark.executor.instances=6,spark.executor.cores=5,spark.executor.memory=14g \
--jars=dist/yzr-core-scala_2.11-0.1.jar,dist/deps/gson-2.8.6.jar,dist/deps/picocli-4.2.0.jar \
--class=solutions.yzr.pnormalyzr.similarity.Main
我创建Spark上下文的方式:
def buildSession(appName: String): SparkSession = {
SparkSession
.builder()
.appName(appName)
.getOrCreate()
}
如果问题可能与spark逻辑有关(可能是分区或其他原因),我还将提供spark应用程序代码的主要部分。我怀疑这可能是原因,因为当我在计算机上本地运行时,我发现CPU使用率完全爆炸了,这就是我希望在工作节点上看到的。
println("Load features")
val features = session.sparkContext.textFile(inputPath)
.map((rawText: String) => {
new Gson().fromJson(rawText, classOf[DocFeatures])
})
features.take(5).foreach(println)
println("Compute Scores")
val scores = features.cartesian(features)
// compute similarity
.map((d: (DocFeatures, DocFeatures)) => {
val docA = d._1
val docB = d._2
val (score, explain) = SimilarityMetric.score(docA, docB)
SimilarityScore(
pA = docA.slug,
pB = docB.slug,
score = score,
explain = explain)
})
// filter items with no similarity
.filter(s => s.score > 0)
scores.take(5).foreach(println)
println("Export")
// store to disk
val scoreStrings = scores.map(d => {
new Gson().toJson(d)
})
scoreStrings.take(5).foreach(println)
scoreStrings.saveAsTextFile(outputPath)
session.close()
println("End")
在Yarn UI上,它只说分配了5个vcore,而我想分配6个实例,每个实例具有5个核心,因此总共有30个核心。
在Spark Job UI上说仅添加了4个执行者,而我想要6个执行者实例。
在Spark Executors UI上,它为4个执行程序分配了5个内核,这与我的设置相对应,但是当我查看工作人员的CPU使用率时,那里绝对没有任何活动。
Htop显示辅助节点上没有CPU活动。
我觉得我混淆了Yarn和Spark的所有不同变量。任何帮助将不胜感激。
您正在执行的作业#3只有4个任务(屏幕截图2),这就是为什么您看到4个执行者的原因。 Spark不需要6个执行者即可完成4个任务。
每个执行器(屏幕截图3)具有5个核心,看起来像14GB内存((14GB -300MB)* 0.6〜7.8GB)。参见Spark memory management。
每个执行程序执行一个任务,这意味着它仅使用分配的5个内核中的一个,因此CPU使用率较低。 (在Spark中,具有X核的执行程序可以并行处理X个任务。它不能在X核上处理一个任务。)