Optimizing Joins in a Map-Reduce Environment

文章探讨了在Map-Reduce环境中优化多个关系join的策略,通过map-key的选择和数据复制的最小化来降低通信成本。作者提出了一种算法解决map-key分配和数据复制的问题,并特别关注了链连接和星型连接的优化实例。
摘要由CSDN通过智能技术生成

ABSTRACT

Map-Reduce的实现被用于对非常大的数据执行许多操作。我们研究了在Map-Reduce环境中Join多个关系的策略。我们的新方法从识别 “map-key” 开始,这是一组属性,用于识别必须向 Reduce 进程发送特定元组的 Map 进程。map-key 的每一个属性有一个份额,代表它的值要被 hash 到几个桶中,以形成 Reduce 进程标识符的一个组成部分。关系以有限的方式复制它们的元组,复制的度取决于在它们的scheme 中丢失的映射键属性的份额。在给定固定数量的 Reduce 进程的情况下,我们研究优化共享问题。给出了一种用于检测和修复变量被错误地包含在映射键中的问题的算法。然后,我们考虑两个重要的特殊情况:链连接和星型连接。在每种情况下,我们都能够确定映射键并确定产生最少复制的份额。虽然我们提出的方法并不总是优于使用 map-reduce 实现连接的传统方法,但在涉及大规模数据的一些重要案例中,我们的方法胜出,包括:(1) 分析查询,其中一个非常大的事实table 与较小的维度表连接 (2) 查询涉及通过具有高出度的图的路径,例如 Web 或社交网络。

一、Introduction

1.1 算法的成本度量

  • 进程的通信成本是该进程的输入大小。
  • 总通信成本是构成算法的所有进程的通信成本之和。
  • 因为从磁盘读取数据和通过网络传输数据的成本主导总运行时间,所以我们没有考虑Processor所花费的计算时间。

1.2 整体思路

  1. 在第二节中,我们回顾了使用 map-reduce 计算 join 的正常方式。通过示例,我们勾勒出一种用于多路连接评估的算法,该算法通过正确选择用于在 Reduce 进程之间划分和复制数据的属性来优化通信成本;选定的属性形成 map-key。
  2. 在2.4节中,我们为 map-key 的每个属性引入了 “共享” 的概念。共享份额的乘积是一个固定常数 k,代表 reduce 的数量。多路连接中的每个关系被复制的次数与不在该关系的模式中的映射键属性的份额的乘积一样多。
  3. 论文的核心探讨了如何选择 map-key 和 share 以最小化通信成本。
    • 在常见的情况下,我们简单地建立拉格朗日方程并求解它们以在正正交(所有共享变量非负的区域)中找到最小值。 如果某些共享变量小于 1,我们可以将它们设置为 1,它们的最小可能值,并将它们从映射键中删除。 然后我们重新解决较小的映射键属性集的优化问题。
    • 不幸的是,在某些情况下,拉格朗日方程的解意味着至少一个或多个共享变量为 0。这实际上意味着在一个固定的约束条件下,在正正数中达到最小值 共享变量的乘积,某些变量必须接近 0,而其他变量接近无穷大,所有这些变量的乘积保持一个固定常数。 第 3 节探讨了这个问题。 我们从第 3.2 节开始识别“支配”属性,这些属性可以被证明永远不属于映射键,并解释了拉格朗日在正象限内无法产生解的大多数情况。
    • 但是 map-key 中的主要属性并不对所有此类失败负责。 第 3.4 节处理了这些罕见但可能的情况。 我们表明,可以从映射键中删除属性,直到剩余属性允许我们求解方程,尽管选择要删除的正确属性集的过程在属性数量上可能是指数的。
    • 最后,在第 3.5 节中,我们能够将上述所有想法放在一起。 我们提供了一种算法,用于为任何自然连接找到共享变量的最佳值。
  4. 第 4 节检查了两种常见的连接:链连接和星型连接(大型事实表与几个较小维度表的连接)。 对于这些类型的连接中的每一种,我们为每个属性的映射键的最佳共享问题提供了封闭形式的解决方案。
    • 在星型连接的情况下,该解决方案不仅告诉我们如何在 map-reduce 类型的环境中计算连接。 它还建议如何通过在所有计算节点之间永久划分事实表并在一小部分计算节点之间复制每个维度表来优化存储。 这个选项是我们技术的现实且易于采用的应用。

二、多路连接

2.1 一次实现多个关系的连接

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

我们有两种实现方式:

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

  • 直接一次实现三个关系的 join。Map进程把 R 和 T 中的每个元组发送到许多不同的 Reduce 进程,S 的每个元组只发送到一个 Reduce 进程。这种数据的重复与我们最小化通信成本不符,但同时,我们不必传达第一次 Join 的结果。如果一个关系和另一个关系在 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的数据只有一份。

    image-20220327133601457

  • 实验结果在 Appendix Section B

2.2 优化示例

在2.1中,我们选择了 B 和 C 作为map-key,并且给它们相同的 bucket 数量,m = √k,这个选择有两个问题:

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

为了说明在多路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,可得

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.3 和普通的连接相比较

为了简化计算,我们假设 r = s = t r = s = t r=s=t,那么上述的通信成本就被简化成 3 r k 3 3r\sqrt[3]{k} 3r3k ;我们同时假设来自两个不同关系的元组之间可以 join 的可能性为 p p p, 例如,如果关系是 Web 的关联矩阵,则 rp 等于页面的平均出度,可能在 10-15 范围内。

对于优化的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。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值