Итак, я понимаю, что в общем случае следует использовать coalesce()
когда:
количество разделов уменьшается из-за
filter
или какой-либо другой операции, что может привести к уменьшению исходного набора данных (RDD, DF).coalesce()
полезен для более эффективного выполнения операций после фильтрации большого набора данных.
Я также понимаю, что он менее дорогостоящий, чем repartition
поскольку он уменьшает перетасовку, перемещая данные только при необходимости. Моя проблема заключается в том, как определить параметр, который выполняет coalesce
(idealPartionionNo
). Я работаю над проектом, который был передан мне от другого инженера, и он использовал приведенный ниже расчет, чтобы вычислить значение этого параметра.
// DEFINE OPTIMAL PARTITION NUMBER
implicit val NO_OF_EXECUTOR_INSTANCES = sc.getConf.getInt("spark.executor.instances", 5)
implicit val NO_OF_EXECUTOR_CORES = sc.getConf.getInt("spark.executor.cores", 2)
val idealPartionionNo = NO_OF_EXECUTOR_INSTANCES * NO_OF_EXECUTOR_CORES * REPARTITION_FACTOR
Затем он используется с объектом partitioner
:
val partitioner = new HashPartitioner(idealPartionionNo)
но также используется с:
RDD.filter(x=>x._3<30).coalesce(idealPartionionNo)
Правильно ли это? В чем заключается основная идея вычисления idealPartionionNo
? Что такое REPARTITION_FACTOR
? Как я обычно это определяю?
Кроме того, поскольку YARN отвечает за определение доступных исполнителей "на лету", есть способ получить это число (AVAILABLE_EXECUTOR_INSTANCES
) на лету и использовать его для вычисления idealPartionionNo
(т.е. заменить NO_OF_EXECUTOR_INSTANCES
на AVAILABLE_EXECUTOR_INSTANCES
)?
В идеале, некоторые фактические примеры формы:
- Вот набор данных (размер);
- Здесь имеется ряд преобразований и возможных повторений RDD/DF.
- Здесь вы должны перераспределить/объединить.
- Предположим, что у вас есть
n
исполнителей сm
ядрами и коэффициент разбиения, равныйk
тогда:
- Идеальное количество разделов будет ==>???
Кроме того, если вы можете отсылать меня к хорошему блогу, который объясняет это, я бы очень признателен.