Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala Flink消耗的内存超过预期_Scala_Hdfs_Apache Flink_Ram_Rocksdb - Fatal编程技术网

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))是否缺少配置?添加了可能与您相关的计时器说明。