Spark RDD groupByKey + join 与 join 性能对比

Che*_* Wu 0 apache-spark rdd apache-spark-sql pyspark

我正在与其他用户共享的集群上使用 Spark。所以仅仅根据运行时间来判断我的哪一个代码运行效率更高是不可靠的。因为当我运行更高效的代码时,其他人可能会运行大量数据,并使我的代码执行更长时间。

那么我可以在这里问两个问题吗:

  1. 我正在使用joinfunction 来 join 2RDDs并且我尝试groupByKey()在 using 之前使用join,如下所示:

    rdd1.groupByKey().join(rdd2)
    
    Run Code Online (Sandbox Code Playgroud)

    似乎花了更长的时间,但是我记得当我使用 Hadoop Hive 时,group by 让我的查询运行得更快。由于 Spark 使用惰性求值,我想知道groupByKeybefore是否join会让事情变得更快

  2. 我注意到Spark有一个SQL模块,到目前为止我真的没有时间尝试它,但是我可以问一下SQL模块和RDD SQL类似功能之间有什么区别吗?

zer*_*323 5

  1. 没有充分的理由让groupByKey跟随join比单独行动更快join。如果rdd1rdd2没有分区器或多个分区器不同,那么限制因素只是 所需的洗牌HashPartitioning

    通过使用,groupByKey您不仅会因为保留分组所需的可变缓冲区而增加总成本,而且更重要的是您使用了额外的转换,这会导致更复杂的 DAG。groupByKey+ join:

    rdd1 = sc.parallelize([("a", 1), ("a", 3), ("b", 2)])
    rdd2 = sc.parallelize([("a", 5), ("c", 6), ("b", 7)])
    rdd1.groupByKey().join(rdd2)
    
    Run Code Online (Sandbox Code Playgroud)

    在此输入图像描述

    join单独相比:

    rdd1.join(rdd2)
    
    Run Code Online (Sandbox Code Playgroud)

    在此输入图像描述

    最后,这两个计划甚至不等效,为了获得相同的结果,您必须flatMap在第一个计划的基础上添加一个附加项。

  2. 这是一个相当广泛的问题,但要强调主要区别:

    • PairwiseRDDs是任意元素的同构集合Tuple2。对于默认操作,您希望密钥能够以有意义的方式进行哈希处理,否则对类型没有严格的要求。相比之下,DataFrame 表现出更多的动态类型,但每列只能包含受支持的一组已定义类型的值。可以定义UDT,但仍然必须使用基本的UDT来表达。

    • DataFrames 使用Catalyst 优化器,它生成逻辑和物理执行计划,并且可以生成高度优化的查询,而无需应用手动低级优化。基于 RDD 的操作简单地遵循依赖 DAG。这意味着如果没有自定义优化,性能会更差,但对执行的控制会更好,并且有可能进行精细分级调整。

其他一些需要阅读的内容: