PySpark reduceByKey会导致内存不足

时间:2015-11-05 14:50:42

标签: apache-spark pyspark google-cloud-dataproc

我正在尝试在Yarn模式下运行一项工作,该模式处理从谷歌云存储中读取的大量数据(2TB)。 我的管道工作得很好,有10GB的数据。 我的集群的规格和管道的开头详述如下: PySpark Yarn Application fails on groupBy

以下是管道的其余部分:

      input.groupByKey()\
      [...] processing on sorted groups for each key shard
      .mapPartitions(sendPartition)\
      .map(mergeShardsbyKey)
      .reduceByKey(lambda list1, list2: list1 + list2).take(10)
      [...] output

分区上应用的map函数如下:

def sendPartition(iterator):
    pool = external_service_connection_pool()
    return [make_request(record, pool) for record in iterator]

def make_request(record, pool):
    [...] tags a record based on query results from the external service
    return key, taggedrecord

在整个数据集上执行失败,原因是:

java.lang.OutOfMemoryError: Java heap space

我尝试获取更多信息,但我发现它在reduceByKey上失败了,但是自mapPartitions以来,该任务仅在一个执行者上执行直到它在reduce上失败(至少只有一个执行程序显示在Spark Web界面上,并且作业在reduce之前不会分成多个任务)

我的问题如下:为什么它只在1个执行器上运行? 尽管描述该函数的文档似乎符合我对mapPartitionshttp://spark.apache.org/docs/latest/programming-guide.html),Is这个失败的想法,或者它应该在groupByKey之后工作吗?

编辑:我尝试使用较小数据集的较小集群,即使成功,也只使用一个执行程序来处理groupByKey之后的所有数据。此外,在每个阶段之后有多个分区,并且当我逐个启动阶段时,groupByKey阶段在界面上的每个阶段被标记为“待定”。

0 个答案:

没有答案