Spark 2.X: количество задач, установленных заданием Spark при запросе таблицы Hive с помощью Spark SQL

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

У меня есть таблица Hive (папка HDFS), которая содержит 160 сжатых файлов Parquet. Файлы в основном хорошо сбалансированы: самый маленький - 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 Executors кажутся мне далекими от 10. Или мои рассуждения ошибочны?

  3. Как Spark может знать заранее, еще до выполнения запроса, что это приведет к 60 разделам.

Спасибо!

Для записи, уровень параллелизма с файлами Parquet - это количество «блоков строк», т.е. возможно больше, чем количество файлов (или меньше, если у вас есть пустые файлы).

Samson Scharfrichter 26.09.2018 20:38

@SamsonScharfrichter Не могли бы вы уточнить свой комментарий?

thebluephantom 27.09.2018 09:55

Есть ли здесь прогресс?

thebluephantom 27.09.2018 22:16
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
3
819
1

Ответы 1

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

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

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

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

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

Другие вопросы по теме