Apache flink Flink流媒体作业未按预期进行缩放 我们正在测试弗林克的缩放能力。但我们发现,无论是增加更多的插槽还是增加任务管理器的数量,扩展都不起作用。我们期望一个线性的,如果不接近线性缩放性能,但结果甚至显示退化。感谢您的评论

Apache flink Flink流媒体作业未按预期进行缩放 我们正在测试弗林克的缩放能力。但我们发现,无论是增加更多的插槽还是增加任务管理器的数量,扩展都不起作用。我们期望一个线性的,如果不接近线性缩放性能,但结果甚至显示退化。感谢您的评论,apache-flink,flink-streaming,Apache Flink,Flink Streaming,测试细节 -VMWare vsphere -只是一个简单的通过测试 - auto gen source 3mil records, each 1kb in size, parallelism=1 - source pass into next map operator, which just return the same record, and sent counter to statsD, parallelism is in cases = 2,4,6 3个TM,共6个插槽(2个/TM

测试细节

-VMWare vsphere

-只是一个简单的通过测试

- auto gen source 3mil records, each 1kb in size, parallelism=1

- source pass into next map operator, which just return the same record, and sent counter to statsD, parallelism is in cases = 2,4,6
  • 3个TM,共6个插槽(2个/TM),每个JM/TM有32个vCPU,100GB内存

  • 结果:

    • 2个插槽:26秒,3mil/26=115k TPS

    • 4个插槽:23秒,3mil/23=130k TPS

    • 6个插槽:22秒,3mil/22=136k TPS


如图所示,缩放几乎为零。有线索吗?谢谢。

请参考示例代码

    public class passthru extends RichMapFunction<String, String> {
        public void open(Configuration configuration) throws Exception {
        ... ... 
            stats = new NonBlockingStatsDClient();
        }
        public String map(String value) throws Exception { 
            ... ...
            stats.increment(); 
            return value;
        }
    }

    public class datagen extends RichSourceFunction<String> {
        ... ...
        public void run(SourceContext<String> ctx) throws Exception {
            int i = 0;
            while (run){
                String idx = String.format("%09d", i);
                ctx.collect("{\"<a 1kb json content with idx in certain json field>\"}");
                i++;
                if(i == loop) 
                    run = false;
            }
        }
        ... ...
    }
    public class Job {
        public static void main(String[] args) throws Exception {
        ... ...
            DataStream<String> stream = env.addSource(new datagen(loop)).rebalance();
            DataStream<String> convert = stream.map(new passthru(statsdUrl));
            env.execute("Flink");
        } 
    }
公共类passthru扩展了RichMapFunction{
公共void open(配置)引发异常{
... ... 
stats=new NonBlockingStatsDClient();
}
公共字符串映射(字符串值)引发异常{
... ...
stats.increment();
返回值;
}
}
公共类datagen扩展了RichSourceFunction{
... ...
公共无效运行(SourceContext ctx)引发异常{
int i=0;
while(运行){
String idx=String.format(“%09d”,i);
ctx.collect(“{\\}”);
i++;
if(i==循环)
运行=错误;
}
}
... ...
}
公开课工作{
公共静态void main(字符串[]args)引发异常{
... ...
DataStream stream=env.addSource(newdatagen(loop)).rebalance();
datastreamconvert=stream.map(新的passthru(statsdUrl));
环境执行(“Flink”);
} 
}
还原状态代码

    dataStream.flatMap(xxx).keyBy(new KeySelector<xxx, AggregationKey>() {
        public AggregationKey getKey(rec r) throws Exception {
            ... ...             
           }
        }).process(new Aggr());

    public class Aggr extends ProcessFunction<rec, rec> {
        private ReducingState<rec> store;
        public void open(Configuration parameters) throws Exception {
            store= getRuntimeContext().getReducingState(new ReducingStateDescriptor<>(
                "reduction store", new ReduceFunction<rec>() {
            ... ...
        }
    public void processElement(rec r, Context ctx, Collector<rec> out)
        throws Exception {
            ... ...
            store.add(r);
dataStream.flatMap(xxx).keyBy(新的KeySelector(){
public AggregationKey getKey(rec r)引发异常{
... ...             
}
}).process(新的Aggr());
公共类Aggr扩展了ProcessFunction{
私家小店;
公共void open(配置参数)引发异常{
store=getRuntimeContext().GetReductionState(新的ReductionStateDescriptor(
“还原存储”,新的ReduceFunction(){
... ...
}
公共void processElement(rec r、Context ctx、Collector out)
抛出异常{
... ...
存储。添加(r);

您确实应该使用。如果您关心使源的不同实例的记录不同,您可以从获取每个实例的索引,该索引可通过RichFunction接口中的getRuntimeContext()方法获得

此外,Flink有一个内置的工具,您应该使用它,而不是自己滚动。此外,numRecordsIn、numRecordsOut、numRecordsInPerSecond和numRecordsOutPerSecond都是,因此无需自己创建此工具。您也可以通过Flink的web界面或REST API访问这些指标

至于为什么Kafka consumer的可伸缩性较差,有很多因素可能会导致这种情况。如果您使用的是事件时间处理,那么空闲分区可能会造成问题(请参阅)。如果流已设置密钥,则数据倾斜可能是一个问题。如果连接到外部数据库或服务,则很容易成为瓶颈。如果检查点配置错误,则可能导致此问题。或者网络容量不足


我将通过查看Flink web UI中的一些关键指标来开始调试。负载在子任务之间是否平衡良好,或者是否有偏差?您可以打开延迟跟踪,查看其中一个kafka分区是否出现问题(通过检查接收器处的延迟,这将按每个分区进行报告)。你可以寻找背压。

你能分享代码吗?在不知道具体做了什么的情况下,很难对性能问题发表评论。但是将源代码的并行度限制为1会限制可扩展性。更改为RichParallelSourceFunction后,示例程序现在运行得更好。但我们仍然需要建议b因为FlinkKafkaConsumer011仍然无法扩展已经使用RichParallelSourceFunction的功能。有什么提示吗?我们总是设置kafka partition=total TM#slot。但是结果仍然是有上限的,不能线性改善。感谢提示!为了将kafka从根本原因中分离出来,使用了数据生成器源,但扩展仍然不起作用。2 slots可以扩展到4个插槽,4个插槽到8个插槽也可以,但16个插槽、32个插槽等都限制在30k TPS左右。4个TM(32个vCPU、30 GB内存),16个插槽/TM。源代码均匀地生成到插槽。没有外部服务,还没有检查点。经过调查,还原状态是原因,没有它,缩放效果会更好。有什么想法吗?谢谢。(请参考上面的相关代码,当此行存在时,缩放会受到影响:“store.add(r);”)我想这可能与我们使用的hdfs StateBend有关,当太多的记录存储到状态中时。即使我们有足够的内存,并且检查点被禁用,您认为rocksdb会有帮助吗?有几个问题:您是否有一个无限的键空间,以及可能由于新键的出现而不断增加的状态量?您是否使用timers,可能有很多定时器(例如,到期状态)?