Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/309.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 当flink运行超过12小时时,机器上CPU负载增加的原因_Java_Apache Flink_Complex Event Processing_Flink Cep - Fatal编程技术网

Java 当flink运行超过12小时时,机器上CPU负载增加的原因

Java 当flink运行超过12小时时,机器上CPU负载增加的原因,java,apache-flink,complex-event-processing,flink-cep,Java,Apache Flink,Complex Event Processing,Flink Cep,我有一个flink作业,并行度设置为6,一些简单的转换,问题是当flink运行超过12小时时,例如机器上的负载开始增加,然后我认为这是因为在一天的某些时间,flink的流量增加,但问题是当流量下降时,机器上的负载继续稍高,比以前低,但仍然更高 用例: DataStream<Event> from_source = rabbitConsumer .flatMap(new RabbitMQConsumer()) .assig

我有一个flink作业,并行度设置为6,一些简单的转换,问题是当flink运行超过12小时时,例如机器上的负载开始增加,然后我认为这是因为在一天的某些时间,flink的流量增加,但问题是当流量下降时,机器上的负载继续稍高,比以前低,但仍然更高

用例:

DataStream<Event> from_source = rabbitConsumer
                .flatMap(new RabbitMQConsumer())
                .assignTimestampsAndWatermarks(new PeriodicExtractor());
SingleOutputStreamOperator<Event> data_stream = from_source 
                    .filter(new NullidsFilterFunction())
KeyedStream<String, Event> keyed_stream = data_stream.keyby(k->k.id);

/*one stateful operator*/
data_stream.map(new EventCount(x))
            .keyBy(k -> new Date(k.timestamp.getTime()).toString())
            .window(TumblingEventTimeWindows.of(Time.ninutes(30)))
            .process(new MyProcessWindowFunction())
            .addSink(new SinkFuncion());

/*two stateful operator*/
keyed_stream.window(TumblingEventTimeWindows.of(Time.ninutes(10)))
            .process(new MyProcessWindowFunction())
            .addSink(new SinkFuncion());

/*three*/
keyed_stream.filter(new FilterFunction())
            .map(new AvailabilityCheckClass())
            .addSink(new SinkFuncion());

/*four*/
product_view_keyed_stream = data_stream
            .filter(new FilterFunction())
            .map(new EventProdView(x))
            .keyBy(k -> k.id+ new Date(k.timestamp.getTime()));
  product_view_keyed_stream.addSink(new SinkFuncion());

/*five stateful operator*/
product_view_keyed_stream.window(TumblingEventTimeWindows.of(Time.ninutes(30)))
          .process(new MyProcessWindowFunction())
          .addSink(new SinkFuncion());

/*Six stateful operator with 4 ConcurrentHashMap into the state*/
keyed_stream.flatmap(new FlatMapFunction())
            .addSink(new SinkFuncion());

/*seven stateful operator*/
keyed_stream.window(TumblingEventTimeWindows.of(Time.ninutes(10)))
            .process(new MyProcessWindowFunction())
            .addSink(new SinkFuncion());

/*eight stateful operator*/
data_stream.filter(new FilterFunction())
           .keyBy(k -> k.rType.equals("ClickIdent") ? k.avidat : k.email_sha2)
           .flatmap(new FlatMapFunction())
           .addSink(new SinkFuncion());
