You are viewing a plain text version of this content. The canonical link for it is here.
Posted to user-zh@flink.apache.org by Liu Join <lz...@outlook.com> on 2022/01/20 05:28:04 UTC

flink任务提交到集群执行一段时间报错Java heap space

环境:
flink1.13.5,Standalone模式集群,jobmanager内存2GB,taskmanager内存4GB,集群包括一个jobmanager和两个taskmanager,每个taskmanager有2个slot。

任务内容是读取2万张表的数据,数据每1分钟一条,每10分钟输出每张表的最后一条数据。代码中使用了map、filter、watermark、开了一个10分钟的滑动窗口,使用reduce获得最后一条数据,因为sink是mysql,配置不高,所以将最后一条数据拼成批量插入语句才往MySQL写入。开了一个5s的窗口用于拼接sql语句。

报错内容:
java.lang.OutOfMemoryError: Java heap space

报错表象:
整个taskmanager内存被占满,任务失败重启后taskmanager内存仍然是满的,导致任务再次失败。之后任务直接挂了。时间长了之后内存没释放,Taskmanager进程也会挂了。
从 Windows 版邮件<https://go.microsoft.com/fwlink/?LinkId=550986>发送


Re: flink任务提交到集群执行一段时间报错Java heap space

Posted by Caizhi Weng <ts...@gmail.com>.
Hi!

你的 state backend 是 heap state backend 吗?如果是的话,Flink
流作业运行过程中的状态会存储在堆中,checkpoint 也会存储在堆中,确实有可能导致 OOM。可以尝试换成其他 state backend 看一下。

Liu Join <lz...@outlook.com> 于2022年1月21日周五 13:20写道:

>
> 我已经将5s的时间窗口替换为100条的countWindowAll,具体实现为使用aggregate函数将窗口内的数据拼接为一条sql语句,sql语句如下:replace
> into table (a1,a2,a3,a4,..) values(…)
> 但还是没有解决,
> heap dump暂时无法提供,
> taskmanager内存分配如下:
> task heap:2.76G,network:343MB,JVMMetaspace:256MB
>
>
> 我一共运行了两个任务,都会出现这种问题,但之前写过一个简单的数据同步的程序没有出错,就是将一个MySQL库中的500张表同步到另一个MySQL库,不知道对于这种问题有没有解决的方向。
>
> 之前在监控任务运行时发现是MySQLsource先失败,然后导致整个任务挂了,在开启checkpoint时,MySQLsource和开窗之前的部分为一个parallelism,这个parallelism的checkpoint大小一直是136MB,从任务开始到结束都是136MB,其他运算的checkpoint不到1MB,是否有这部分原因
> 从 Windows 版邮件<https://go.microsoft.com/fwlink/?LinkId=550986>发送
>
> 发件人: Caizhi Weng<ma...@gmail.com>
> 发送时间: 2022年1月21日 10:52
> 收件人: flink中文邮件组<ma...@flink.apache.org>
> 主题: Re: flink任务提交到集群执行一段时间报错Java heap space
>
> Hi!
>
> 5s 的窗口拼接 sql 语句看起来比较可疑,具体是怎么实现的?另外可以把 task manager 的 heap dump
> 出来看一下哪里占比较多的堆内存。
>
> Liu Join <lz...@outlook.com> 于2022年1月20日周四 13:28写道:
>
> > 环境:
> >
> >
> flink1.13.5,Standalone模式集群,jobmanager内存2GB,taskmanager内存4GB,集群包括一个jobmanager和两个taskmanager,每个taskmanager有2个slot。
> >
> >
> >
> 任务内容是读取2万张表的数据,数据每1分钟一条,每10分钟输出每张表的最后一条数据。代码中使用了map、filter、watermark、开了一个10分钟的滑动窗口,使用reduce获得最后一条数据,因为sink是mysql,配置不高,所以将最后一条数据拼成批量插入语句才往MySQL写入。开了一个5s的窗口用于拼接sql语句。
> >
> > 报错内容:
> > java.lang.OutOfMemoryError: Java heap space
> >
> > 报错表象:
> >
> >
> 整个taskmanager内存被占满,任务失败重启后taskmanager内存仍然是满的,导致任务再次失败。之后任务直接挂了。时间长了之后内存没释放,Taskmanager进程也会挂了。
> > 从 Windows 版邮件<https://go.microsoft.com/fwlink/?LinkId=550986>发送
> >
> >
>
>

