Разница между Apache Storm и Flink - PullRequest
0 голосов
/ 03 мая 2019

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

1 Ответ

0 голосов
/ 03 мая 2019

Разница главным образом в уровне абстракции, которую вы имеете при обработке потоков данных.

Apache Storm - немного более низкий уровень, имеющий дело с источниками данных (носиками) и процессорами (болтами), соединенными вместе, для выполнения преобразований и агрегации отдельных сообщений реактивным способом.

Существует Trident API , который немного абстрагируется от этого низкоуровневого представления, управляемого сообщениями, в более агрегированные конструкции, подобные запросам, что немного упрощает интеграцию. (Существует также SQL-подобный интерфейс для запроса потоков данных, но он все еще помечен как экспериментальный.)

Из документации:

TridentState wordCounts =
     topology.newStream("spout1", spout)
       .each(new Fields("sentence"), new Split(), new Fields("word"))
       .groupBy(new Fields("word"))
       .persistentAggregate(new MemoryMapState.Factory(), new Count(), new Fields("count"))                
       .parallelismHint(6);

Apache Flink имеет более функциональный интерфейс для обработки событий. Если вы привыкли к обработке потоков в стиле Java 8 (или к другим языкам функционального стиля, таким как Scala или Kotlin), это будет выглядеть очень знакомо. Он также имеет хороший веб-инструмент для мониторинга. Приятно то, что он имеет встроенные конструкции для агрегации по временным окнам и т. Д. (Что в Storm вы, вероятно, тоже можете сделать с Trident).

Из документации:

 DataStream<WordWithCount> windowCounts = text
            .flatMap(new FlatMapFunction<String, WordWithCount>() {
                @Override
                public void flatMap(String value, Collector<WordWithCount> out) {
                    for (String word : value.split("\\s")) {
                        out.collect(new WordWithCount(word, 1L));
                    }
                }
            })
            .keyBy("word")
            .timeWindow(Time.seconds(5), Time.seconds(1))
            .reduce(new ReduceFunction<WordWithCount>() {
                @Override
                public WordWithCount reduce(WordWithCount a, WordWithCount b) {
                    return new WordWithCount(a.word, a.count + b.count);
                }
            });

Когда я оценивал эти два, я пошел с Флинком просто потому, что в то время это было более хорошо задокументировано, и я начал работать с ним намного легче. Буря была немного более неясной. Существует курс по Udacity , который помог мне понять его гораздо лучше, но в конце Флинк все же чувствовал себя более подходящим для моих нужд.

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

...