首页 > 解决方案 > 无法将大型火花数据框保存为泡菜

问题描述

我有大数据框(略超过 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)

标签: pandaspysparkhdfs

解决方案


保存为 pickle 文件是 Spark 中的 RDD 函数,而不是数据帧。要使用 pickle 保存框架,请运行

big_data_frame.rdd.saveAsPickleFile(filename)

如果您正在处理大数据,那么在 spark 中运行 collect 或 toPandas 绝不是一个好主意,因为它会收集内存中的所有内容,从而导致系统崩溃。我建议您使用 parquet 或任何其他格式来保存数据,因为 RDD 功能处于维护模式,这意味着 spark 不会快速向其引入任何新功能。

要读取文件,请尝试

pickle_rdd = sc.pickleFile(filename).collect()
df = spark.createDataFrame(pickle_rdd)

推荐阅读