2017-02-03 1 views
1

Я пытаюсь синхронизировать свою базу данных Spark на S3 со старой базой данных Oracle через ежедневную работу ETL Spark. Я пытаюсь понять, что именно делает Spark, когда он подключается к RDS, например Oracle, для получения данных.Как Spark имеет дело с данными JDBC относительно времени?

Использует ли он только данные, которые во время запроса Spark к БД (т. Е. Если он извлекает данные из БД Oracle в 2/2 17:00:00, он будет только захватывать данные UP до этого момента в время)? По существу, что любые новые данные или обновления в 2/2 17:00:01 не будут получены из выборки данных?

+0

Вы можете объяснить вопрос кодом? – mrsrinivas

ответ

1

Ну, это зависит. В общем, вы должны предположить, что это поведение является недетерминированным, если это явно не предусмотрено вашим приложением и дизайном базы данных.

По умолчанию Spark будет извлекать данные каждый раз, когда вы выполняете действие в соответствующем наборе данных Spark. Это означает, что каждое исполнение может видеть различное состояние вашей базы данных.

Такое поведение может зависеть от нескольких факторов:

  • Явное кэширование и возможные выселений кэш.
  • Неявное кэширование с файлами в случайном порядке.
  • Точный набор параметров, которые вы используете с источником данных JDBC.

В первых двух случаях Spark может повторно использовать уже извлеченные данные, не возвращаясь к исходному источнику данных. Третий интереснее. По умолчанию Spark извлекает данные с использованием одной транзакции, но есть методы, которые позволяют выполнять параллельное чтение на основе диапазонов столбцов или предикатов. Если один из них используется, Spark будет извлекать данные с использованием нескольких транзакций, и каждый может наблюдать за другим состоянием вашей базы данных.

Если требуется целостное время семантики у вас есть в основном два варианта:

  • Используйте неизменные, дописать в конце и датируемые записи в базе данных и выдача временных меток зависимых запросах от Спарка.
  • Выполнение согласованных дампов базы данных и использование их в качестве прямого ввода ваших заданий Spark.

В то время как первый подход гораздо более мощный, его гораздо сложнее реализовать, если вы работаете с существующей архитектурой.

Смежные вопросы