Apache spark 确定Spark中数据倾斜的原因

Apache spark 确定Spark中数据倾斜的原因,apache-spark,apache-spark-sql,spark-dataframe,Apache Spark,Apache Spark Sql,Spark Dataframe,我正在调查一个Spark SQL作业(Spark 1.6.0),由于200个分区中的数据严重倾斜,该作业的性能很差,大多数数据位于1个分区中: 我想知道的是…Spark UI中是否有任何东西可以帮助我了解更多关于数据如何分区的信息?从这里看,我不知道数据帧是在哪些列上分区的。我怎么才能知道呢?(除了查看代码之外,我想知道日志和/或UI中是否有任何东西可以帮助我) 其他详细信息,这是使用Spark的DataFrameAPI,Spark版本1.6。底层数据以拼花地板格式存储。Spark UI和日志对

我正在调查一个Spark SQL作业(Spark 1.6.0),由于200个分区中的数据严重倾斜,该作业的性能很差,大多数数据位于1个分区中: 我想知道的是…Spark UI中是否有任何东西可以帮助我了解更多关于数据如何分区的信息?从这里看,我不知道数据帧是在哪些列上分区的。我怎么才能知道呢?(除了查看代码之外,我想知道日志和/或UI中是否有任何东西可以帮助我)


其他详细信息,这是使用Spark的DataFrameAPI,Spark版本1.6。底层数据以拼花地板格式存储。

Spark UI和日志对此没有太大帮助。Spark使用算法作为几乎所有内容的默认值。正如您在这里看到的,这基本上回收了Java
hashCode
方法

我建议如下:

  • 尝试通过采样和打印RDD或数据帧的内容进行调试。查看键的数据分布(即低方差或低基数)是否存在明显问题
  • 如果这是无效的,您可以从日志和UI返回,以计算有多少分区。您可以使用spark找到数据的
    hashCode
    ,然后取模以查看冲突是什么
找到碰撞源后,您可以尝试使用一些技术来消除碰撞:


  • 看看有没有更好的钥匙可以用
  • 看看是否可以改进键的
    hashCode
    功能(Java中的默认功能不是很好)
  • 查看是否可以通过执行初始分散/聚集步骤来分两步处理数据,以强制执行一些并行性并减少该分区的处理开销。这可能是最棘手的优化,以获得正确的那些提到这里。基本上,使用随机数生成器对数据进行一次分区,强制数据进行一些初始并行组合,然后使用自然分区器将其再次推送,以获得最终结果。这要求应用的操作是可传递的和关联的。这种技术在网络上运行两次,因此非常昂贵,除非数据实际上是高度倾斜的

“看看是否有更好的钥匙可以使用”在撰写本文时,我不知道目前使用的是什么钥匙。我基本上想知道是否有一种方法可以从UI或日志中知道这一点。到目前为止,我还没有找到任何东西。如果你能用什么API和版本(Spark SQL、Spark上的Hive、数据帧、数据集、RDD)的详细信息更新你的问题您正在使用一些基本的详细信息,例如您正在使用的文件格式作为输入,这将更容易提供更多的建议。您是否可以包括一个代码示例或一些有关产生倾斜的操作的详细信息?我可以,因为我们实际上已经找到了问题的根源:)。源数据是零售交易,其中许多是针对未知客户的,因此它们都获得相同的客户标识符,因此存在偏差。但我的问题仍然存在,我无法从UI确定数据是如何分区的(例如,在哪些列上),我想知道是否有一种方法可以在不返回原始代码的情况下确定这一点。回答您的问题:不,没有一种方法可以从Spark History Server或应用程序UI执行此操作。