Spark 2.X: количество задач, установленных заданием Spark при запросе таблицы кустов с помощью Spark SQL - PullRequest
0 голосов
/ 26 сентября 2018

Уже задано множество вопросов о количестве заданий Spark и о том, как это связано с количеством разделов.Но почему-то я не могу понять следующий случай.

У меня есть таблица Hive (папка HDFS), которая содержит 160 сжатых паркетом файлов.Файлы в основном хорошо сбалансированы: самый маленький - 7,5 МБ, самый большой - 49,2 МБ.В браузере HDFS я вижу, что каждый файл находится в пределах 1 (не полного) блока HDFS (128 МБ).

Кластер имеет следующие свойства: 10 машин, 1 мастер и 9 рабочих.Каждая машина имеет 6 ядер (12 виртуальных ядер).Я использую пряжу.Более того:

spark.executor.cores = 6

Теперь я создаю следующий фрейм данных:

val myDF = spark.sql("SELECT * FROM myHiveTable WHERE myCol='someValue')

Еще до запуска задания можно заранее знать, что:

myDF.rdd.partitions.size

возвращает 60.

Для запуска задания необходимо действие, поэтому я записываю «myDF» в HDFS.Работа действительно приводит к 42 исполнителям и 60 задачам .

Моим вопросам:

  1. Если я начал с 160 разделов, почему я оказался в итогеимея 60?

  2. Если бы у меня было 60 задач и 10 машин, то мне оптимально потребовалось бы только 10 исполнителей (где-то я читал, что каждый исполнитель может выполнять столько задач параллельно, сколько иядер, что в моем случае 6).Я знаю, что это произойдет только в том случае, если набор данных будет идеально сбалансирован между датанодами, но 42 Исполнителя, как мне кажется, далеки от 10. Или мои рассуждения неверны?

  3. Как Спарк узнаетзаранее, даже до запуска запроса, это приведет к 60 разделам.

Спасибо!

1 Ответ

0 голосов
/ 19 октября 2018

Я думаю, что это могут быть ответы на вопросы 1 и 3.

По-видимому, если я читаю таблицу Hive (которая на самом деле является папкой) как rdd, я также получаю такое же количество разделов(60).Количество разделов rdd определяется конкретным InputFormat.Источник: Spark RDD количество разделов по умолчанию

Итак, я искал поведение Паркет, вызванное комментарием @Samson Scharfrichter, и обнаружил следующее: https://github.com/animeshtrivedi/notes/wiki/Parquet-partition-calculation

Min(defaultMinSplitSize (128MB, `spark.sql.files.maxPartitionBytes`,
    Max(openCostInByte(8MB, `spark.sql.files.openCostInBytes`,
        totalSize/defaultParallelism)
)

Так что, возможно, эта формула объясняет, почему 60, и как это можно рассчитать заранее.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...