我的数据帧很大(超过20G),试图将其保存为泡菜对象,以便以后在另一个过程中使用。
我尝试了不同的配置,以下是最新的配置。
executor_cores=4
executor_memory='20g'
driver_memory='40g'
deploy_mode='client'
max_executors_dynamic='spark.dynamicAllocation.maxExecutors=400'
num_executors_static=300
spark_driver_memoryOverhead='5g'
spark_executor_memoryOverhead='2g'
spark_driver_maxResultSize='8g'
spark_kryoserializer_buffer_max='1g'
注意:-我不能将spark_driver_maxResultSize增加到8G以上。
我还尝试将数据帧另存为hdfs文件,然后尝试将其另存为pickel,但出现了与之前相同的错误消息。
我的理解是,当我们使用pandas.pickle时,它将所有数据带入一个驱动程序,然后创建pickle对象。由于数据大小大于driver_max_result_size,因此代码失败。 (代码早先适用于2G数据。)
我们是否可以解决这个问题?
big_data_frame.toPandas().to_pickle('{}/result_file_01.pickle'.format(result_dir))
big_data_frame.write.save('{}/result_file_01.pickle'.format(result_dir), format='parquet', mode='append')
df_to_pickel=sqlContext.read.format('parquet').load(file_path)
df_to_pickel.toPandas().to_pickle('{}/scoring__{}.pickle'.format(afs_dir, rd.strftime('%Y%m%d')))
Py4JJavaError:调用o1638.collectToPython时发生错误。 :org.apache.spark.SparkException:由于阶段故障导致作业中止:955个任务的序列化结果的总大小(4.0 GB)大于spark.driver.maxResultSize(4.0 GB)
答案 0 :(得分:0)
保存为pickle文件是Spark中的RDD函数,而不是dataframe。要使用泡菜保存框架,请运行
big_data_frame.rdd.saveAsPickleFile(filename)
如果您正在使用大数据,那么在spark中运行collect或toPandas绝不是一个好主意,因为它会收集内存中的所有内容,从而使系统崩溃。我建议您使用镶木地板或任何其他格式来保存数据,因为RDD功能处于维护模式,这意味着spark不会迅速为其引入任何新功能。
要读取文件,请尝试
pickle_rdd = sc.pickleFile(filename).collect()
df = spark.createDataFrame(pickle_rdd)