我正在使用这两个实时数据流框架处理器。我到处搜索过,但是找不到这两个框架之间的巨大差异。我特别想知道它们如何根据数据大小或拓扑等来工作。
答案 0 :(得分:0)
区别主要在于处理数据流的抽象级别。
Apache Storm更底层,它处理连接在一起的数据源(Spout)和处理器(Bolt),以响应方式对单个消息执行转换和聚合。
有一个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),这将看起来非常熟悉。它还具有一个不错的基于Web的监视工具。 它的好处是它具有用于按时间窗等进行聚合的内置结构。(在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);
}
});
当我评估两者时,我选择了Flink,只是因为当时感觉它的文档更加详尽,而且我也更容易上手。风暴略显模糊。有course on Udacity可以帮助我更深入地了解它,但最终Flink仍然觉得更适合我的需求。
您可能还想看看这个answer here,尽管它有点旧,所以从那以后两个项目一定都已经发展了。