Apache Storm和Flink之间的区别

时间:2019-05-03 07:04:14

标签: bigdata cluster-computing apache-flink apache-storm

我正在使用这两个实时数据流框架处理器。我到处搜索过,但是找不到这两个框架之间的巨大差异。我特别想知道它们如何根据数据大小或拓扑等来工作。

1 个答案:

答案 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,尽管它有点旧,所以从那以后两个项目一定都已经发展了。