flink ReducingState影响效果

时间:2018-05-29 15:14:17

标签: apache-flink flink-streaming

发现当我们使用ReducingState RecordStore.add(r)时,性能如图所示波动,

没有ReducingState: stable performance graph

使用ReducingState: fluctuated performance graph

整体表现(跌幅超过100%!): without Reducingstate.add VS with ReducingState.add

可以使用简单的应用程序轻松地重现,没有检查点,只需简单地保存记录,也可以使用简单的“sum”减少功能(事实上,空函数会看到相同的结果)。任何想法将不胜感激。这是一个令人难以置信的明显问题。

基本上应用程序只是将记录保存到状态,我们测量“JsonTranslator”中每秒的记录数,如图所示。两者之间的差异只有1行,评论/取消评论“recStore.add(r)”。

了解状态会影响性能,但这是否有效?

DataStream<String> stream = env.addSource(new GeneratorSource(loop);
DataStream<JSONObject> convert = stream.map(new JsonTranslator(statsdUrl))
                                       .keyBy(new KeySelector<JSONObject, AggregationKey>() {... ...})
                                       .process(new ProcessAggregation(aggrDuration, statsdUrl))
                                       .map(new PassthruFunction(statsdUrl));  


public class ProcessAggregation extends ProcessFunction<JSONObject, JSONObject> {
    private ReducingState<JSONObject> recStore;

    public void processElement(JSONObject r, Context ctx, Collector<JSONObject> out) {
        recStore.add(r); //this line make the difference
}

2 个答案:

答案 0 :(得分:1)

如果您的任务可以在具有少量线程的单台计算机上轻松完成,那么如果执行托管状态对性能的影响太大,则flink可能会过度。

也就是说,您不需要以这种方式直接使用ReducingState,通常您会在Windowed运算符上使用aggregatereduce函数(也就是说,&#39; s你的窗口在这里吗?)但是当你输出你的结果时,它还不清楚。你是不是在不断地散发聚集体?

您的源是否会生成多个密钥的数据?

您使用的是默认状态后端还是使用RocksDB?

此外,您可以查看使用Flink提供的便捷sum功能,它可以指定要添加的字段。

答案 1 :(得分:1)

我使用您分享的代码进行了一些实验。我只是在笔记本电脑上运行它。我保留了所有statsd代码,但我没有运行statsd。相反,我将web.refresh-interval配置为1秒,并在Flink Web控制面板中观察numRecordsOutPerSecond。我改变的唯一一件事就是修改GeneratorSource以便连续运行,这样我就能观察到稳态行为。

这就是我所看到的:

  1. 除了工作开始之外,我没有看到吞吐量出现任何剧烈波动。初始阶段约为30秒,在此期间吞吐量稳定地上升到一个值,然后保持相当一致(在初始启动阶段之后,它上下变化约10%,有或没有ReducingState )。

  2. 将Flink版本从1.3.2更新为1.5.0后,整体吞吐量提高了近2倍。这并不奇怪,因为自1.3以来Flink的网络堆栈已经做了很多工作。

  3. 评论mergedRecordStore.add(r);也可将吞吐量提高约2倍。

  4. 查看代码,我发现有一件事情会引起一些痛苦。您正在使用JSONObjects进行键控,序列化/反序列化和减少。这很贵。最好将JSON转换为POJO或Tuples,这样会更便宜。