自从过去几周以来,我在scala中使用Flink构建了一个DataStream程序。 但我有一个奇怪的行为,flink使用了比我预期更多的内存。
我的processFunction中有一个4元组的元组(Int,long),由INT键入,我用它在不同的时间帧中得到不同的唯一Counter,我期望这个List使用的大部分内存。
但事实并非如此。 所以我打印了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)是第7位的com.myJob.flink.tupleState。 我发现元组使用的内存不到2G。
我不明白为什么flink会为这些类使用这么多的内存。
任何人都可以提前了解这种行为。
更新
我在一个独立的群集(1个jobManager,3个taskManager)上运行我的工作
flink版本是1.5-SNAPSHOT提交:e4486ae
我在一个taskManager节点上运行了histo。
更新2:
在我使用的processFunction中:
ctx.timerService.registerProcessingTimeTimer(ctx.timestamp + 100)
在onTimer
函数之后,我处理我的listState
以检查所有旧数据。
所以它为processFunction上的每个调用创建一个计时器。
但是为什么在onTimer
函数触发
答案 0 :(得分:0)
你最后有多少个窗户?根据前两个条目,我们看到的是“定时器”,Flink用它来跟踪何时清理窗口。对于窗口中的每个键,您将在计时器状态下有效地结束(key,endTimestamp)。如果你有一个非常大量的窗口(可能是乱序时间或延迟水印)或每个窗口中有很多键,那么每个窗口都会占用内存。
请注意,即使您使用的是RocksDB状态,TimerService也会使用堆内存,因此您必须注意这一点。