spark.driver.maxResultSize 是啥?

Posted

技术标签:

【中文标题】spark.driver.maxResultSize 是啥?【英文标题】:What is spark.driver.maxResultSize?spark.driver.maxResultSize 是什么? 【发布时间】:2016-12-29 11:54:49 【问题描述】:

ref 说:

每个分区的所有分区的序列化结果的总大小限制 触发动作(例如收集)。至少应为 1M,或 0 无限。如果总大小超过此限制,作业将被中止。 具有上限可能会导致驱动程序中的内存不足错误(取决于 JVM 中对象的 spark.driver.memory 和内存开销)。环境 适当的限制可以防止驱动程序出现内存不足错误。

这个属性到底是做什么的?我的意思是一开始(因为我不是在与因内存不足错误而失败的工作作斗争)我认为我应该增加它。

再想一想,这个属性似乎定义了工作人员可以发送给驱动程序的结果的最大大小,因此将其保留为默认值 (1G) 将是保护驱动程序的最佳方法..

但是在这种情况下会发生,worker 将不得不发送更多消息,所以开销只是工作会变慢?


如果我理解正确,假设一个工作人员想要向驱动程序发送 4G 数据,那么拥有spark.driver.maxResultSize=1G,将导致工作人员发送 4 条消息(而不是 1 条,无限 spark.driver.maxResultSize)。如果是这样,那么增加该属性以保护我的驱动程序不被 Yarn 暗杀应该是错误的。

但是上面的问题仍然存在..我的意思是如果我将它设置为 1M(最小值)会是最具保护性的方法吗?

【问题讨论】:

【参考方案1】:

假设一个工作人员想要向驱动程序发送 4G 的数据,那么 spark.driver.maxResultSize=1G 将导致工作人员发送 4 条消息(而不是 1 条无限的 spark.driver.maxResultSize)。

没有。如果估计的数据大小大于maxResultSize,则给定的作业将被中止。这里的目标是保护您的应用程序免受驱动程序丢失,仅此而已。

如果我将其设置为 1M(最小值),这会是最具保护性的方法吗?

在某种意义上是的,但显然它在实践中没有用。良好的价值应该允许应用程序正常进行,但可以保护应用程序免受意外情况的影响。

【讨论】:

将其设置为 0 表示无限制非常方便,直到导致崩溃为止。 为什么将 maxResultSize 设置为 max 不是一个好的选择?它是如何使驱动程序失败的? 因为Driver做了很多事情! (照顾工人,块经理等......)没有足够的堆=>崩溃。 因此,如果您将其设置为较低的值......它也会崩溃!这有点像 assert():你遇到了一个你不想要的条件,要么它会因为断言而停止,要么它会因为达到堆限制而崩溃。如果您在理论上不进行断言,则在堆崩溃之前需要更多时间(可能在交换时磁盘抖动)。 @ThomasDecaux maxResultSize 与驱动程序内存堆有什么关系?将 maxResultSize 设置得太高是否会导致结果大小比正常增长更多?

以上是关于spark.driver.maxResultSize 是啥?的主要内容,如果未能解决你的问题,请参考以下文章