Мой вопрос на шаге_1. Чтобы рассчитать количество задач, которые могут выполняться параллельно, программа-драйвер (DP) также должна знать количество блоков, хранящихся на диске для этого файла.
Знает ли DP об этом при создании LG, и затем задачи внутри содержат адрес каждого блока, чтобы каждый мог выполняться параллельно на отдельном узле?
Да, это называется "разбиение". Есть вызов Hadoop Filesystem API getBlockLocations
, который показывает, как файл разбивается на блоки, и имена хостов, на которых хранятся копии. Каждый формат файла также объявляет, является ли формат файла «разделяемым» на основе формата (text, CSV, PArquet, ORC == yes) и может ли сжатие также разделяться (snappy yes, gzip no)
Затем драйвер Spark делит обработку по файлам и по количеству разделений, которые он может выполнить для каждого файла, а затем планирует работу над доступными рабочими процессами, «близкими» к данным.
Для HDFS разбиение / расположение блоков определяется при записи файлов: они записываются в виде блоков (конфигурируются) и распределяются по кластеру.
Для хранилищ объектов нет реального разделения или местоположения; каждый клиент имеет некоторую опцию конфигурации для управления размером блока, который он объявляет (например, fs.s3a.blocksize), и просто говорит «localhost» для местоположения. Spark знает, что когда он видит localhost, он означает «где угодно»