我在YARN群集上运行Spark工作,并且创建了250个任务,几乎每次在10分钟内完成230个任务,但剩下的20个任务需要另外1个小时才能完成。
在saveAsTextFile()操作中花费时间。
并且所写的大多数部分都是空的[几乎超过150个是空的]
任何具体原因,为什么它运行速度很慢。我没有在stderr日志中看到任何错误。
答案 0 :(得分:1)
这可能有很多原因,要完全回答我们需要查看代码。
即使它在saveAsTextFile()
花费时间,导致它的操作可能是另一个。预感是,在保存操作之前,您使用的是reduceByKey
或GROUP BY
。
现在,如果您有数据偏差,即不平衡的数据,大多数记录只属于几个键,那么这些操作可能会出现问题。例如,如果您按美国州分组,则只有50个,因此您实际只有50个任务正在工作,所以即使您总共有250个任务,它们也没有任何输入。 或者假设您按国家/地区对用户进行分组,但大部分用户来自美国:您只需要处理大部分数据的任务,并且比其他任务要晚得多。
因此,您需要做的是查看在保存之前执行分组/缩减的任何操作,并查看数据以查看是否存在任何偏差。
答案 1 :(得分:1)
RDD中元素的这种不良分布可能是由具有错误散列函数的元素引起的。默认分区使用HashPartitioner
,这会通过element.hashCode() % numberOfPartitions
分配分区。如果你有一个哈希函数,你的元素分配不当,那么你会有高度倾斜的分区和空分区。
检查hashCode()
方法是否包含RDD的任何元素,并验证它是否为您的元素生成了良好的结果分布。有关实施hashCode()
的建议,请参见Best implementation for hashCode method。您的IDE可能会为您生成良好的实现。