Spark_apply и управление ресурсами

Я пытаюсь определить, какая память должна быть выделена для исполнителей / драйвера Spark, когда я использую spark_apply.

Вопрос сводится к тому, сколько памяти следует выделить драйверу и исполнителю и как распределить ее между приложением Spark / блоком пользовательской памяти / где-либо еще?

Пример

В качестве примера предположим, что есть входной фрейм данных искры, содержащий вектор из 1 миллиарда целых чисел, разделенных на 10 частей равного размера, и функция, переданная spark_apply, затем берет каждый раздел и выводит 4 реплики входных данных (сцепленные сквозные ). Кроме того, предположим, что у исполнителей есть 1 ядро, а драйвер выполняет collect с результирующим фреймом данных искры. Я также собираюсь пока игнорировать накладные расходы system / JVM / R.

Исполнители

Каждый входной раздел составляет 4 байта * 1e9 / 10 = 0,4 ГБ. Размер каждого выходного раздела составляет 0,4 ГБ * 4 = 1,6 ГБ.

Одна мысль состоит в том, что мне понадобится как минимум 0,4 ГБ памяти для входного объекта искры, 0,4 ГБ для копии этого объекта в R, 1,6 ГБ для результата кадра данных R и 1,6 ГБ для того, чтобы этот объект был скопирован в результирующий фрейм данных искры (т.е. 4 ГБ). Однако, если ни вход, ни выход Spark не кэшируются, тогда, возможно, мне просто нужно 2 ГБ, если данные Spark передаются в R небольшими битами (то есть использование основной памяти - это только входные и выходные кадры данных R).

Я также предполагаю, что процесс R берет память из «пользовательского» блока памяти (см. здесь). Если это так, то в приведенном выше случае 4 ГБ память должна быть разделена 50:50, а в случае 0,8 ГБ следует выделить почти всю ее в пользовательский блок памяти.

Водитель

Что касается исполнителя, в зависимости от того, как обрабатывается фрейм данных искры, мне может потребоваться 16 ГБ (если результирующий фрейм данных искры не кэшируется и данные передаются в объект R) или 32 ГБ (если фрейм данных искры материализовались полностью перед копированием в объект R). С аналогичными соображениями относительно разделения между искровыми и пользовательскими блоками памяти.

Я также предполагаю, что процесс R берет память из «пользовательского» блока памяти. - Нет. Использование памяти гостевого языка не учитывается в динамической памяти JVM. Если вы используете менеджеры кластеров, которые отслеживают отслеживание памяти вне кучи (YARN, Kubernetess), вам необходимо настроить соответствующую опцию служебных данных. Что касается ваших расчетов, я бы сказал, что вы далеки от оптимизма. Кроме того, если драйвер выполняет сбор полученного кадра данных искры и, насколько я понимаю, данных уже больше, чем ввод, вы, вероятно, выбрали неправильный инструмент для работы.
zero323 11.04.2018 14:05

Что касается сбора за результат, я понимаю, что это глупо, но я просто делал что-то, чтобы учесть потребности водителя.

Richard Redding 11.04.2018 14:32

Также по поводу оптимизма. Конечно, хотя я пытаюсь конкретизировать требования, а не просто машу руками и говорю: «Еще немного памяти для других вещей, о которых я не знаю».

Richard Redding 11.04.2018 14:52
1
3
123
0

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