繁体   English   中英

flink使用的大量内存

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM