Ошибка контрольной суммы Databricks при записи в файл

Я работаю в 9 узлах.

Все они собираются записывать некоторую информацию в файлы, выполняя простые операции записи, как показано ниже:

dfLogging.coalesce(1).write.format('delta').mode('append').save('/dbfs/' + loggingLocation)

Однако я получаю это исключение:

py4j.protocol.Py4JJavaError: ошибка при вызове o106.save. : java.util.concurrent.ExecutionException: org.apache.spark.SparkException: задание прервано из-за сбоя этапа: задача 1 на этапе 14.0 не удалась 1 раз, последний сбой: потерянная задача 1.0 на этапе 14.0 (TID 259, localhost, исполнитель драйвер): org.apache.hadoop.fs.ChecksumException: ошибка контрольной суммы: файл: /dbfs/delta/Logging/_delta_log/00000000000000000063.json на 0 exp: 1179219224 получил: -1020415797

Мне кажется, что из-за параллелизма искра почему-то дает сбой и генерирует ошибки контрольной суммы.

Есть ли какой-нибудь известный сценарий, который может его вызвать?


person Flavio Pegas    schedule 12.07.2019    source источник
comment
Работает ли без коалесценции? С coalesce очень легко вызвать проблемы с памятью, и ошибки часто не очень полезны.   -  person Bob Swain    schedule 12.07.2019
comment
Попробуйте переразбить вместо слияния. dfLogging.repartition(1).write.format('delta').mode('append').save('/dbfs/' + loggingLocation)   -  person Rob    schedule 14.07.2019
comment
Боб Суэйн. Та же ошибка, даже без объединения. @Rob Это действительно сработало, но я не понял почему. Не могли бы вы опубликовать это как ответ с более подробной информацией?   -  person Flavio Pegas    schedule 15.07.2019
comment
@FlavioDiasPs опубликовал ответ и надеюсь, что это вам поможет.   -  person Rob    schedule 15.07.2019


Ответы (1)


Итак, происходит несколько вещей, и это должно объяснить, почему coalesce может не работать.

  1. Что делает coalesce, так это объединение разделов по каждому исполнителю. Например, если у вас есть три воркера, вы можете выполнить coalesce (3), который объединит разделы для каждого воркера.

  2. Переразбиение перетасовывает данные для увеличения / уменьшения общего количества разделов. В вашем случае, если у вас более одного рабочего, и если вам нужен один вывод, вам придется использовать repartition (1), поскольку вы хотите, чтобы данные находились на одном разделе перед его записью.

Почему coalesce не работает? Искра ограничивает перемешивание во время слияния. Таким образом, вы не можете выполнить полное перемешивание (для разных воркеров), когда используете coalesce, тогда как вы можете выполнить полное перемешивание, когда используете перераспределение, хотя это дорогостоящая операция.

Вот код, который будет работать:

dfLogging.repartition(1).write.format('delta').mode('append').save('/dbfs/' + loggingLocation)
person Rob    schedule 15.07.2019