【问题标题】:Apache Spark Handling Skewed DataApache Spark 处理倾斜数据
【发布时间】:2016-12-21 23:37:43
【问题描述】:

我有两张表要合并在一起。其中一个有非常糟糕的数据偏差。这导致我的 spark 作业无法并行运行,因为大部分工作都在一个分区上完成。

我听说过并阅读过,并尝试过对我的密钥进行加盐以增加分布。 https://www.youtube.com/watch?v=WyfHUNnMutg 12:45 秒正是我想做的事。

任何帮助或提示将不胜感激。谢谢!

【问题讨论】:

    标签: scala hadoop apache-spark spark-dataframe


    【解决方案1】:

    是的,您应该在较大的表上使用加盐键(通过随机化),然后将较小的表复制/笛卡尔连接到新的加盐键:

    这里有几个建议:

    Tresata 倾斜加入 RDD https://github.com/tresata/spark-skewjoin

    python 倾斜连接: https://datarus.wordpress.com/2015/05/04/fighting-the-skew-in-spark/

    tresata 库如下所示:

    import com.tresata.spark.skewjoin.Dsl._  // for the implicits   
    
    // skewjoin() method pulled in by the implicits
    rdd1.skewJoin(rdd2, defaultPartitioner(rdd1, rdd2),   
    DefaultSkewReplication(1)).sortByKey(true).collect.toLis
    

    【讨论】:

    • 是否有任何 scala 库可以进行倾斜连接?同样在您提供的第二个链接中。他们正在获取第一个数据帧密钥并为其添加一个随机数。在第二个数据帧中,他们将密钥复制 n 次,其中 n 是您添加到第一个数据帧的随机范围。当第二个数据框很小时,这似乎是可以管理的。这是解决上述问题的唯一方法吗?
    • 我已经成功导入了 import com.tresata.spark.skewjoin.Dsl._ 但是我在我的 RDD[(String, row)] 的 rdd 上找不到 .skewJoin 方法
    • 我执行了以下操作:rdd1.skewJoin(rdd2, defaultPartitioner(rdd1, rdd2), DefaultSkewReplication(1)).sortByKey(true).collect.toList 但需要三个导入导入 com.twitter。 algebird.CMSHasherImplicits._ import org.apache.spark.Partitioner.defaultPartitioner import com.tresata.spark.skewjoin.Dsl._
    猜你喜欢
    • 1970-01-01
    • 2015-07-08
    • 1970-01-01
    • 1970-01-01
    • 2015-12-14
    • 2019-12-15
    • 2020-01-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多