Уже задано множество вопросов о количестве заданий 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 задачам .
Моим вопросам:
Если я начал с 160 разделов, почему я оказался в итогеимея 60?
Если бы у меня было 60 задач и 10 машин, то мне оптимально потребовалось бы только 10 исполнителей (где-то я читал, что каждый исполнитель может выполнять столько задач параллельно, сколько иядер, что в моем случае 6).Я знаю, что это произойдет только в том случае, если набор данных будет идеально сбалансирован между датанодами, но 42 Исполнителя, как мне кажется, далеки от 10. Или мои рассуждения неверны?
Как Спарк узнаетзаранее, даже до запуска запроса, это приведет к 60 разделам.
Спасибо!