YARN上的Spark - 任务运行速度很慢

时间:2016-02-09 18:01:42

标签: java apache-spark yarn

我在YARN群集上运行Spark工作,并且创建了250个任务,几乎每次在10分钟内完成230个任务,但剩下的20个任务需要另外1个小时才能完成。

在saveAsTextFile()操作中花费时间。

并且所写的大多数部分都是空的[几乎超过150个是空的]

任何具体原因,为什么它运行速度很慢。我没有在stderr日志中看到任何错误。

2 个答案:

答案 0 :(得分:1)

这可能有很多原因,要完全回答我们需要查看代码。 即使它在saveAsTextFile()花费时间,导致它的操作可能是另一个。预感是,在保存操作之前,您使用的是reduceByKeyGROUP BY

现在,如果您有数据偏差,即不平衡的数据,大多数记录只属于几个键,那么这些操作可能会出现问题。例如,如果您按美国州分组,则只有50个,因此您实际只有50个任务正在工作,所以即使您总共有250个任务,它们也没有任何输入。 或者假设您按国家/地区对用户进行分组,但大部分用户来自美国:您只需要处理大部分数据的任务,并且比其他任务要晚得多。

因此,您需要做的是查看在保存之前执行分组/缩减的任何操作,并查看数据以查看是否存在任何偏差。

答案 1 :(得分:1)

RDD中元素的这种不良分布可能是由具有错误散列函数的元素引起的。默认分区使用HashPartitioner,这会通过element.hashCode() % numberOfPartitions分配分区。如果你有一个哈希函数,你的元素分配不当,那么你会有高度倾斜的分区和空分区。

检查hashCode()方法是否包含RDD的任何元素,并验证它是否为您的元素生成了良好的结果分布。有关实施hashCode()的建议,请参见Best implementation for hashCode method。您的IDE可能会为您生成良好的实现。