Spark 1.4增加了maxResultSize内存

aha*_*jib 34 python memory apache-spark pyspark jupyter

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

serialized results of 9 tasks (1096.9 MB) is bigger than spark.driver.maxResultSize (1024.0 MB)
Run Code Online (Sandbox Code Playgroud)

我试图修复这个改变spark-config文件并仍然得到相同的错误.我听说这是火花1.4的一个问题,并想知道你是否知道如何解决这个问题.任何帮助深表感谢.

zer*_*323 44

您可以spark.driver.maxResultSizeSparkConf对象中设置参数:

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)
Run Code Online (Sandbox Code Playgroud)

你应该创建一个新的SQLContext:

from pyspark.sql import SQLContext
sqlContext = SQLContext(sc)
Run Code Online (Sandbox Code Playgroud)


Dol*_*cci 22

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


Ira*_*ati 10

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

  • 不要打开spark.sql.parquet.binaryAsString.字符串对象占用更多空间
  • 用于spark.rdd.compress在收集RDD时压缩它们
  • 尝试使用分页来收集它.(Scala中的代码,来自另一个答案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; }


Zia*_*ani 7

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

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