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