Scala Flink消耗的内存超过预期
我使用Scala Flink消耗的内存超过预期,scala,hdfs,apache-flink,ram,rocksdb,Scala,Hdfs,Apache Flink,Ram,Rocksdb,我使用flink1.4.1来处理事务性事件,并使用hdf来存储检查点信息以实现容错 创建了一个作业来聚合有关客户、一周中的一天和一天中的一小时的信息,从而创建一个配置文件,如下面的代码所示 val stream = env.addSource(consumer) val result = stream .map(openTransaction => { val transactionDate = openTransaction.get("transactionDate")
flink1.4.1
来处理事务性事件,并使用hdf来存储检查点信息以实现容错
创建了一个作业来聚合有关客户、一周中的一天和一天中的一小时的信息,从而创建一个配置文件,如下面的代码所示
val stream = env.addSource(consumer)
val result = stream
.map(openTransaction => {
val transactionDate = openTransaction.get("transactionDate")
val date = if (transactionDate.isTextual)
LocalDateTime.parse(transactionDate.asText, DateTimeFormatter.ISO_DATE_TIME).toInstant(ZoneOffset.UTC).toEpochMilli
else
transactionDate.asLong
(openTransaction.get("clientId").asLong, openTransaction.get("amount").asDouble, new Timestamp(date))
})
.keyBy(0)
.window(SlidingEventWeekTimeWindows.of(Time.days(28), Time.hours(1)))
.sum(1)
在上面的代码中,流有三个字段:“transactionDate”、“clientId”和“amount”。我们通过clientId生成一个键控流,并使用一个滑动窗口对数量求和。我们的数据库中大约有10万个唯一的活动clientId
运行一段时间后,作业使用的总RAM稳定在36 GB,但HDFS中存储的检查点仅使用3 GB。有没有办法减少工作的RAM使用,也许通过配置弗林克的复制因子,或者使用ROCKSDB? < P>使用ROCKSDB绝对是你应该考虑的这个状态大小,并且取决于使用模式。通过仅复制新的或更新的SST,可以在增量执行时拥有更小的检查点 要知道的一些事情,请记住:
- 每个有状态运算符并行子任务都有自己的RocksDB 例如李>
- 如果您切换到RocksDB进行检查点设置,并且 开始以低于您需要的速度运行,请确保 您正在使用的序列化尽可能高效
- Flink根据您的备份文件系统提供了一些预定义的选项,请确保您选择了适当的选项
- 如果预定义的选项不适用于您,您可以覆盖RocksDB后端的选项工厂,并微调各个RocksDB选项
在Flink中,另一个需要注意的关于时间窗键控的内存使用的问题是,如果你进入数十万或数百万,那么“计时器”可能会占用大量内存。Flink计时器是基于堆的(在本文撰写时),并且独立于您的状态后端进行同步检查点 我们已经尝试使用RocksDb,但它并没有影响内存使用。我们期望它在state>memory时将状态存储在磁盘中,但它似乎只影响检查点存储
val env=StreamExecutionEnvironment.getExecutionEnvironment()
env.setStateBindend(新RocksDBStateBindend(filebackend,true))是否缺少配置?添加了可能与您相关的计时器说明。