[英]Huge amount of memory used by flink
从上周开始,我在Scala的Flink中构建了DataStream程序。 但是我有一个奇怪的行为,flink使用了比我预期更多的内存。
在由INT键控的processFunction中,我有一个4的ListState为tuple(Int,long),我用它在不同的时间范围内获得不同的唯一Counter,并且我希望该列表使用了最多的内存。
但事实并非如此。 因此,我打印了JVM的历史记录。 我很惊讶使用了多少个记忆。
num #instances #bytes class name
----------------------------------------------
1: 138920685 6668192880 java.util.HashMap$Node
2: 138893041 5555721640 org.apache.flink.streaming.api.operators.InternalTimer
3: 149680624 3592334976 java.lang.Integer
4: 48313229 3092046656 org.apache.flink.runtime.state.heap.CopyOnWriteStateTable$StateTableEntry
5: 14042723 2579684280 [Ljava.lang.Object;
6: 4492 2047983264 [Ljava.util.HashMap$Node;
7: 41686732 1333975424 com.myJob.flink.tupleState
8: 201 784339688 [Lorg.apache.flink.runtime.state.heap.CopyOnWriteStateTable$StateTableEntry;
9: 17230300 689212000 com.myJob.flink.uniqStruct
10: 14025040 561001600 java.util.ArrayList
11: 8615581 413547888 com.myJob.flink.Data$FingerprintCnt
12: 6142006 393088384 com.myJob.flink.ProcessCountStruct
13: 4307549 172301960 com.myJob.flink.uniqresult
14: 4307841 137850912 com.myJob.flink.Data$FingerprintUniq
15: 2153904 137849856 com.myJob.flink.Data$StreamData
16: 1984742 79389680 scala.collection.mutable.ListBuffer
17: 1909472 61103104 scala.collection.immutable.$colon$colon
18: 22200 21844392 [B
19: 282624 9043968 org.apache.flink.shaded.netty4.io.netty.buffer.PoolThreadCache$MemoryRegionCache$Entry
20: 59045 6552856 [C
21: 33194 2655520 java.nio.DirectByteBuffer
22: 32804 2361888 sun.misc.Cleaner
23: 35 2294600 [Lscala.concurrent.forkjoin.ForkJoinTask;
24: 640 2276352 [Lorg.apache.flink.shaded.netty4.io.netty.buffer.PoolThreadCache$MemoryRegionCache$Entry;
25: 32768 2097152 org.apache.flink.core.memory.HybridMemorySegment
26: 12291 2082448 java.lang.Class
27: 58591 1874912 java.lang.String
28: 8581 1372960 java.lang.reflect.Method
29: 32790 1311600 java.nio.DirectByteBuffer$Deallocator
30: 18537 889776 java.util.concurrent.ConcurrentHashMap$Node
31: 4239 508680 java.lang.reflect.Field
32: 8810 493360 java.nio.HeapByteBuffer
33: 7389 472896 java.util.HashMap
34: 5208 400336 [I
tupple(Int,long)在第七位是com.myJob.flink.tupleState。 而且我看到元组使用的内存少于2G。
我不明白为什么flink在这些类中使用了这么多的内存。
任何人都可以向我介绍这种行为,谢谢。
更新:
我在一个独立的群集上运行我的作业(1个jobManager,3个taskManager)
flink版本是1.5-SNAPSHOT commit:e4486ae
我将histo放在一个taskManager节点上。
更新2:
在我的processFunction中,我使用了:
ctx.timerService.registerProcessingTimeTimer(ctx.timestamp + 100)
在onTimer
函数之后,我处理listState
以检查所有旧数据。 因此,它为processFunction的每次调用创建了一个计时器。
但是为什么在触发onTimer
函数后计时器在内存中是固定的
您最终拥有多少个窗户? 基于最上面的两个条目,看到的是Flink用来跟踪何时清理窗口的“计时器”。 对于窗口中的每个键,您将在计时器状态下有效地得到(key,endTimestamp)。 如果您有很多窗口(可能时间混乱或加水印延迟)或每个窗口中有很多键,则每个键都会占用内存。
请注意,即使您使用的是RocksDB状态,TimerService也会使用堆内存,因此您必须注意这一点。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.