replicate join的实现

13 篇文章 2 订阅

提出问题

假设 R(A, B) & S(B, C) & T(C, D)

我们有两种实现方式:

  • 把多路 join 拆解成两路 join,先 R join S, 然后将结果与 T 做 join

  • 直接一次实现三个关系的 join。Map进程把 R 和 T 中的每个元组发送到许多不同的 Reduce 进程,S 的每个元组只发送到一个 Reduce 进程。这样会使得shuffle的成本变大,但是避免了将中间结果落hdfs(为了做容错,默认3份)和再读取。如果一个关系和另一个关系在 Join 之后,数据被撑大了,则这种多路连接则会更优。

    本文的大多数内容都在讲该优化算法的实现,作为介绍,我们可以看一个例子。

    我们在上述的 Join 中,把 B 和 C 作为 map-key,对其取 hash,得到 pair(i, j)。假设我们设置 Reduce 的个数为 k,并且对 B 和 C 赋予相同的权重,令 k = m * m,设置hash的范围是1 ~ m。则 S(B, C) 的值会被发送到 (h(b), h©),R(A, B)会被发送到(h(b), x),T(C , D)的值会被发送到 (y, h©)。因此,R 的数据被复制了 m 份,T 的数据被复制了 m 份,S的数据只有一份。

    在这里插入图片描述

在给定固定数量的 Reduce 进程的情况下,我们研究优化共享问题。

在上述示例中,我们选择了 B 和 C 作为map-key,并且给它们相同的 bucket 数量, m = k m = \sqrt {k} m=k ,这个选择有两个问题:

  1. 为什么把 B 和 C 作为 map-key
  2. 为什么给它们相同的 bucket 数量

一、前置知识——拉格朗日数乘法

**定义:**拉格朗日乘数法是一种寻找多元函数在其变量受到一个或多个条件的约束时的局部极值的方法。这种方法可以将一个有n个变量与k个约束条件的最优化问题转换为一个解有n + k个变量的方程组的解的问题。

举例: 求双曲线 xy = 3 上离远点最近的点,参考:https://www.cnblogs.com/bigmonkey/p/9480462.html

如果(x, y)是曲线上的点,原点到该点的距离是: f ( x , y ) = x 2 + y 2 f(x, y) = \sqrt{x^2 + y^2} f(x,y)=x2+y2

求离原点最近的点实际上是求f(x,y)的最小值。可以使用一个更容易的方程去掉根号: f ( x , y ) = x 2 + y 2 f(x, y) = x^2 + y ^2 f(x,y)=x2+y2

在计算最小值时候有一个限制是: g ( x , y ) = x y = 3 g(x, y) = xy = 3 g(x,y)=xy=3

把这个较为简单的例子用等高线图表示:

在这里插入图片描述

很明显,当 f f f g g g 相切的时候,能得到 f f f 的最小值。如果把双曲线看作自身的等高线,那么当f的等高线和g的等高线相切时,f值最小。实际上这也是找到最值的一般情形。

如果两个等高线相切,则二者在切点处的切线也相同,也就是说它们的梯度向量平行,即: ∇ f / / ∇ g \nabla f // \nabla g f//∇g

在这里插入图片描述

如果两个向量平行,则其中一个向量是另一个向量的倍数,由此得到: ∇ f = λ ∇ g \nabla f = \lambda \nabla g f=λg

在这里插入图片描述
(Typora的公式在CSDN解析失败了,这里直接贴图了)

通过举上述这个简单的例子就是为了体会拉格朗日乘数法的思想,即通过引入拉格朗日乘子(λ)将原来的约束优化问题转化为无约束的方程组问题。

拉格朗日的基本形态:

求函数 z = f ( x , y ) z = f(x, y) z=f(x,y) 在满足 $ g(x, y) = 0 $ 下的条件极值,可以转化成 F ( x , y , λ ) = f ( x , y ) + λ g ( x , y ) F(x, y, \lambda) = f(x, y) + \lambda g(x, y) F(x,y,λ)=f(x,y)+λg(x,y) 的无条件极值问题

二、多路连接

2.1 优化示例

为了说明在多路join中如何优化map-key,我们从下面的例子开始,一个循环join:

R(A, B) & S(B, C) & T(A,C)

假设我们使用 k 个 Reduce 进程,令 A,B,C 分别得到的份额是 a,b,c,意味着将 A map 到 a 个bucket,B map 到 b 个bucket, C map 到 c 个bucket,则 abc = k。

考虑对于R中的元组 (x, y),它的元组被发送到 ( h ( x ) , h ( y ) , w ) , 1 < = w < = c (h(x), h(y), w), 1 <= w <= c (h(x),h(y),w),1<=w<=c。S中的元组(y, z)被发送到 ( u , h ( y ) , h ( z ) ) , 1 < = u < = a (u, h(y), h(z)), 1 <= u <= a (u,h(y),h(z)),1<=u<=a。T中的元组(x, z) 被发送到 ( h ( x ) , v , h ( z ) ) , 1 < = v < = b (h(x), v, h(z)), 1 <= v <= b (h(x),v,h(z))1<=v<=b

则我们从map到reduce的通信成本为 $rc + sa + tb $ (r, s, t是 R,S,T中元组的个数)

