Объяснение и устранение ошибок Spark OOM - PullRequest
0 голосов
/ 05 августа 2020

Иногда вы получаете OutOfMemoryError не потому, что ваши RDD не помещаются в памяти, а потому, что рабочий набор одной из ваших задач, такой как одна из задач сокращения в groupByKey, был слишком большим. Операции перемешивания Spark (sortByKey, groupByKey, reduceByKey, join, et c) создают таблицу ha sh внутри каждой задачи для выполнения группировки, которая часто может быть большой. Самым простым решением здесь является повышение уровня параллелизма, чтобы входной набор каждой задачи был меньше.

Я так думаю, поправьте меня, если я ошибаюсь.

Предположим, что есть 2 узла данных для обработки набора данных, и оба этих узла вместе имеют память 32 ГБ (16 ГБ на узел данных). Размер набора данных составляет 100 ГБ, и предположим, что эти данные при чтении искрой разбиваются на 10 разделов по 10 ГБ каждый. Очевидно, что файл размером 100 ГБ не может поместиться в 32 ГБ ОЗУ за раз. поэтому разделы должны загружаться в память и обрабатываться итеративно. поэтому я предполагаю, как показано ниже.

первая итерация, 2 раздела по 10 ГБ каждый загружаются в память на каждом узле данных. во второй итерации в память каждого узла данных загружаются 2 раздела по 10 ГБ каждый. .... .... Пятая итерация, 2 раздела по 10 ГБ загружаются в память на каждом узле данных.

Если так обрабатывается искра, во время каждой итерации только 2 раздела загружаются в объем памяти. Означает ли это, что другие разделы, которые не могли быть размещены в памяти, были прочитаны, но перенесены на диск, и они ожидают освобождения памяти? или эти разделы вообще не читаются, и они будут прочитаны только тогда, когда ресурсы будут доступны. что верно?

Во время обработки, если есть необходимость группировать / уменьшить / присоединиться, то он требует перемешивания. поэтому, если один из разделов перемешивания больше, чем размер ОЗУ, задание завершится ошибкой OOM. Например, было обработано и перемешано 10 разделов. Теперь в случайных разделах всего 4 раздела по 25 ГБ каждый. (По умолчанию количество разделов перемешивания составляет 200, но только 4 раздела имеют все оставшиеся данные пустыми.) Так как размер раздела перемешивания превышает 16 МБ ОЗУ, произойдет ли сбой искрового задания? Я правильно понимаю?

Я понимаю, что вам не нужно, чтобы ваши данные помещались в памяти. Spark обрабатывает данные по разделам. Но у меня вопрос, а что если сам раздел не умещается в памяти. Будет ли он по-прежнему перенаправлять данные на диск и начинать обработку, или он выйдет из строя с ошибкой OOM?

Второй вопрос, который у меня есть: если другое искровое задание (Job2) запускается во время вышеуказанного искрового задания (job1), в процессе выполнения, и предположим, что у него также есть файл размером 100 ГБ для обработки с 10 разделами по 10 ГБ каждый. поэтому, когда задание1 Итерация1 выполняется, в памяти доступно только 6 МБ свободного места. Раздел задания2 размером 10 ГБ не может быть загружен в память для обработки задания2. так будет ли Job2 ждать освобождения памяти? или это задание также завершится с ошибкой OOM?

1 Ответ

1 голос
/ 05 августа 2020

Объяснение (полужирное) верное.

В ваших комментариях:

  • Если вы явно не перераспределите разделы, ваши разделы будут связаны с размером блока HDFS, размером 128 МБ и столько же, которые составляют этот файл.

  • Тогда у вас есть количество исполнителей, скажем 2, на рабочий / узел данных. Тогда одновременно будут активны не более 4 задач / разделов.

    • Какой будет точка загрузки всех разделов в память, если вы можете обслуживать не более 4? Вы будете засорять систему в ущерб другим приложениям Spark. Тогда все это похоже на обычную ОС.

Конечно, это немного сложнее, например, если у вас 10 узлов данных и выделено только 2 исполнителя, есть трафик c перемещать вещи. Просто чтобы все было просто.

Ошибки OOM возникают только в том случае, если раздел превышает максимальный размер раздела. Для остального места на диске необходимо для разлива.

...