Иногда вы получаете 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?