ChannelOutboundBuffer分配了超过2GB的空间,并为我的执行者进行了OOM

时间:2018-07-21 11:26:19

标签: scala apache-spark netty

我正在hadoop集群上运行spark。在(巨大的)随机播放阶段中,一些执行器由于内存不足而崩溃。

在调查过程中,我发现OOM是在netty线程中触发的,这是由于ChannelOutboundBuffer试图增长到非常大的价值(我认为是2GB并试图使其翻倍)。 我看了一些Spark和Netty的源代码,并有以下问题:

  • 是否允许ChannelOutboundBuffer变大? (即超过2GB)
  • 在洗牌期间,应该为netty生成的出站缓冲区的大小是多少?根据{{​​3}}的说法,似乎一个缓冲区将包含所有数据,执行程序请求进行改组需要该数据(因此即使有很多数据也不会拆分)。这是正确的吗?
  • 即使所有数据都放在单个netty缓冲区中,我也假设netty不需要在发送数据之前在其中ChannelOutboundBuffer拥有数据的完整副本,因为它可以流式传输。在那种情况下,为什么要在发送之前在ChannelOutboundBuffer中缓存这么多数据?

0 个答案:

没有答案