我正在尝试在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个执行器上运行?
尽管描述该函数的文档似乎符合我对mapPartitions
(http://spark.apache.org/docs/latest/programming-guide.html),Is这个失败的想法,或者它应该在groupByKey
之后工作吗?
编辑:我尝试使用较小数据集的较小集群,即使成功,也只使用一个执行程序来处理groupByKey之后的所有数据。此外,在每个阶段之后有多个分区,并且当我逐个启动阶段时,groupByKey阶段在界面上的每个阶段被标记为“待定”。