Журналы устранения неисправностей в некоторых общих зажиганиях.
1. OOM, вызванный размером буфера на стороне уменьшения в случайном порядке.
Во время процесса перемешивания, когда сторона сокращения извлекает данные со стороны карты, каждая задача будет иметь свой собственный буфер для хранения данных, извлекаемых каждый раз.Буфер по умолчанию составляет 48 МБ.
Если объем данных, сгенерированных на стороне карты, очень велик, а данные, записанные на стороне карты, очень быстрые, то буферы всех задач на стороне сокращения могут быть полностью загружены, и буферы каждой задачи будут заполнены. , что приведет к тому, что объем данных, прочитанных задачей в процессе расчета, очень велик, но память, выделенная каждым исполнителем в текущем процессе JVM, мертва (коэффициент 0,2).В это время объекты, сгенерированные большим число вычислений задачи, вероятно, приведет к разрыву памяти, причина OOM.
В это время мы можем уменьшить размер буферной памяти на стороне уменьшения, чтобы позволить задаче извлекать в несколько раз больше, что потребляет больше производительности передачи по сети, но может гарантировать, что памяти на стороне уменьшения достаточно.
2. Сборщик мусора JVM приводит к сбою извлечения файла в случайном порядке.
Ситуация, которая иногда возникает в заданиях Spark: файл в случайном порядке не найден, встречается довольно часто. И иногда, после того, как это произойдет, этап и задача будут отправлены повторно. Выполните его снова и найдите его. Нет такой ошибки.
Это связано с тем, что на первом этапе перетасовки, когда потребление памяти слишком велико, частый gc, gc при каждом срабатывании триггера, весь процесс JVM перестанет работать. И в это время этап исполнителя для получения необходимых данных, и на этот раз он не будет тянуть, на этот раз будет пытаться подождать некоторое время, снова тянуть, иногда сразу после времени ожидания до окончания этапа gc на этот раз сможет вытащить данные.
В этом случае эти два параметра могут быть отрегулированы:
1,spark.shuffle.io.maxRetries
Количество повторных попыток после сбоя при случайном извлечении, по умолчанию — 3 раза;
2,spark.shuffle.io.retryWait
Интервал времени между каждой попыткой вытащить файл, по умолчанию 5 с;
3. Недостаточное количество ресурсов кластера Yarn приводит к непосредственному сбою приложения.
Задание Spark могло уже выполняться в кластере Yarn. В это время вы отправляете другое задание Spark. Ресурсы, установленные двумя заданиями Spark, равны или немного меньше, чем ресурсы всего кластера. легко привести к сбою второго задания spark. , потому что ресурсы, потребляемые заданием spark после запуска, вероятно, будут больше, чем ресурсы, выделенные нами в сценарии оболочки.
Чтобы этого не произошло, есть несколько вариантов:
1. Сделать ограничения в J2EE, и только одно задание Spark может быть отправлено в кластер Yarn для выполнения, чтобы гарантировать, что ресурсов одного задания Spark достаточно;
2. Выполняйте задания Spark в очереди, чтобы обеспечить максимальное использование ресурсов, выделенных для каждого задания Spark, и убедиться, что каждое задание Spark выполняется в кратчайшие сроки;
4. Ошибки, вызванные проблемами сериализации
При отправке задания Spark в клиентском режиме в локально распечатываемом журнале появляется ошибка, аналогичная Serializable. Этот тип ошибки является ошибкой, вызванной классом, который не реализует интерфейс сериализации.
Есть два общих места, которые необходимо сериализовать:
1, к внешней функции оператора агрегированного использования пользовательских переменных типа;
2. Если вы хотите использовать пользовательский тип в качестве типа элемента RDD, этот тип также должен реализовывать интерфейс сериализации;
5. Слишком большой трафик сетевой карты в режиме Yarn-client
В производственной среде, если вы используете режим Yarn-клиент для запуска заданий Spark, поскольку процесс драйвера выполняется на локальном устройстве, большой объем передаваемых данных приведет к тому, что трафик сетевой карты локального устройства будет очень большим.
Таким образом, производственная среда должна использовать режим Yarn-cluster.
6. Переполнение памяти JVM в режиме Yarn-кластера
Иногда при выполнении некоторых заданий Spark, включая Spark sql, вы можете столкнуться с проблемой нормальной работы в режиме Yarn-client, но в режиме Yarn-cluster будет сообщаться о проблеме переполнения памяти PermGen JVM (постоянная генерация).
Поскольку в режиме клиента Yarn драйвер запускается на локальном устройстве, конфигурация PermGen JVM, используемая Spark, представляет собой локальный файл класса spark, а постоянный размер полосы JVM составляет 128 МБ. Но в режиме Yarn-кластера drvier работает на узле кластера Yarn, а размер по умолчанию — 82M.
Spark sql имеет много сложного семантического разбора SQL, преобразования синтаксических чисел и т. д., которые очень сложны. В этом случае, если sql написан плохо, это приведет к потреблению памяти, а занятость постоянной генерации будет относительно велика, что легко превысить значение по умолчанию, установленное на кластере Yarn.
решение:
В скрипте spark-submit добавьте следующую конфигурацию:
--conf spark.driver.extraJavaOptions="-XX:PermSize=128M -XX:MaxPermSize=256M"
Это устанавливает размер постоянного поколения драйвера, по умолчанию 128M, а максимум 256M. Таким образом, вы можете в основном гарантировать, что ваше задание Spark не будет иметь проблемы с переполнением памяти постоянного поколения, вызванным вышеуказанным режимом пряжи-кластера.