flink 任务物理内存溢出
报表信息:
Container [pid=12539,containerID=container_e166_1650382930878_534192_01_000014] is running 32768B beyond the ‘PHYSICAL’ memory limit. Current usage: 2.0 GB of 2 GB physical memory used; 4.1 GB of 4.2 GB virtual memory used. Killing container.
原因分析:
参考:https://developer.aliyun.com/article/780954
总结:
1、RocksDB Native 内存的不确定性,Flink 通过设置 RocksDB 的内存参数间接影响其内存使用。然而,目前 Flink 是通过估算得出这些参数,并不是非常精确的值。
2、glibc Thread Arena 问题【 64 MB 问题】
3、JDK8 Native 内存泄漏 , 建议升级jdk版本
不能完全解决,缓解方法
1、flink-conf.yaml添加参数:containerized.taskmanager.env.MALLOC_ARENA_MAX: 1
2、提高 Flink 的 JVM Overhead 分区容量【以下选一种即可】
- jobmanager.memory.jvm-overhead.fraction:0.2
- taskmanager.memory.jvm-overhead.fraction:0.2
- jobmanager.memory.jvm-overhead.max/min:1gb
- taskmanager.memory.jvm-overhead.max/min:1 gb
flink ETL中当前日期无法再次触发当前日期函数计算
问题描述:flink etl sql 中使用了当前时间/日期 - 表记录中的某个时间/日期字段,若某个id的记录在历史时间已经被计算过,但是在今天或者每天再取这个时间的差值,实际上这个差值是少了记录时间到当前时间的时间差,会导致数据不一致。
解决: 实际上,解决方法在问题描述中已经写出来了。新增记录计算时间,此时计算的日期差值没有问题,然后随着时间推移当前时间不断变化,然而flink etl 任务的当前时间还是历史的当前时间,不会再被触发计算【记录被修改除外】,此时需要使用**(当前时间 - 记录的计算时间) + 已计算好的日期差值 = 当前时间 - 记录日期的差值**
备注:后续会补充其他问题的解决方法