Как Spark обеспечивает согласованность данных в случае сбоя узла / раздела?

#sql #sql-server #apache-spark

#sql #sql-сервер #apache-spark

Вопрос:

У нас есть задание ETL, запущенное на spark, которое считывает данные с SQL Server. Затем в фрейме данных выполняются некоторые преобразования путем применения mappartition и создается новый фрейм данных с другой схемой. Выполняются некоторые дальнейшие преобразования, и, наконец, результирующий фрейм данных должен быть записан обратно в SQL Server.

Мой вопрос: предположим, что при вставке данных в SQL Server, скажем, в 8 разделах, один из узлов spark выходит из строя, как spark обеспечит целостность данных? Другие разделы вставили бы данные в базу данных, и в момент сбоя данные в базе данных несовместимы.

Будет ли spark только заново создавать сбойный раздел, применяя все преобразования?

В случае повторного сбоя, каково будет состояние данных других разделов в базе данных?

Комментарии:

1. Я считаю, что Spark не совместим с ACID, если только вы не используете Delta Lake в Azure, поэтому он не будет обеспечивать согласованность по дизайну. С этим остается разобраться разработчику.

Ответ №1:

Краткий ответ.

  • Если вы не установили флажок,

    • затем, поскольку вы не читаете из источника, который может отслеживать первоначально использованные файлы — в случае повторного вычисления из источника — например, таблицы Hive,
      • произойдет повторное вычисление, и результаты могут отличаться при последующем восстановлении после сбоя узла — если только этот источник не является статическим.
  • С помощью .cache и / или контрольной точки, которые все еще можно прочитать где-то еще,

    • насколько я понимаю, вы получите тот же результат.

Сложно протестировать имхо.

Дополнительные баллы

Кэширование ПОСЛЕ ВСЕХ примененных преобразований не является стандартной процедурой. Это дорого. Более того, из-за проблем с памятью и даже хранилищем Spark может удалить раздел и вернуться к исходному коду, поэтому данные могут отличаться от предыдущего вызова обработки. И, если вы сохраняете и эти узлы выходят из строя до записи, вы потеряли кеш. Та же ситуация.

Комментарии:

1. Да, я кэширую данные после применения всех преобразований. Также, пожалуйста, ответьте на этот вопрос, если, скажем, я записываю фрейм данных на sql server в 8 разделах, и 1 раздел завершается сбоем, в то время как другие завершаются успешно, как будет поддерживаться согласованность данных в базе данных?

2. добавлены некоторые аспекты. Нужно видеть общую картину.