为什么pyspark内存只用于地图程序?

时间:2016-12-10 15:48:03

标签: pyspark

我有一个简单的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')
       )

这看起来像一个只有地图的程序,为什么它会因为大输入文件而内存不足?

1 个答案:

答案 0 :(得分:0)

Spark有许多活动部件。它从文本读取数据到分区(通常在内存中),你正在解码json,如果你的行很长(即一个大的json对象)可能会导致问题,你做了一个可能有太多元素的partitionBy。

我首先尝试增加分区数量开始(即使用重新分区而不是合并,这只会减少分区数量),我也会尝试在没有partitionBy的情况下编写,如果失败则尝试查找最长的json,并尝试仅分析它(即将json字符串映射到长度并花费最长时间)。