《Spark上的等值连接优化》学习笔记

在知网可以下载。发表于2014年9年。

引言

在存储数据方面,Spark采取数据块的方式分布式存储在集群的各个节点,不支持传统并行数据仓库中的数据预划分和数据索引。也就是Spark无法干预数据的分布。

但是传统并行分析型数据块中,对等值连接操作的优化大多基于数据预划分。(这种情况使得Spark不能通过数据预划分来改进等值连接操作)

在Spark SQL中使用最多的是Broadcast Join和Repartition Join。Broadcast Join局限性大,网络和内存开销大,计算复杂度较高;Repartition Join要求在查询执行时对参与连接的两表作重新划分,网络和内存开销也大。

Broadcast Join

当大表小表连接时,为了避免Shuffle,我们可以将小表广播到各个节点内存,供大表连接。一定程度上牺牲了空间,避免了Shuffle。这种Join在Spark中称作Broadcast Join。(需要注意的点是广播的只能是小表)

spark.sql.autoBroadcastJoinThreshold可以设定小表size必须小于这个参数。

Repartition Join

重分区连接是reduce端连接。它利用MapReduce的排序-合并机制来分组数据。

Map阶段负责从多个数据集中读取数据,决定每个数据的连接值,将连接值作为输出键(output key)。输出值(output value)则包含将在reduce阶段被合并的值。

Reduce阶段,一个reducer接收map函数传来的一个输出键的所有输出值,并将数据分为多个分区。在此之后,reducer对所有的分区进行笛卡尔积(Cartersian product)连接运算,并生成全部的结果集。

缺点:需要对数据动态重划分,通信资源消耗大。通过Hash划分到同一节点的很多元祖的外键具有相同值,内存和计算资源消耗大。

本文算法

针对事实表和维表。首先将事实表在连接属性上进行以数据块为单位的去重,然后将按块去重后的事实表与维表进行预连接。,预连接通过将去重后的事实表和维表基于一致性哈希的原理进行划分,是之在并行完成,避免数据倾斜。连接结果与事实表再进行一次组装得到最终连接结果。

结论

该算法具有很好的适用性,在事实表和大维表的连接中表现出良好的性能。

原文地址:https://www.cnblogs.com/chenshaowei/p/13187588.html