回复: flink任务提交到集群执行一段时间报错Java heap space

Posted by Liu Join <lz...@outlook.com>.
我已经将5s的时间窗口替换为100条的countWindowAll,具体实现为使用aggregate函数将窗口内的数据拼接为一条sql语句,sql语句如下:replace into table (a1,a2,a3,a4,..) values(…)
但还是没有解决,
heap dump暂时无法提供,
taskmanager内存分配如下:
task heap:2.76G,network:343MB,JVMMetaspace:256MB

我一共运行了两个任务,都会出现这种问题,但之前写过一个简单的数据同步的程序没有出错,就是将一个MySQL库中的500张表同步到另一个MySQL库,不知道对于这种问题有没有解决的方向。
之前在监控任务运行时发现是MySQLsource先失败,然后导致整个任务挂了,在开启checkpoint时,MySQLsource和开窗之前的部分为一个parallelism,这个parallelism的checkpoint大小一直是136MB,从任务开始到结束都是136MB,其他运算的checkpoint不到1MB,是否有这部分原因
从 Windows 版邮件<https://go.microsoft.com/fwlink/?LinkId=550986>发送

发件人: Caizhi Weng<ma...@gmail.com>
发送时间: 2022年1月21日 10:52
收件人: flink中文邮件组<ma...@flink.apache.org>
主题: Re: flink任务提交到集群执行一段时间报错Java heap space

Hi!

5s 的窗口拼接 sql 语句看起来比较可疑,具体是怎么实现的?另外可以把 task manager 的 heap dump
出来看一下哪里占比较多的堆内存。

Liu Join <lz...@outlook.com> 于2022年1月20日周四 13:28写道:

> 环境:
>
> flink1.13.5,Standalone模式集群,jobmanager内存2GB,taskmanager内存4GB,集群包括一个jobmanager和两个taskmanager,每个taskmanager有2个slot。
>
>
> 任务内容是读取2万张表的数据,数据每1分钟一条,每10分钟输出每张表的最后一条数据。代码中使用了map、filter、watermark、开了一个10分钟的滑动窗口,使用reduce获得最后一条数据,因为sink是mysql,配置不高,所以将最后一条数据拼成批量插入语句才往MySQL写入。开了一个5s的窗口用于拼接sql语句。
>
> 报错内容:
> java.lang.OutOfMemoryError: Java heap space
>
> 报错表象:
>
> 整个taskmanager内存被占满,任务失败重启后taskmanager内存仍然是满的,导致任务再次失败。之后任务直接挂了。时间长了之后内存没释放,Taskmanager进程也会挂了。
> 从 Windows 版邮件<https://go.microsoft.com/fwlink/?LinkId=550986>发送
>
>


Re: flink任务提交到集群执行一段时间报错Java heap space

Posted by Caizhi Weng <ts...@gmail.com>.
Hi!

5s 的窗口拼接 sql 语句看起来比较可疑,具体是怎么实现的?另外可以把 task manager 的 heap dump
出来看一下哪里占比较多的堆内存。

Liu Join <lz...@outlook.com> 于2022年1月20日周四 13:28写道:

> 环境:
>
> flink1.13.5,Standalone模式集群,jobmanager内存2GB,taskmanager内存4GB,集群包括一个jobmanager和两个taskmanager,每个taskmanager有2个slot。
>
>
> 任务内容是读取2万张表的数据,数据每1分钟一条,每10分钟输出每张表的最后一条数据。代码中使用了map、filter、watermark、开了一个10分钟的滑动窗口,使用reduce获得最后一条数据,因为sink是mysql,配置不高,所以将最后一条数据拼成批量插入语句才往MySQL写入。开了一个5s的窗口用于拼接sql语句。
>
> 报错内容:
> java.lang.OutOfMemoryError: Java heap space
>
> 报错表象:
>
> 整个taskmanager内存被占满,任务失败重启后taskmanager内存仍然是满的,导致任务再次失败。之后任务直接挂了。时间长了之后内存没释放,Taskmanager进程也会挂了。
> 从 Windows 版邮件<https://go.microsoft.com/fwlink/?LinkId=550986>发送
>
>