【发布时间】:2015-05-23 06:10:10
【问题描述】:
我正在使用 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。
- 我做错了什么?
- 我尝试用
collect替换saveAsTextFile(因为我实际上想在保存之前在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 的并集。
【问题讨论】:
-
我将从查看性能 UI 开始,并记住 union 不是典型的 union。如果你想要一个独特的联合,那么你需要在联合之后调用 distinct。
-
@JustinPihony:我知道
union意味着连接,而这正是我想要的。什么是“性能 UI”? -
如果只有 25 个节点,为什么还要调用
--num-executors 50? -
@MikelUrkia:因为我有 224 个核心。
标签: apache-spark bigdata pyspark scalability distributed-computing