似乎问题在于您试图拉回驱动程序的数据量太大。您很可能正在使用 collect 方法从 Dataframe / RDD中 检索所有值。该
驱动程序 是一个过程,通过收集 数据框 你拉你已经在集群回分发到一个节点的数据的。 这违反了分发它的目的!
仅在将数据减少到可管理的数量之后才执行此 *** 作。
您有两种选择:
如果确实需要处理所有这些数据,则应将其保留在执行程序中。使用 HDFS 和 Parquet 以分布式方式保存数据,并使用Spark方法在群集上使用数据,而不是尝试将所有数据收集回一个位置。
如果确实需要将数据送回驱动程序,则应检查是否确实需要所有数据。如果只需要摘要统计信息,则在调用collect之前在执行程序上进行计算。或者,如果您仅需要前100个结果,则仅 收集 前100个结果。
更新:
还有另一个原因会导致您不太明显地遇到此错误。除了您显式调用collect之外,Spark还将尝试将数据发送回驱动程序。如果您正在使用累加器,用于广播联接的数据以及有关每个任务的一些小状态数据,它还将为每个任务发送回累加器结果。如果您有很多分区(根据我的经验,超过20k),有时您会看到此错误。这是一个已知问题,需要进行一些改进,还有很多工作要做。
如果这是您遇到的问题,可以选择的解决方法是:
- 增加
spark.driver.maxResultSize
或将其设置为0可无限 - 如果是广播联接的元凶,则可以减小
spark.sql.autoBroadcastJoinThreshold
以限制广播联接数据的大小 - 减少分区数
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)