我正在使用 spark 处理数据,它适用于一天的数据(40G),但在一周的数据上出现OOM失败:
import pyspark
import datetime
import operator
sc = pyspark.SparkContext()
sqc = pyspark.sql.SQLContext(sc)
sc.union([sqc.parquetFile(hour.strftime('.....'))
.map(lambda row:(row.id, row.foo))
for hour in myrange(beg,end,datetime.timedelta(0,3600))]) \
.reduceByKey(operator.add).saveAsTextFile("myoutput")
不同ID的数量少于10k。每个 ID 都很小int
。作业失败是因为太多的执行者因 OOM 而失败。当工作成功时(在小输入上),"myoutput"
大约是 100k。
- 我究竟做错了什么?
- 我尝试替换
saveAsTextFile
为collect
(因为我实际上想在保存之前在 python 中进行一些切片和切块),行为没有区别,同样的失败。这是可以预料的吗? - 我曾经有
reduce(lambda x,y: x.union(y), [sqc.parquetFile(...)...])
而不是sc.union
-哪个更好?它有什么不同吗?
该集群有25个节点,其中825GB RAM 和224个内核。
调用是spark-submit --master yarn --num-executors 50 --executor-memory 5G
.
单个 RDD 有大约 140 列并涵盖一小时的数据,因此一周是 168(=7*24) 个 RDD 的并集。