DataStream from_source=rabbitConsumer
.flatMap(新RabbitMQConsumer())
.分配时间戳和水印(新周期抽取器());
SingleOutputStreamOperator数据\u流=来自\u源
.filter(新的NullidsFilterFunction())
KeyedStream keyed_stream=数据流.keyby(k->k.id);
/*一个有状态算子*/
数据流映射(新事件计数(x))
.keyBy(k->newdate(k.timestamp.getTime()).toString())
.window(TumblingEventTimeWindows.of(Time.ninutes(30)))
.process(新的MyProcessWindowFunction())
.addSink(新的sinkFunction());
/*两状态算子*/
键控流窗口(TumblingEventTimeWindows.of(Time.ninutes(10)))
.process(新的MyProcessWindowFunction())
.addSink(新的sinkFunction());
/*三*/
键入的\u stream.filter(新的FilterFunction())
.map(新的AvailabilityCheckClass())
.addSink(新的sinkFunction());
/*四*/
产品\视图\键控\流=数据\流
.filter(新的FilterFunction())
.map(新的EventProdView(x))
.keyBy(k->k.id+新日期(k.timestamp.getTime());
product_view_keyed_stream.addSink(新的SinkFunction());
/*五状态算子*/
产品视图键控流窗口(TumblingEventTimeWindows.of(Time.ninutes(30)))
.process(新的MyProcessWindowFunction())
.addSink(新的sinkFunction());
/*带有4个ConcurrentHashMap的六状态运算符映射到状态*/
键控_stream.flatmap(新的flatmap函数())
.addSink(新的sinkFunction());
/*七状态算子*/
键控流窗口(TumblingEventTimeWindows.of(Time.ninutes(10)))
.process(新的MyProcessWindowFunction())
.addSink(新的sinkFunction());
/*八状态算子*/
data\u stream.filter(新的FilterFunction())
.keyBy(k->k.rType.equals(“ClickIdent”)?k.avidat:k.email_sha2)
.flatmap(新的FlatMapFunction())
.addSink(新的sinkFunction());
Mi问题:例如,当我的flink作业运行超过6小时时,CPU使用率高的原因是什么

洞察:堆内存看起来很好(没有OOM),检查点都已完成,没有丢失事件,JVM CPU消耗看起来也很好,CMS GC年轻一代计数器总是增加(这让我担心,尽管这应该是正常的,因为它是一个计数器,但增加得太快),此作业作为一个简单的java应用程序运行(本地执行不是作为一个安装了flink的集群,只是java-jar flink.jar不知道这是否有什么关系,只是共享信息)

一小时的例子


非常感谢!

由于您使用的是基于堆的状态后端(fsstatebend将其工作状态保留在JVM堆上),并且状态TTL配置为1(或3)天,因此预计状态大小将增长。增长的幅度取决于应用程序;这取决于密钥空间随时间的增长

你能把603MB的检查点大小放在一些上下文中吗?例如,每个不同的键有多少状态?听起来你很惊讶,但不清楚为什么

检查点变慢的原因有很多,但通常情况下,这表明在到达远程文件系统时存在背压或某种资源争用,即S3速率限制。如果您查看Flink WebUI中的检查点统计信息,您可以在那里寻找线索。查看检查点障碍是否检查点需要很长时间才能遍历执行图,或者检查点的异步部分需要很长时间才能将检查点写入远程磁盘。检查不对称性——一个实例是否比其他实例花费更长的时间并具有更多的状态

如果您在用户函数中执行任何阻塞i/o操作,这可能会导致问题。或者您可能存在严重的数据倾斜(例如,热键)。或者任务管理器和分布式文件系统之间的网络速度较慢。或者群集可能配置不足——您可能需要提高并行性


您可能需要增加检查点超时。如果在某个时间点检查点持续时间确实出现问题,您可以切换到使用RocksDB状态后端,以便能够使用增量检查点(但这是否有帮助取决于发生了什么)。或者您可以更改状态TTL配置以更快地清除状态。

垃圾收集器正在运行?内存泄漏?根据堆内存,我认为不是内存泄漏,事实上,现在它开始按应有的方式减少,但我担心我需要找到原因,不确定是否是GC,但您认为GC1如何?它正在运行目前正在使用CMS。当yiu发现问题时,我会附加visualvm。你在GC日志中看到FullGC吗?G1GC与CMS一样,旨在减少大堆垃圾收集过程中的延迟问题,但对于批处理作业不是必需的。FullGC是一种回退机制,用于CMS失败时使用flink's ke的任何映射、平面映射或过滤器y分区状态?如果是,使用哪个状态后端?密钥空间如何随时间增长?您是否使用状态TTL?非常感谢您的评论David,我将查看您在这里提到的所有内容,我认为这是一个非常好的开始观看的地方。非常感谢。最后一个问题,您建议从哪里开始应用你在这里经历了什么变化?向你致以亲切的问候。嗨,大卫,在我4小时22分开始工作后,我