我正在对我的Flink应用程序进行性能基准测试,该应用程序从Kafka读取数据,转换数据并将其转储到另一个Kafka主题中。我需要保留上下文,以便具有相同order-id的消息不会被视为全新的订单。我正在使用ValueState扩展RichFlatMapFunction类来实现这一点。据我所知,在调用flatMap之前,我需要使用KeyStream:
env.addSource(source()).keyBy(Order::getId).flatMap(new OrderMapper()).addSink(sink());
问题是keyBy占用了我很长的时间(80到200毫秒)。我说keyBy占用时间是因为如果我删除keyBy并用一个map函数替换flatMap,90%的延迟大约是1毫秒。有没有办法在不使用keyBy的情况下使用状态/上下文,或者以某种方式使keyBy更快?
1条答案
按热度按时间4si2a6ki1#
keyBy
的开销很大,因为它需要网络重排--每个记录都被序列化,发送到负责该键的下游示例,然后再反序列化。对于您所描述的流水线,这是不可避免的,但是您对序列化器的选择会产生很大的不同。
有关如何减少延迟的详细信息,请参阅Flink最佳配置以实现最小延迟。
至于键的选择,如果需要按orderId进行重复数据删除,则必须按orderId进行键控。