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.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)
Run Code Online (Sandbox Code Playgroud)
你应该创建一个新的SQLContext:
from pyspark.sql import SQLContext
sqlContext = SQLContext(sc)
Run Code Online (Sandbox Code Playgroud)
Ira*_*ati 10
spark.driver.maxResultSize考虑到运行环境,调整是一种很好的做法.但是,它不是您的问题的解决方案,因为数据量可能会随时间变化.正如@ Zia-Kayani所提到的,明智地收集数据会更好.因此,如果您有一个DataFrame df,那么您可以调用df.rdd并执行群集上的所有神奇功能,而不是驱动程序.但是,如果您需要收集数据,我建议:
spark.sql.parquet.binaryAsString.字符串对象占用更多空间spark.rdd.compress在收集RDD时压缩它们
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; }
看起来你正在收集RDD,所以它肯定会收集到驱动程序节点的所有数据,这就是你遇到这个问题的原因.如果rdd不需要,则必须避免收集数据,或者必要时指定spark.driver.maxResultSize.有两种方法可以定义这个变量
1 - 通过将此变量设置为
conf.set("spark.driver.maxResultSize", "3g")
2来创建Spark Config - 或者将此变量设置在spark-defaults.confspark的conf文件夹中的文件中.喜欢spark.driver.maxResultSize 3g并重启火花.