大家好,我在用flink1.10执行sql时,当数据比较大的时候,3T左右,100多亿条数据,在执行hash和sort的时候经常超出内存限制,被yarn杀掉,我的tm给了40g内存,每个有10个slot,每个slot3g内存。我也试过给更大的内存,但是没什么效果。不知道这是什么原因?
|
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内存。我也试过给更大的内存,但是没什么效果。不知道这是什么原因? > > > > |
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内存。我也试过给更大的内存,但是没什么效果。不知道这是什么原因? > > > > |
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内存。我也试过给更大的内存,但是没什么效果。不知道这是什么原因? > > > > > > > > > |
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] 签名由 网易邮箱大师 定制
|
>
> 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> 定制 > |
In reply to this post by Xintong Song
关闭了RocksDB的内存控制后,是不是应该把taskmanager.memory.managed.size设置成0?
-- Sent from: http://apache-flink.147419.n8.nabble.com/ |
Free forum by Nabble | Edit this page |