16个任务的序列化结果的总大小(1048.5 MB)大于spark.driver.maxResultSize(1024.0 MB)

16个任务的序列化结果的总大小(1048.5 MB)大于spark.driver.maxResultSize(1024.0 MB),第1张

16个任务的序列化结果的总大小(1048.5 MB)大于spark.driver.maxResultSize(1024.0 MB)

似乎问题在于您试图拉回驱动程序数据量太大。您很可能正在使用 collect 方法从 Dataframe / RDD中 检索所有值。该
驱动程序 是一个过程,通过收集 数据框 你拉你已经在集群回分发到一个节点的数据的。 这违反了分发它的目的!
仅在将数据减少到可管理的数量之后才执行此 *** 作。

您有两种选择:

  1. 如果确实需要处理所有这些数据,则应将其保留在执行程序中。使用 HDFSParquet 以分布式方式保存数据,并使用Spark方法在群集上使用数据,而不是尝试将所有数据收集回一个位置。

  2. 如果确实需要将数据送回驱动程序,则应检查是否确实需要所有数据。如果只需要摘要统计信息,则在调用collect之前在执行程序上进行计算。或者,如果您仅需要前100个结果,则仅 收集 前100个结果。

更新:

还有另一个原因会导致您不太明显地遇到此错误。除了您显式调用collect之外,Spark还将尝试将数据发送回驱动程序。如果您正在使用累加器,用于广播联接的数据以及有关每个任务的一些小状态数据,它还将为每个任务发送回累加器结果。如果您有很多分区(根据我的经验,超过20k),有时您会看到此错误。这是一个已知问题,需要进行一些改进,还有很多工作要做。

如果这是您遇到的问题,可以选择的解决方法是:

  1. 增加
    spark.driver.maxResultSize
    或将其设置为0可无限
  2. 如果是广播联接的元凶,则可以减小
    spark.sql.autoBroadcastJoinThreshold
    以限制广播联接数据的大小
  3. 减少分区数


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zaji/5653874.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-16
下一篇 2022-12-16

发表评论

登录后才能评论

评论列表(0条)

保存