关于Spark中的常见问题及解决方法(3) —— Aggregations操作
前言
如果你程序中的聚合速度较慢,请先查看 Spark Stragglers/任务执行缓慢部分。
主要症状
- 在执行 groupby 操作时,任务执行缓慢
- 聚合操作的后序操作也很缓慢
可能的原因
这类问题并没有固定的解决方法。 有时候,由于作业中的数据有一些偏斜的键(即数据倾斜),导致作业执行缓慢。
可能的解决方法
- 在聚合之前增加分区数量可能有助于减少每个任务中处理的不同键的数量。
- 增加Executor的内存也可以帮助缓解这个问题。 如果键有大量数据,这将允许Executor尽量在内存内进行计算而避免溢出到磁盘。
- 如果聚合之后的任务也很慢,这意味着聚合后的数据集可能仍然不平衡。 尝试插入重新分区调用以随机分区。
- 在聚合操作之前使用SELECT等操作过滤选出需要处理的数据,避免处理无关的数据。 Spark的查询优化器将自动为结构化API执行此操作。
- 确保数据中的空值被正确表示(使用Spark的null概念)而不是像”“或”EMPTY“那样的默认值。 Spark通常会尽可能优化,在作业早期跳过空值,但对于其他自定义的占位符值,并没有这样的优化机制
- 有些聚合函数本身也比其他函数慢。 例如,collect_list 和 collect_set 是非常慢的聚合函数,因为它们必须将所有匹配的对象返回给驱动程序,应该在性能关键代码中避免使用。
参考资料
[[BOOK]]Spark - The Definitive Guide](http://shop.oreilly.com/product/0636920034957.do)