Конфигурирование Spark Executors на GCP Dataproc - PullRequest
2 голосов
/ 07 апреля 2020

Я не могу настроить YARN и Spark для использования всех ресурсов моего кластера Datapro c Spark на GCP.

Я использую 1 master (4 ядра) и 2 рабочих (16 ядер) ), и я хочу, чтобы мое приложение Spark использовало 30 ядер из 32 ядер, доступных на рабочих экземплярах. Но когда я смотрю на YARN UI, он говорит, что используются только 5 ядер. Когда я смотрю на интерфейс Spark Executors, он говорит, что используются 20 ядер. Когда я смотрю на активность процессора на рабочих, там почти нет активности.

Я совершенно сбит с толку. Пожалуйста, помогите.

Команда для создания кластера Datapro c:

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 logi c (возможно, с разделением или чем-то другим), я также предоставляю основную часть кода приложения spark. Я сомневаюсь, что это может быть причиной, потому что, когда я запускаю это локально на моей машине, я вижу, что загрузка ЦП полностью взрывается, и это то, что я ожидаю увидеть на рабочих узлах.

 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 говорит только о том, что выделено 5 виртуальных ядер, тогда как я хотел выделить 6 экземпляров по 5 ядер в каждом, всего 30 ядер.

YARN UI

В интерфейсе Spark Job говорится, что были добавлены только 4 исполнителя, тогда как я хотел 6 экземпляров исполнителя.

Spark UI

В интерфейсе Spark Executors говорится, что Каждому из 4 исполнителей выделено по 5 ядер, что соответствует моим настройкам, но когда я смотрю на загрузку ЦП на рабочих, там абсолютно нет активности.

Spark Executors UI

Htop не показывает активность процессора на рабочих узлах.

Htop Workers

Мне кажется, что я путаю все разные переменные YARN и Spark. Любая помощь будет по достоинству оценена.

1 Ответ

2 голосов
/ 08 апреля 2020

В вашем текущем задании № 3 всего 4 задания (скриншот № 2), поэтому вы видите 4 исполнителей. Spark не нужно 6 исполнителей для выполнения 4 задач.

Каждый исполнитель (скриншот №3) имеет 5 ядер и что-то похожее на 14 ГБ памяти ((14 ГБ -300 МБ) * 0,6 ~ 7,8 ГБ). См. Управление памятью Spark .

Каждый исполнитель выполняет одну задачу, что означает, что он использует только одно ядро ​​из 5 выделенных, следовательно, низкая загрузка ЦП. (В Spark исполнитель с ядрами X может обрабатывать задачи X параллельно. Он не может обрабатывать одну задачу на ядрах X).

...