谁能解释在Apache Spark生产中如何处理偏斜数据?
场景:
我们使用“ spark-submit” 提交了spark作业,在spark-ui中,发现很少有任务花费很长时间,这表明存在歪斜。
问题:
(1)我们应该采取什么步骤(重新分区,合并等)?
(2)我们是否需要取消工作,然后在罐子中包含歪斜解, 重新提交工作?
(3)我们能否通过直接从(coalesce)运行命令来解决此问题 壳而不杀死工作?
答案 0 :(得分:3)
在应用非归约键(改组)操作时,数据偏斜是一个主要的问题。两个最常见的示例是:
groupByKey
(RDD.groupByKey
,Dataset.groupBy(Key).mapGroups
,Dataset.groupBy.agg(collect_list)
)。RDD
和Dataset
joins
。很少,该问题与分区键和分区功能的属性有关,而数据分布没有任何问题。
// All keys are unique - no obvious data skew
val rdd = sc.parallelize(Seq(0, 3, 6, 9, 12)).map((_, None))
// Drastic data skew
rdd.partitionBy(new org.apache.spark.HashPartitioner(3)).glom.map(_.size).collect
// Array[Int] = Array(5, 0, 0)
我们应该采取什么步骤(重新分区,合并等)?
重新分区(从不coalesce
)可以通过后一种情况为您提供帮助
以前的情况通常不会从重新分区中受益,因为操作本身自然会引起偏斜。具有相同键的值不能扩展到多个分区,并且过程的非归约性受初始数据分布的影响最小。
这些情况必须通过调整应用程序的逻辑来处理。在实践中,这可能意味着很多事情,具体取决于数据或问题:
我们是否需要取消工作,然后将歪斜的解决方案包含在罐子中并重新提交工作?
通常,您至少必须使用调整参数重新提交作业。
在某些情况下(大多数是RDD
批处理作业),您可以设计应用程序,以监视任务执行情况,并在可能出现歪斜的情况下终止并重新提交特定作业,但是在实践中可能很难正确实现。
通常,如果可能出现数据偏斜,则应将应用程序设计为不受数据偏斜的影响。
我们能否通过直接从外壳运行(coalesce)之类的命令而不会杀死工作来解决此问题?
我相信以上几点已经回答了这一问题,但只能说-Spark中没有这样的选择。您当然可以将它们包含在您的应用程序中。