flink使用大量内存

时间:2018-02-12 18:26:20

标签: scala apache-flink flink-streaming

自从过去几周以来,我在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函数触发

后计时器在内存上是钢铁的

1 个答案:

答案 0 :(得分:0)

你最后有多少个窗户?根据前两个条目,我们看到的是“定时器”,Flink用它来跟踪何时清理窗口。对于窗口中的每个键,您将在计时器状态下有效地结束(key,endTimestamp)。如果你有一个非常大量的窗口(可能是乱序时间或延迟水印)或每个窗口中有很多键,那么每个窗口都会占用内存。

请注意,即使您使用的是RocksDB状态,TimerService也会使用堆内存,因此您必须注意这一点。