【问题标题】:Identifying why data is skewed in Spark确定 Spark 中数据偏斜的原因
【发布时间】:2017-10-06 10:02:58
【问题描述】:

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

更多细节,这是使用 Spark 的数据帧 API,Spark 版本 1.6。基础数据以 parquet 格式存储。

【问题讨论】:

    标签: apache-spark apache-spark-sql spark-dataframe


    【解决方案1】:

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

    我建议如下:

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

    一旦你找到了碰撞的来源,你可以尝试一些技术来消除它:

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

    【讨论】:

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