无法将大型Spark数据框保存为泡菜

时间:2019-05-15 15:24:03

标签: pandas pyspark hdfs

我的数据帧很大(超过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)

1 个答案:

答案 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)