我正在尝试编写一个Spark工作,以各种方式分析时间序列。通过一系列转换,我获取一个数据帧并放到rdds,这样我的行结构如下:
Row[((tuple, key) t1, t2, t3, t4, t5, ...)]
我们打电话给这个rdd:rdd
。
我致电rdd.flatMap(foo(r[1:]))
,我希望foo
能够输入一个时间列表,并在输出时提供分析列表。
让我们说
def foo(times):
return [average(times), percentile(times, 25)]
当我运行这个工作时,它需要永远,我得到OOM
错误导致一切都失败。 times
应该不超过600K
项,这就是超级异常情况。大多数可能介于10K
- 100K
之间。
我无法使用reduceByKey()
,因为我需要执行的操作需要查看整个时间序列并多次来回。
有没有人对解决此OOM
慢度问题的方法有任何建议?
答案 0 :(得分:0)
假设我已正确阅读您的问题,您有一个RDD,其中每一行都是元组列表,而某些行最多可以有600K元组。
在不知道您的群集配置或查看实际代码的情况下,我只能推测。我最好的猜测是,由于Spark只按行分区,因此具有大量列的行不能将其列分布在分区之间,这会导致内存不足错误。
如果这是原因,您可能需要增加群集容量或重组数据,以便每个元组都在自己的行上。