Flink или Spark для дополнительных данных

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

У меня есть куча сущностей A, хранящихся в хранилище данных (точнее, в Mongo, но на самом деле это не имеет значения). У меня есть Java-приложение, которое может загружать эти объекты и выполнять некоторую логику для них, чтобы сгенерировать поток некоторого типа данных E (чтобы быть на 100% ясным, у меня нет Es ни в одном наборе данных, Мне нужно сгенерировать их на Java после того, как я загружу As из БД)

Так что у меня есть что-то вроде этого

A1 -> Stream<E>
A2 -> Stream<E>
...
An -> Stream<E>

Тип данных E немного похож на длинную строку в Excel, он состоит из множества столбцов. Мне нужно собрать все Es и запустить сводную агрегацию, как вы делаете в Excel. Я вижу, как легко это сделать в Spark или Flink.

Теперь это часть, которую я не могу понять.

Представьте, что один из объектов A1 изменен (пользователем или процессом), это означает, что все Es для A1 нуждаются в обновлении. Конечно, я мог бы перезагрузить все свои As, пересчитать все Es, а затем заново запустить всю агрегацию. Мне интересно, можно ли здесь быть немного умнее.

Можно ли только пересчитать Es для A1 и выполнить минимальный объем обработки.

Можно ли для Spark сохранить RDD и обновлять только его часть при необходимости (здесь это будет Es для A1)?

Для Flink, в случае потоковой передачи, возможно ли обновить точки данных, которые уже были обработаны? Справится ли он с таким случаем? Или, возможно, я могу сгенерировать отрицательные события для старого Es пользователя A1 (т. е. удалить их из результата), а затем добавить новые?

Это обычный вариант использования? Это вообще то, для чего предназначены Flink или Spark? Я бы так подумал, но опять же, я не использовал ни того, ни другого, поэтому мое понимание очень ограничено.


person phoenix7360    schedule 07.08.2017    source источник


Ответы (1)


Я думаю, что ваш вопрос очень широк и зависит от многих условий. Во flink вы можете иметь MapState<A, E> и обновлять только значения для измененного A's, а затем, в зависимости от вашего варианта использования, либо генерировать обновленный E's ниже по течению, либо генерировать разницу (поток опровержения).

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

person Dawid Wysakowicz    schedule 07.08.2017
comment
Я оставил вопрос широким, пытаясь уловить суть проблемы. Вы говорите, что ответ зависит от многих условий. Какие аспекты вопроса вы хотели бы, чтобы я расширил? - person phoenix7360; 07.08.2017