Flink1.10执行sql超出内存限制被yarn杀掉

classic Classic list List threaded Threaded
6 messages Options
Reply | Threaded
Open this post in threaded view
|

Flink1.10执行sql超出内存限制被yarn杀掉

faaron zheng
大家好,我在用flink1.10执行sql时,当数据比较大的时候,3T左右,100多亿条数据,在执行hash和sort的时候经常超出内存限制,被yarn杀掉,我的tm给了40g内存,每个有10个slot,每个slot3g内存。我也试过给更大的内存,但是没什么效果。不知道这是什么原因?



Reply | Threaded
Open this post in threaded view
|

Re: Flink1.10执行sql超出内存限制被yarn杀掉

DONG, Weike
Hi,

建议使用 Profiling 工具查看下堆内内存的使用情况,或者使用 MAT
等内存泄漏分析工具,找出具体的瓶颈所在(有可能是用户自定义的数据结构导致的问题)。如果发现堆内占用不大,则可能是堆外内存(native
部分)导致的,那么也可以用 jemalloc 和 jeprof 等工具来辅助定位。

On Mon, Mar 23, 2020 at 10:12 PM faaron zheng <[hidden email]> wrote:

>
> 大家好,我在用flink1.10执行sql时,当数据比较大的时候,3T左右,100多亿条数据,在执行hash和sort的时候经常超出内存限制,被yarn杀掉,我的tm给了40g内存,每个有10个slot,每个slot3g内存。我也试过给更大的内存,但是没什么效果。不知道这是什么原因?
>
>
>
>
Reply | Threaded
Open this post in threaded view
|

Re: Flink1.10执行sql超出内存限制被yarn杀掉

LakeShen
In reply to this post by faaron zheng
Hi farron ,

能否在详细描述一下你的 SQL 的逻辑



faaron zheng <[hidden email]> 于2020年3月23日周一 下午10:12写道:

>
> 大家好,我在用flink1.10执行sql时,当数据比较大的时候,3T左右,100多亿条数据,在执行hash和sort的时候经常超出内存限制,被yarn杀掉,我的tm给了40g内存,每个有10个slot,每个slot3g内存。我也试过给更大的内存,但是没什么效果。不知道这是什么原因?
>
>
>
>
Reply | Threaded
Open this post in threaded view
|

Re: Flink1.10执行sql超出内存限制被yarn杀掉

Xintong Song
Hi Faaron,

内存超用被杀说明是 native memory 用的比实际配置多,常见有以下几种可能:

   - JVM Overhead 配置大小不够。这个默认大小是 TM 大小的 10%,但是不会超过 1G。你的情况是 TM
   的总内存比较大,可以尝试调大一点。相关配置项:taskmanager.memory.jvm-overhead.[min|max|fraction]
   - UDF 中使用了 native memory,可能是用户代码,也可能是依赖的第三方库。这种属于 task off-heap 内存,默认大小是
   0,相关配置项:taskmanager.memory.task.off-heap.size
   - 如果使用了 RocksDBStateBackend,也有可能 RocksDB 的内存超用。Flink 会设置 RocksDB
   使用的缓存大小为 managed memory 大小,但是我们发现 RocksDB 存在缺陷,在极个别情况下有可能会限制不住。可以尝试关闭
   RocksDB 的内存控制,这样 RocksDB 会使用默认缓存大小,不会随着 Flink TM
   的增大而增大。配置项:state.backend.rocksdb.memory.managed


Thank you~

Xintong Song



On Mon, Mar 23, 2020 at 10:15 PM LakeShen <[hidden email]> wrote:

> Hi farron ,
>
> 能否在详细描述一下你的 SQL 的逻辑
>
>
>
> faaron zheng <[hidden email]> 于2020年3月23日周一 下午10:12写道:
>
> >
> >
> 大家好,我在用flink1.10执行sql时,当数据比较大的时候,3T左右,100多亿条数据,在执行hash和sort的时候经常超出内存限制,被yarn杀掉,我的tm给了40g内存,每个有10个slot,每个slot3g内存。我也试过给更大的内存,但是没什么效果。不知道这是什么原因?
> >
> >
> >
> >
>
Reply | Threaded
Open this post in threaded view
|

回复:Flink1.10执行sql超出内存限制被yarn杀掉

