Spark 1.4 增加 maxResultSize 内存

Spark 1.4 increase maxResultSize memory

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

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

我尝试通过更改 spark-config 文件来解决此问题,但仍然遇到相同的错误。我听说这是 spark 1.4 的问题,想知道您是否知道如何解决这个问题。非常感谢任何帮助。

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

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)

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

1 - create Spark Config by setting this variable as
conf.set("spark.driver.maxResultSize", "3g")
2 - or set this variable in spark-defaults.conf file present in conf folder of spark. like spark.driver.maxResultSize 3g and restart the spark.

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

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

  • 不开启spark.sql.parquet.binaryAsString。字符串对象需要更多 space
  • 收集 RDD 时使用 spark.rdd.compress 压缩它们
  • 尝试使用分页收集它。 (Scala 中的代码,来自另一个答案

    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; }

还有一个 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 bug,该 Spark bug accumulators/broadcast Spark 2 之前的变量被拉到不必要的驱动程序导致这个问题。

在启动作业或终端时,您可以使用

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

消除瓶颈

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

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

这是为了 spark.driver.maxResultSize

允许 2Gb