我有一个简单的pyspark程序,一次读取2个文本文件,将每一行转换为json对象并将其写入镶木地板文件,如下所示:
for f in chunk(files, 2):
file_rdd = sc.textFile(f)
df = (file_rdd
.map(decode_to_json).filter(None)
.toDF(schema)
.coalesce(5)
.write
.partitionBy("created_year", "created_month")
.mode("append")
.parquet(file_output))
我使用yarn运行作业,配置如下:
conf = (SparkConf()
.setAppName(app_name)
.set("spark.executor.memory", '6g')
.set('spark.executor.instances', '6')
.set('spark.executor.cores', '2')
.set("parquet.enable.summary-metadata", "false")
.set("spark.sql.parquet.compression.codec", 'snappy')
)
这看起来像一个只有地图的程序,为什么它会因为大输入文件而内存不足?
答案 0 :(得分:0)
Spark有许多活动部件。它从文本读取数据到分区(通常在内存中),你正在解码json,如果你的行很长(即一个大的json对象)可能会导致问题,你做了一个可能有太多元素的partitionBy。
我首先尝试增加分区数量开始(即使用重新分区而不是合并,这只会减少分区数量),我也会尝试在没有partitionBy的情况下编写,如果失败则尝试查找最长的json,并尝试仅分析它(即将json字符串映射到长度并花费最长时间)。