Мой сценарий: конвейер данных:
файлы -> ETL (проприетарное приложение) -> База данных
данные хранятся в реляционной базе данных (postgres) после приема.
Все данные находятся в паре таблиц, которые обновляются новыми записями при поступлении нового файла. Таким образом, таблица увеличивается с точки зрения записей во времени. Мне нужно запустить алгоритм, который рассчитывает некоторые показатели по данным, которые хранятся в базе данных. Индикаторы затем сохраняются в базе данных. Я хотел бы использовать Spark, а не пользовательский модуль.
Алгоритм требует времени «движущегося» окна из n выборок.
То есть, если у нас есть окно из 2 выборок и 4 выборок (точек данных), вычисление будет таким:
d1, d2 -> result1
d2, d2 -> результат2
d3, d4 -> результат3
Мой вопрос:
- Как я могу запустить искровое выполнение, когда новые данные хранятся в базе данных?
Мой первый ответ был:
После завершения ETL вызовите Spark для базы данных (spark SQL). Поскольку мне нужно обрабатывать только приращение (не всю таблицу), мне нужно использовать последнюю метку времени (или индекс строки) данных, которые я обработал. Пример: в таблице 2 записи (точки данных)
1 д1 2019-06-30 08: 00
2 д2 2019-06-30 08: 30
ETL «запускает» Spark в 8:31, который, в свою очередь, запускает и вычисляет расчет (результат 1). Результат сохраняется вместе с отметкой времени последней точки данных.
В 10:00 ETL обновит базу данных 2 новыми записями:
3 д3 2019-06-30 09: 59
4 d4 2019-06-30 10: 00
Теперь Spark запрашивает базу данных, запрашивая данные d2, d3 и d4 (d2 необходим, потому что временные окна составляют 2 образца, см. Пример выше). Чтобы получить d2, я использую минимальную разницу временных меток от d3 или непосредственно это индекс строки. Затем искра вычисляет результат 2 (d2, d3) и результат 4 (d3, d4). Я не знаю, является ли это лучшим способом, возможно, я попытаюсь сделать эти данные потоком, а затем использовать StreamingContext.
Дополнительная информация:
файлы имеют до 5000 строк
период длится от 5 минут до суток. Это переменная.
Спасибо