48

我正在使用 Spark 1.4 进行研究并在内存设置方面苦苦挣扎。我的机器有 16GB 的内存,所以没有问题,因为我的文件大小只有 300MB。虽然,当我尝试使用函数将 Spark RDD 转换为 panda 数据帧时,toPandas()我收到以下错误:

serialized results of 9 tasks (1096.9 MB) is bigger than spark.driver.maxResultSize (1024.0 MB)

我试图通过更改 spark-config 文件来解决此问题,但仍然出现相同的错误。我听说这是 spark 1.4 的问题,想知道你是否知道如何解决这个问题。任何帮助深表感谢。

4

7 回答 7

55

您可以在对象中设置spark.driver.maxResultSize参数:SparkConf

from pyspark import SparkConf, SparkContext

# In Jupyter you have to stop the current context first
sc.stop()

# Create new config
conf = (SparkConf()
    .set("spark.driver.maxResultSize", "2g"))

# Create new context
sc = SparkContext(conf=conf)

您可能还应该创建一个新SQLContext的:

from pyspark.sql import SQLContext
sqlContext = SQLContext(sc)
于 2015-06-25T19:01:57.023 回答
28

从命令行,例如使用 pyspark,--conf spark.driver.maxResultSize=3g也可用于增加最大结果大小。

于 2016-03-25T22:17:11.167 回答
12

考虑到运行环境,调整spark.driver.maxResultSize是一种很好的做法。但是,这不是您问题的解决方案,因为数据量可能会随时间变化。正如@Zia-Kayani 提到的,最好明智地收集数据。因此,如果您有一个 DataFrame df,那么您可以在集群上调用df.rdd并执行所有神奇的事情,而不是在驱动程序中。但是,如果您需要收集数据,我建议:

  • 不要开机spark.sql.parquet.binaryAsString。字符串对象占用更多空间
  • spark.rdd.compress收集 RDD 时用于压缩它们
  • 尝试使用分页来收集它。(Scala 中的代码,来自另一个答案Scala: How to get a range of rows in a dataframe

    long count = df.count() int limit = 50; while(count > 0){ df1 = df.limit(limit); df1.show(); //will print 50, next 50, etc rows df = df.except(df1); count = count - limit; }

于 2016-10-26T16:01:58.933 回答
9

看起来您正在收集 RDD,因此它肯定会将所有数据收集到驱动程序节点,这就是您面临此问题的原因。如果 rdd 不需要,或者如果有必要,则必须避免收集数据,然后指定spark.driver.maxResultSize. 有两种定义这个变量的方法

1 - 通过将此变量设置为 2 创建 Spark Config
conf.set("spark.driver.maxResultSize", "3g")
- 或将此变量设置在spark-defaults.confspark 的 conf 文件夹中的文件中。喜欢 spark.driver.maxResultSize 3g并重新启动火花。

于 2015-06-25T19:12:09.497 回答
3

在开始工作或终端时,您可以使用

--conf spark.driver.maxResultSize="0"

消除瓶颈

于 2017-04-28T16:28:57.617 回答
2

还有一个 Spark 错误 https://issues.apache.org/jira/browse/SPARK-12837 给出了同样的错误

 serialized results of X tasks (Y MB) is bigger than spark.driver.maxResultSize

即使您可能没有明确地将数据拉到驱动程序。

SPARK-12837 解决了 Spark 错误,即 Spark 2 之前的累加器/广播变量被不必要地拉到驱动程序中,从而导致此问题。

于 2016-12-16T22:05:52.510 回答
0

您可以在启动 pyspark shell 时将 spark.driver.maxResultSize 设置为 2GB:

pyspark  --conf "spark.driver.maxResultSize=2g"

这是为了允许 spark.driver.maxResultSize 2Gb

于 2018-10-18T05:42:26.857 回答