发现当我们使用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
}
答案 0 :(得分:1)
如果您的任务可以在具有少量线程的单台计算机上轻松完成,那么如果执行托管状态对性能的影响太大,则flink
可能会过度。
也就是说,您不需要以这种方式直接使用ReducingState
,通常您会在Windowed运算符上使用aggregate
和reduce
函数(也就是说,&#39; s你的窗口在这里吗?)但是当你输出你的结果时,它还不清楚。你是不是在不断地散发聚集体?
您的源是否会生成多个密钥的数据?
您使用的是默认状态后端还是使用RocksDB?
此外,您可以查看使用Flink提供的便捷sum
功能,它可以指定要添加的字段。
答案 1 :(得分:1)
我使用您分享的代码进行了一些实验。我只是在笔记本电脑上运行它。我保留了所有statsd代码,但我没有运行statsd。相反,我将web.refresh-interval
配置为1秒,并在Flink Web控制面板中观察numRecordsOutPerSecond
。我改变的唯一一件事就是修改GeneratorSource
以便连续运行,这样我就能观察到稳态行为。
这就是我所看到的:
除了工作开始之外,我没有看到吞吐量出现任何剧烈波动。初始阶段约为30秒,在此期间吞吐量稳定地上升到一个值,然后保持相当一致(在初始启动阶段之后,它上下变化约10%,有或没有ReducingState
)。
将Flink版本从1.3.2更新为1.5.0后,整体吞吐量提高了近2倍。这并不奇怪,因为自1.3以来Flink的网络堆栈已经做了很多工作。
评论mergedRecordStore.add(r);
也可将吞吐量提高约2倍。
查看代码,我发现有一件事情会引起一些痛苦。您正在使用JSONObjects进行键控,序列化/反序列化和减少。这很贵。最好将JSON转换为POJO或Tuples,这样会更便宜。