栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 前沿技术 > 大数据 > 大数据系统

拾贰SparkSQL:数据关联优化

拾贰SparkSQL:数据关联优化

        在分布式环境中,Spark 支持两类数据分发模式。一类是学过的 Shuffle,Shuffle 通过中间文件来完成 Map 阶段与 Reduce 阶段的数据交换,因此它会引入大量的磁盘与网络开销。

         另一类是我们介绍的广播变量(Broadcast Variables),广播变量在 Driver 端创建,并由 Driver 分发到各个 Executors。因此,从数据分发模式的角度出发,数据关联又可以分为 Shuffle Join 和 Broadcast Join 这两大类。将两种分发模式与 Join 本身的 3 种实现机制相结合,就会衍生出分布式环境下的 6 种 Join 策略。那么,对于这 6 种 Join 策略,Spark SQL 是如何支持的呢?它们的优劣势与适用场景都有哪些?开发者能否针对这些策略有的放矢地进行取舍?今天这一讲,咱们就来聊聊这些话题。

Join 实现机制的优势对比

        首先,我们先来说一说不同 Join 实现机制本身的一些特性与适用场景,从而为后续的讨论打好基础。需要说明的是,咱们这里说的 Join 实现机制,指的是算法层面的工作原理,不同的算法有着不同的适用场景与复杂度,我们需要对它们有足够认识并有所区分。我们知道,Join 支持 3 种实现机制,它们分别是 Hash Join、Sort Merge Join 和 Nested Loop Join。三者之中,Hash Join 的执行效率最高,这主要得益于哈希表 O(1) 的查找效率。不过,在 Probe 阶段享受哈希表的“性能红利”之前,Build 阶段得先在内存中构建出哈希表才行。因此,Hash Join 这种算法对于内存的要求比较高,适用于内存能够容纳基表数据的计算场景。相比之下,Sort Merge Join 就没有内存方面的限制。不论是排序、还是合并,SMJ 都可以利用磁盘来完成计算。所以,在稳定性这方面,SMJ 更胜一筹。而且与 Hash Join 相比,SMJ 的执行效率也没有差太多,前者是 O(M),后者是 O(M + N),可以说是不分伯仲。当然,O(M + N) 的复杂度得益于 SMJ 的排序阶段。因此,如果准备参与 Join 的两张表是有序表,那么这个时候采用 SMJ 算法来实现关联简直是再好不过了。与前两者相比,Nested Loop Join 看上去有些多余,嵌套的双层 for 循环带来的计算复杂度最高:O(M * N)。不过,尺有所短寸有所长,执行高效的 HJ 和 SMJ 只能用于等值关联,也就是说关联条件必须是等式,像 salaries(“id”) < employees(“id”) 这样的关联条件,HJ 和 SMJ 是无能为力的。相反,NLJ 既可以处理等值关联(Equi Join),也可以应付不等值关联(Non Equi Join),可以说是数据关联在实现机制上的最后一道防线。Shuffle Join 与 Broadcast Join分析完不同 Join 机制的优缺点之后,接下来,我们再来说说分布式环境下的 Join 策略。与单机环境不同,在分布式环境中,两张表的数据各自散落在不同的计算节点与 Executors 进程。因此,要想完成数据关联,Spark SQL 就必须先要把 Join Keys 相同的数据,分发到同一

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/672901.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号