所以我们可以把问题转化成在 a b c = k abc = k abc=k 的限制下,求 r c + s a + t b rc + sa + tb rc+sa+tb 的最小值。由拉格朗日数乘法可得到 r c + s a + t b − λ ( a b c − k ) rc + sa + tb - \lambda (abc - k) rc+sa+tbλ(abck)

分别对 a,b,c求导并将结果置为0(极值点 f x ( x 0 , y 0 ) = 0 , f y ( x 0 , y 0 ) = 0 f_x(x_0, y_0) = 0, f_y(x_0, y_0) = 0 fx(x0,y0)=0,fy(x0,y0)=0),可得

s = λ b c s = \lambda bc s=λbc

t = λ a c t = \lambda ac t=λac

r = λ a b r = \lambda ab r=λab

在上述等式两边同乘 a,b,c可得

s a = λ a b c = λ k sa = \lambda abc = \lambda k sa=λabc=λk

t b = λ a b c = λ k tb = \lambda abc = \lambda k tb=λabc=λk

r c = λ a b c = λ k rc = \lambda abc = \lambda k rc=λabc=λk

再让上述三个等式相乘可得

r s t k = λ 3 k 3 rstk = \lambda ^3 k^3 rstk=λ3k3

可得 λ = r s t / k 2 3 \lambda = \sqrt[3]{rst / k^2} λ=3rst/k2

因为 s a = λ k sa = \lambda k sa=λk, 所以 a = k r t / s 2 3 a = \sqrt[3]{krt/s^2} a=3krt/s2 , 同理 b = k r s / t 2 3 b = \sqrt[3]{krs / t^2} b=3krs/t2 , c = k s t / r 2 3 c = \sqrt[3]{kst/r^2} c=3kst/r2 。把 a, b, c 代回原始表达式 rc + sa + tb,可得最小通信成本为 3 k r s t 3 3\sqrt[3]{krst} 33krst

2.2 和普通的连接相比较

为了简化计算,我们假设 r = s = t r = s = t r=s=t,那么上述的通信成本就被简化成 3 r k 3 3r\sqrt[3]{k} 3r3k ;我们同时假设来自两个不同关系的元组之间可以 join 的可能性为 p p p, 例如,

对于优化的3路join,它的通信成本为:

  1. Map获取输入的成本 3r
  2. Map 将数据传给 Reduce 的成本 3 r k 3 3r\sqrt[3]{k} 3r3k

因为第二个占主导作用,所以3路join的通信成本为 O ( r k 3 ) O(r\sqrt[3]{k}) O(r3k )

对于2路join两个关系,它的通信成本为:

  1. Map获取输入的成本 2r
  2. 第一个 Reduce 处理完数据,将中间结果传给第二个 Reduce 的成本为 r 2 p r^2 p r2p

如果 r p > 1 rp > 1 rp>1, 则2路join的通信成本为 O ( r 2 p ) O(r^2p) O(r2p)

因此,我们需要比较的就是 r p rp rp k 3 \sqrt[3]{k} 3k r r r p p p 是数据本身的性质,而 k k k 是我们自己选择的。所以为了使 3路 join 更优,k 的大小是有限制的,此限制为 k < ( r p ) 3 k < (rp)^3 k<(rp)3。例如,如果 rp = 15,那么 k 可以选择到 3375。

一个例子:假设 r = 1 0 7 , p = 1 0 − 5 , k = 1000 r = 10^7, p = 10^-5, k = 1000 r=107,p=105,k=1000。那么2路join的成本 r 2 p = 1 0 9 r^2p = 10^9 r2p=109,3路join的成本 r k 3 = 1 0 8 r\sqrt[3]{k} = 10^8 r3k =108,3路join的成本远小于2路join。

三、怎么在实际中使用

这种方法的效率,与数据的分布以及reduce的个数都有关系,如果每次处理多路join都采取这种方式,那不一定是最优的。

3.1 生成所有的执行图

在这里插入图片描述

假设有这样一个join的关系,我们先通过各种组合生成执行图(注意,这里还不是执行计划),如{ (P, PS, L) , (S, N) , (O) } 或者 { (P, L), (PS, S, N) , (O) }…

可能生成的执行计划会有很多,最后从中选出成本最小的一个

3.2 选出最优的执行计划

3.1可能会生成很多执行图,我们需要遍历每种执行图,对执行图中的子图进行join排列,从中选出最优的执行计划。

在这里插入图片描述

如图,假设(a)是其中的一个执行图,那它会有(b)中的两种可能的执行计划,我们需要从中选出最优的。

注:3.1生成执行图和3.2挑选最优的执行计划,都有其专门的算法,这不做介绍了

四、成本估计

上述讲的优化,都是要在程序未执行的时候选出最优的执行计划,这里采用的估算方式是用 直方图来估算数据量,具体在估算的时候,就是考虑到 mr 中涉及到的各种步骤,如读取数据、网络传输、shuffle中的排序、溢写等步骤,在论文Query Optimization for Massively Parallel Data Processing里都有很具体的算法。

参考文献

Optimizing Joins in a Map-Reduce Environment

Query Optimization for Massively Parallel Data Processing

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值