faaron zheng
Hi,感谢大家的回复,经过我的分析和测试,我猜测是和taskmanager.network.blocking-shuffle.type=mmap 有关。我看了下监控,Mappred占用的内存会逐渐升至20多G甚至更高,从而导致超过yarn的限制被杀掉。另一方面,如果我配置成taskmanager.network.blocking-shuffle.type=file,监控Mappred一直为0,最后报错会是OutOfMemoryError:direct buffer memory 说明mmap和file用的是不同的存储。 我有还有两个疑问,一:file模式用的是direct中哪一部分memory。二:对于单表几个T的这种情况,两种模式如何降低内存不够的问题。 -------- 原始邮件 -------- 发件人: Xintong Song <[hidden email]> 日期: 2020年3月24日周二 上午9:58 收件人: user-zh <[hidden email]> 主 题: Re: Flink1.10执行sql超出内存限制被yarn杀掉 Hi Faaron, 内存超用被杀说明是 native memory 用的比实际配置多,常见有以下几种可能:    - JVM Overhead 配置大小不够。这个默认大小是 TM 大小的 10%,但是不会超过 1G。你的情况是 TM    的总内存比较大,可以尝试调大一点。相关配置项:taskmanager.memory.jvm-overhead.[min|max|fraction]    - UDF 中使用了 native memory,可能是用户代码,也可能是依赖的第三方库。这种属于 task off-heap 内存,默认大小是    0,相关配置项:taskmanager.memory.task.off-heap.size    - 如果使用了 RocksDBStateBackend,也有可能 RocksDB 的内存超用。Flink 会设置 RocksDB    使用的缓存大小为 managed memory 大小,但是我们发现 RocksDB 存在缺陷,在极个别情况下有可能会限制不住。可以尝试关闭    RocksDB 的内存控制,这样 RocksDB 会使用默认缓存大小,不会随着 Flink TM    的增大而增大。配置项:state.backend.rocksdb.memory.managed Thank you~ Xintong Song On Mon, Mar 23, 2020 at 10:15 PM LakeShen <[hidden email]> wrote: > Hi farron , > > 能否在详细描述一下你的 SQL 的逻辑 > > > > faaron zheng <[hidden email]> 于2020年3月23日周一 下午10:12写道: > > > > > > 大家好,我在用flink1.10执行sql时,当数据比较大的时候,3T左右,100多亿条数据,在执行hash和sort的时候经常超出内存限制,被yarn杀掉,我的tm给了40g内存,每个有10个slot,每个slot3g内存。我也试过给更大的内存,但是没什么效果。不知道这是什么原因? > > > > > > > > > faaron zheng 邮箱:[hidden email] 签名由 网易邮箱大师 定制
Reply | Threaded
Open this post in threaded view
|

Re: Flink1.10执行sql超出内存限制被yarn杀掉

Xintong Song
>
> file模式用的是direct中哪一部分memory
>
这部分内存开销按理说应该是归在 Network Memory,但是目前并没有,只能通过 Framework / Task Off-Heap
来配置。你可以关注一下 FLINK-15981 [1] 。

Thank you~

Xintong Song

[1] https://issues.apache.org/jira/browse/FLINK-15981

On Sat, Mar 28, 2020 at 9:25 AM faaron zheng <[hidden email]> wrote:

>
> Hi,感谢大家的回复,经过我的分析和测试,我猜测是和taskmanager.network.blocking-shuffle.type=mmap
> 有关。我看了下监控,Mappred占用的内存会逐渐升至20多G甚至更高,从而导致超过yarn的限制被杀掉。另一方面,如果我配置成taskmanager.network.blocking-shuffle.type=file,监控Mappred一直为0,最后报错会是OutOfMemoryError:direct
> buffer memory
> 说明mmap和file用的是不同的存储。
>
> 我有还有两个疑问,一:file模式用的是direct中哪一部分memory。二:对于单表几个T的这种情况,两种模式如何降低内存不够的问题。
>
> -------- 原始邮件 --------
> 发件人: Xintong Song <[hidden email]>
> 日期: 2020年3月24日周二 上午9:58
> 收件人: user-zh <[hidden email]>
> 主 题: Re: Flink1.10执行sql超出内存限制被yarn杀掉
> Hi Faaron,
>
> 内存超用被杀说明是 native memory 用的比实际配置多,常见有以下几种可能:
>
>    - JVM Overhead 配置大小不够。这个默认大小是 TM 大小的 10%,但是不会超过 1G。你的情况是 TM
>
> 的总内存比较大,可以尝试调大一点。相关配置项:taskmanager.memory.jvm-overhead.[min|max|fraction]
>    - UDF 中使用了 native memory,可能是用户代码,也可能是依赖的第三方库。这种属于 task off-heap 内存,默认大小是
>    0,相关配置项:taskmanager.memory.task.off-heap.size
>    - 如果使用了 RocksDBStateBackend,也有可能 RocksDB 的内存超用。Flink 会设置 RocksDB
>    使用的缓存大小为 managed memory 大小,但是我们发现 RocksDB 存在缺陷,在极个别情况下有可能会限制不住。可以尝试关闭
>    RocksDB 的内存控制,这样 RocksDB 会使用默认缓存大小,不会随着 Flink TM
>    的增大而增大。配置项:state.backend.rocksdb.memory.managed
>
>
> Thank you~
>
> Xintong Song
>
>
>
> On Mon, Mar 23, 2020 at 10:15 PM LakeShen <[hidden email]>
> wrote:
>
> > Hi farron ,
> >
> > 能否在详细描述一下你的 SQL 的逻辑
> >
> >
> >
> > faaron zheng <[hidden email]> 于2020年3月23日周一 下午10:12写道:
> >
> > >
> > >
> >
> 大家好,我在用flink1.10执行sql时,当数据比较大的时候,3T左右,100多亿条数据,在执行hash和sort的时候经常超出内存限制,被yarn杀掉,我的tm给了40g内存,每个有10个slot,每个slot3g内存。我也试过给更大的内存,但是没什么效果。不知道这是什么原因?
> > >
> > >
> > >
> > >
> >
> faaron zheng
> 邮箱:[hidden email]
>
> <https://maas.mail.163.com/dashi-web-extend/html/proSignature.html?ftlId=1&name=faaron+zheng&uid=faaronzheng%40gmail.com&iconUrl=https%3A%2F%2Fmail-online.nosdn.127.net%2Fqiyelogo%2FdefaultAvatar.png&items=%5B%22%E9%82%AE%E7%AE%B1%EF%BC%9Afaaronzheng%40gmail.com%22%5D>
>
> 签名由 网易邮箱大师 <https://mail.163.com/dashi/dlpro.html?from=mail88> 定制
>