在GCP DataProc上配置Spark执行器

问题描述 投票:1回答:1

我无法配置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个核心。

YARN UI

在Spark Job UI上说仅添加了4个执行者,而我想要6个执行者实例。

Spark UI

在Spark Executors UI上,它为4个执行程序分配了5个内核,这与我的设置相对应,但是当我查看工作人员的CPU使用率时,那里绝对没有任何活动。

Spark Executors UI

Htop显示辅助节点上没有CPU活动。

Htop Workers

我觉得我混淆了Yarn和Spark的所有不同变量。任何帮助将不胜感激。

apache-spark yarn google-cloud-dataproc
1个回答
0
投票

您正在执行的作业#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核上处理一个任务。)

© www.soinside.com 2019 - 2024. All rights reserved.