FlinkJob-docker OOM
在windows 系统中使用docker 搭建的flinkjob时,尽管我们已经使用了轻量化的docker来模拟,但是对于16G 内存的电脑来说依旧吃紧,更何况,近期内存硬盘疯涨(作者一个朋友3年前2000买的裸金属服务器,现在因为内存和硬盘涨价,单算硬盘和内存,黄鱼价格来到4000。。。。。)
内存不够引起的问题主要有两种,一种并不算内存不足,算是分配给容器的内存不足:
分配给容器的内存不足
鉴别方式:最显著的特征是taskmanager任务中止但是容器仍然在运行。报错提示jvm heap 溢出之类。flink里能看到被杀掉的taskmanager留下的错误日志。
问题原因:每个taskmanager默认只分配1G内存。
解决方法:
使用更大的并行度(注意!不是docker运行更多的taskmanager),原理是将任务的内存压力分摊开来。放置数据堆积在少数几个slot里面。
增大docker 配置文件中给每个 taskmanager 和 slot 分配的内存大小。
机器内存不足
鉴别方式:taskmanager容器被杀掉或者重启(如果配置了重启)。flink中只见fail报错,不见日志(日志随着taskmanager报错丢失,或者还没来得及报错,直接被windows杀掉,master发现taskmanager消失才报错)。
解决方法:
用微软电脑管家不停得手动清内存。
提高内存交换优先级。
硬盘空间充足且时间充足的话可以装linux双系统,linux系统进程几乎不占内存。哪怕占!swapness优先级往高了调而已。通常设置10,鄙人博客所在服务器曾设置为100,相较于关闭swap,内存占用减少了大约70%。
此时mysql读写时间尺度以秒为单位关闭一些taskmanager,一个taskmanager跑n个slot,该taskmanager共分配大约n GB内存。通过减少docker容器的待机内存损耗来节省内存
云容器服务,爆金币吧。这个算便宜的了,按量付费。
改flinkjob的算法,可通过控制水位线,窗口大小和步长等方式优化空间复杂度。