我用RDD创建DataFrame后,Spark什么时候向不同的执行器发送数据



我正试图从数据列表中构建一个DataFrame,然后将其写入镶木地板文件:

dataframe = None
while True:
data_list = get_data_list() # this function would return a list of data, about 1 million rows
rdd = sparkContext.parallelize(data_list, 20)
if dataframe:
dataframe.union(sparkSession.createDataFrame(data=rdd))
else:
dataframe = sparkSession.createDataFrame(data=rdd)

if some_judgement:
break
dataframe.write.parquet('...')

但我发现java.lang.OutOfMemoryError: Java heap space驱动程序在几个周期后就会失败。如果我增加driver-memory或减少循环中的循环数,则此异常将停止发生。所以我想即使我创建了一个RDD,数据仍然存储在驱动程序中。那么,数据什么时候才能发送给执行人呢?我想减少驱动程序的内存使用量。

您能检查日志并查看异常发生的位置吗(在驱动程序或执行程序处(?如果发生在driver->你能把驱动程序的内存增加到8或10 GB,看看它是否成功了?

此外,我建议为memoryOverHead参数设置一些更高的值。

spark.driver.memoryOverhead
spark.executor.memoryOverhead

最新更新