java自学网VIP

Java自学网

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 2198|回复: 0

《大规模分布式存储系统》第13章 大数据【13.3】

[复制链接]
  • TA的每日心情
    开心
    2021-5-25 00:00
  • 签到天数: 1917 天

    [LV.Master]出神入化

    2025

    主题

    3683

    帖子

    6万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    66101

    宣传达人突出贡献优秀版主荣誉管理论坛元老

    发表于 2017-3-20 19:37:40 | 显示全部楼层 |阅读模式
    13.3 MapReduce扩展
    9 F2 Y; q! ]) R$ ]- w# w4 fMapReduce框架有效地解决了海量数据的离线批处理问题,在各大互联网公司得, q1 c0 E- [% `7 E! \, i
    到广泛的应用。事实已经证明了MapReduce巨大的影响力,以至于引发了一系列的扩1 F- l; T% u' H& k0 k$ ^7 D% r4 Y
    展和改进。这些扩展包括:3 S3 W9 q6 Y. A2 f7 z0 T* X8 o, b
    ●Google Tenzing:基于MapReduce模型构建SQL执行引擎,使得数据分析人员可
    2 R! N8 t  C) U% K0 v6 x( u以直接通过SQL语言处理大数据。0 a! z0 g0 [4 d9 ]) v
    ●Microsoft Dryad:将MapReduce模型从一个简单的两步工作流扩展为任何函数
    4 L% K9 U5 \1 H/ v集的组合,并通过一个有向无环图来表示函数之间的工作流。
    $ Z1 e" _  ^# q# u( ?; e4 h●Google Pregel:用于图模型迭代计算,这种场景下Pregel的性能远远好于
    / c' @, i) J! S3 P( BMapReduce。
    4 |) |% @7 T( N, M+ M" X13.3.1 Google Tenzing" X. |$ C, Y+ S7 N3 y% @' ]1 u
    Google Tenzing是一个构建在MapReduce之上的SQL执行引擎,支持SQL查询且能
    $ G2 A! Y" q% i1 k7 V够扩展到成千上万台机器,极大地方便了数据分析人员。
    : q5 L/ S* N4 P4 q  q; e. @% X1.整体架构
    - ?- Y! X* u5 J/ B! XTenzing系统有四个主要组件:分布式Worker池、查询服务器、客户端接口和元
    # z2 k' p9 }8 P0 E7 r- N3 o数据服务器,如图13-2所示。
    % H7 X& I# E3 ?9 ?$ y2 I图 13-2 Tenzing整体架构; R- l9 a+ E5 w4 i6 @& ~" S' Y
    ●查询服务器(Query Server):作为连接客户端和worker池的中间桥梁而存在。# \0 U  A( `# n3 V( A# I8 k+ \
    查询服务器会解析客户端发送的查询请求,进行SQL优化,然后将执行计划发送给分
    ! d) V2 J8 N' b* }( ^6 ?1 G布式Worker池执行。Tenzing支持基于规则(rule-based optimizer)以及基于开销( I: m) w9 A  X+ B) M
    (cost-based optimizer)两种优化模式。
    ( a' q3 S& O7 O4 F7 v( M/ d  {. o●分布式Worker池:作为执行系统,它会根据查询服务器生成的执行计划运行4 I, l" Q: @" _$ F3 m
    MapReduce任务。为了降低查询延时,Tenzing不是每次都重新生成新进程,而是让进
    6 e. ^& D2 x& ?5 z. K程一直处于运行状态。Worker池包含master和worker两种节点,其中,master对应
    2 H4 ?6 b: ]. I+ Q5 ?MapReduce框架中的master进程,worker对应MapReduce框架中的map和reduce进程。
    ) B" J$ n# i0 G& R" Z% N另外,还有一个称为master监听者(master watcher)的守护进程,查询服务器通过
    $ z) X: u1 @: q6 ^* V  Z# y3 @7 v  J: Kmaster监听者获取master信息。+ X& I1 |- E7 F( \; v' V$ S
    ●元数据服务器(Metadata Server):存储和获取表格schema、访问控制列表
    . i) G. `% s0 X" \(Access Control List,ACL)等全局元数据。元数据服务器使用Bigtable作为持久化的: f0 a% d/ A8 w6 }, Y# u3 ?
    后台存储。
    ; \; s; Y4 W- i- x" q# X●客户端接口:Tenzing提供三类客户端接口,包括API、命令行客户端(CLI)以9 x: d. u; q: @. D- A# H* `
    及Web UI。
      G2 l  N4 w& [1 j5 U+ G& Y  O! d4 ?●存储(Storage):分布式worker池中的master和worker进程执行MapReduce任务2 i3 m9 E3 F. A" t
    时需要读写存储服务。另外,查询服务器会从存储服务获取执行结果。
    5 q* \, L# E  H$ {7 f2.查询流程1 R0 H3 o: R/ i2 |$ P& j! V
    1)用户通过Web UI、CLI或者API向查询服务器提交查询。' k0 q. a" _6 ~& O) `3 M& S
    2)查询服务器将查询请求解析为一个中间语法树。) e/ T- n& V( `! `  _9 h6 L  b& x
    3)查询服务器从元数据服务器获取相应的元数据,然后创建一个更加完整的中2 R. Y" x" C4 N0 u
    间格式。  Q* E9 W) a5 k8 s+ t9 t  X: x
    4)优化器扫描该中间格式进行各种优化,生成物理查询计划。
    5 o. ^6 x3 ^' }6 d6 O7 c$ Y5)优化后的物理查询计划由一个或多个MapReduce作业组成。对于每个. C' w0 S  O* N( v4 \# h
    MapReduce作业,查询服务器通过master监听者找到一个可用的master,master将该作业
    8 M6 `( l4 i6 _. m8 X划分为多个任务。
    - O% L2 k" g0 d$ z9 [. ]- E6)空闲的worker从master拉取已就绪的任务。Reduce进程会将它们的结果写入2 T" t% h! H8 W# p$ @% _5 \' J
    到一个中间存储区域中。
    - D- M( ?$ z0 N% X3 M. J7)查询服务器监控这些中间存储区域,收集中间结果,并流失地返回给客户7 h* [: P6 h2 u; B7 c% j  z
    端。% Q: `1 T" V/ h2 \
    3.SQL运算符映射到MapReduce
    8 @3 A3 M7 ~. g6 U# {/ e查询服务器负责将用户的SQL操作转化为MapReduce作业,本节介绍各个SQL物- _2 Z. u6 r* Y) V6 \; O
    理运算符对应的MapReduce实现。7 M' k9 h0 y' j- _0 C
    (1)选择和投影
    " Z3 z$ x* H! q3 \" n( l1 U选择运算符σ C (R)的一种MapReduce实现如下。
    5 p/ l5 E& z1 d, A: T0 U3 S# HMap函数:对R中的每个元素t,检测它是否满足条件C。如果满足,则产生一/ }/ A& h) |( [# \
    个“键-值”对(t,t)。也就是说,键和值都是t。  `) v9 [& z; K- `
    Reduce函数:Reduce的作用类似于恒等式,它仅仅将每个“键-值”对传递到输出* I- t* }/ A, B& E% K3 @
    部分。
    , E# a9 D9 b' I+ z1 x( ?投影运算的处理和选择运算类似,不同的是,投影运算可能会产生多个相同的$ Z+ o$ X1 I/ K' Q* p4 A, r
    元组,因此Reduce函数必须要剔除冗余元组。可以采用如下方式实现投影运算符- E, n2 x4 n; f7 g# W
    π S (R)。
    3 R  T- B  L1 S2 n/ yMap函数:对R中的每个元组t,通过剔除属性不在S中的字段得到元组t',输出一
    " j2 }% T$ N. [. t# ^个“键-值”对(t',t')。8 k9 y9 E2 A8 I0 |0 Y9 f+ O
    Reduce函数:对任意Map任务产生的每个键t',将存在一个或多个“键-值”对. |  l7 [5 u* @( B
    (t',t'),Reduce函数将(t',[t',t',…,t'])转换为(t',t'),以保证对该键t'只产
    : C9 ~0 K0 K4 i$ p7 B4 e' J生一个(t',t')对。
    4 R. C1 a. i& ~# r% GTenzing执行时会做一些优化,例如选择运算符下移到存储层;如果存储层支持
    * |9 m; b& T4 z列式存储,Tenzing只扫描那些查询执行必须的列。
    # f: B5 ]" j9 R* R- P" E(2)分组和聚合
    . K  H  U1 X' `假定对关系R(A,B,C)按照字段A分组,并计算每个分组中所有元组的字段B! L% r- K& H) j! x% `& n
    之和。可以采用如下方式实现γ A,SUM(B) (R)。
    ( m2 {0 a" e4 E" U5 `+ L* P" q6 `Map函数:对于每个元组,生成“键-值”对(a,b)。2 u+ R! E) G* I$ K
    Reduce函数:每个键a代表一个分组,对与键a相关的字段B的值的列表[b 1 ,b 2 ,
    . e! B: x+ R7 @  l6 c% C. q: N8 g2 J…,b n ]执行SUM操作,输出结果为(a,SUM(b 1 ,b 2 ,…,b n ))。4 z8 E) S. C* N6 @* p7 ^( g7 J6 y
    Tenzing支持基于哈希的聚合操作,首先,放松底层MapReduce框架的限制,
    + T8 Y6 }( w  I& }7 b. Gshuffle时保证所有键相同的“键-值”对属于同一个Reduce任务,但是并不要求按照键
    # {5 z4 N+ F1 V$ |有序排列。其次,Reduce函数采用基于哈希的方法对数据分组并计算聚合结果。5 W8 ~7 s2 R; o) z8 ]5 U6 G
    (3)多表连接
    ; C, v2 s! K* v- v- n7 S大表连接是分布式数据库的难题,MapReduce模型能够有效地解决这一类问题。
    + W( f* f5 Q! l常见的连接算法包括Sort Merge Join、Hash Join以及Nested Loop Join。$ M& f1 e4 O# J# C! Y: Y" w7 F
    假设需要将R(A,B)和S(B,C)进行自然连接运算,即寻找字段B相同的元
    & p9 j7 K7 E- s& h1 E2 }9 i组。可以通过Sort Merge Join实现如下:
      U! y0 \7 }8 ?0 B. oMap函数:对于R中的每个元组(a,b),生成“键-值”对(b,(R,a)),对S中的
    * S4 _3 |. T) U* n每个元组(b,c),生成“键-值”对(b,(S,c))。6 }0 Q% c' d7 g" o6 [/ p6 Z8 u
    Reduce函数:每个键值b会与一系列对相关联,这些对要么来自(R,a),要么来
    % f1 b# b. U& T+ D自(S,c)。键b对应的输出结果是(b,[(a 1 ,b,c 1 ),(a 2 ,b,c 2 ),…]),也就是说,与b* F1 t! y1 U' l! o
    相关联的元组列表由来自R和S中的具有共同b值的元组组合而成。# N/ W$ e& O6 ?" h, Z
    如果两张表格都很大,且二者的大小比较接近,Join字段也没有索引,Sort( Q$ b/ F" L9 X) ~* [( Z/ G. l7 V
    Merge Join往往比较高效。然而,如果一张表格相比另外一张表格要大很多,Hash; {2 C' f/ F. j" T# B  w
    Join往往更加合适。
    7 _; V  }* Y& P( c! b4 L% w假设R(A,B)比S(B,C)大很多,可以通过Hash Join实现自然连接。Tenzing中
    * y# @. p6 z; [一次Hash Join需要执行三个MapReduce任务。7 m9 ]% n; p' Y! k
    MR1:将R(A,B)按照字段B划分为N个哈希分区,记为R 1 ,R 2 ,…,R N ;
      F' \, c4 n4 ]' B3 {+ TMR2:将S(B,C)按照字段B划分为N个哈希分区,记为S 1 ,S 2 ,…,S n ;
    , D9 ^) `7 L9 V5 x: {4 \/ a4 dMR3:每个哈希分区<R i ,S i >对应一个Map任务,这个Map任务会将S i 加载到内( [. @5 W# a+ M$ u) s$ G
    存中。对于R i 中的每个元组(a,b),生成(b,[(a,b,c 1 ),(a,b,c 2 ),…]),其中,+ X6 X) F2 Z# ?4 b# K9 K
    (b,[c 1 ,c 2 ,…])是S i 中存储的元组。Reduce的作用类似于恒等式,输出每个传入; G/ ~) [. `( D' p% y- T- M
    的“键-值”对。  N2 R" O( |' `/ Z/ \. o$ v1 B
    Sort Merge Join和Hash Join适用于两张表格都不能够存放到内存中,且连接列没2 j. L- _- ?, S! `
    有索引的场景。如果S(B,C)在B列有索引,可以通过Remote Lookup Join实现自然; n; _, ?$ ~' m7 X
    连接,如下:2 h, _9 l( c1 M1 V
    Map函数:对于R中的每个元组(a,b),通过索引查询S(B,C)中所有列值为b
    # i' R1 ~4 m) N; k的元组,生成(b,[(a,b,c 1 ),(a,b,c 2 ),…])。
    : f4 y. q2 \9 C, w3 P" L9 oReduce函数:Reduce的作用类似于恒等式,输出每个传入的“键-值”对。/ U" @$ f/ H6 V  [9 ]6 C$ @' J
    如果S(B,C)能够存放到内存中,那么,Map进程在执行map任务的过程中会将
    8 t' K5 c" M( k' H/ ES(B,C)的所有元组缓存在本地,进一步优化执行效率。另外,同一个Map进程可
    5 h% x1 G. I, W, [能执行多个map任务,这些map任务共享一份S(B,C)的所有元组缓存。
    5 F, k. ^3 ]% ?13.3.2 Microsoft Dryad
    2 E( _0 }5 n" }Microsoft Dryad是微软研究院创建的研究项目,主要用来提供一个分布式并行计
    ) A$ K& l; Z4 c算平台。在Dryad平台上,每个Dryad工作流被表示为一个有向无环图。图中的每个
    " b) t! M4 S6 z/ U节点表示一个要执行的程序,节点之间的边表示数据通道中数据的传输方式,其可
    - q3 _0 \* N8 }5 _7 ?4 u( U# b0 ]能是文件、管道、共享内存、网络RPC等。Dryard工作流如图13-3所示。
    + T5 b# N8 j3 [! C* @2 U. ?1 J图 13-3 Dryad工作流2 Z3 G8 g# S7 H
    每个节点(vertices)上都有一个处理程序在运行,并且通过数据通道
    / Q: Y6 G7 ^7 d5 [$ B  z2 _(channels)的方式在它们之间传输数据。类似于Map和Reduce函数,工作流中的" W0 }6 Y' y! V: L# H5 x2 c7 j$ D; ]
    grep、sed、map、reduce、merge等函数可以被很多节点执行,每个节点会被分配一部7 h8 X& a& z. S
    分输入。Dryad的主控进程(Job Manager)负责将整个工作分割成多个任务,并分发. H. p9 L$ R3 _
    给多个节点执行。每个节点执行完任务后通知主控进程,接着,主控进程会通知后) A- k" l, x& [$ @8 _. o
    续节点获取前一个节点的输出结果。等到后续节点的输入数据全部准备好后,才可, S' ?- O% G1 h& m. C
    以继续执行后续任务。) A3 ~0 @3 V- W$ `" l8 j# ^! F, c
    Dryad与MapReduce具有的共同特性就是,只有任务完成之后才会将输出传递给* F% R2 W( @' Y, p# @8 W& O
    接收任务。如果某个任务失败,其结果将不会传递给它在工作流中的任何后续任8 ^% j& t1 E; I: d0 v
    务。因此,主控进程可以在其他计算节点上重启该任务,同时不用担心会将结果重
    : ~" O4 S: v; m: ?复传递给以前传过的任务。
    # T- Q) |+ G8 r相比多个MapReduce作业串联模型,Dryad模型的优势在于不需要将每个; y; }4 U# E$ H2 L
    MapReduce作业输出的临时结果存放在分布式文件系统中。如果先存储前一个; q. i3 @9 K9 z" w1 b# {
    MapReduce作业的结果,然后再启动新的MapReduce作业,那么,这种开销很难避9 C9 y0 U( P6 y& F$ F' t% P4 Z
    免。4 D; e; b% u! c* ?6 w6 E6 ]
    13.3.3 Google Pregel( c( h1 ]3 B( S# u
    Google Pregel用于图模型迭代计算,图中的每个节点对应一个任务,每个图节点8 T: k9 R5 Y( A1 v) H" x. ^
    会产生输出消息给图中与它关联的后续节点,而每个节点会对从其他节点传入的输
    $ {# J6 ?/ J3 z! \9 u+ o" L1 `入消息进行处理。
    ; }) v! T$ ^/ V9 i) @Pregel中将计算组织成“超步”(superstep)。在每个超步中,每个节点在上一步
    3 C' a+ y, d% f% a4 T9 l  N# m收到的所有消息将被处理,并且将处理完后的结果传递给后续节点。. O) t+ r( p2 o7 s) }6 x' `; ]
    Pregel采用了BSP(Bulk Sychronous Parallel,整体同步并行计算)模型。每个“超0 N5 h8 L; I1 x$ H
    步”分为三个步骤:每个节点首先执行本地计算,接着将本地计算的结果发送给图中
    . H& o, e3 v( G. o' ~& J; ]' M相邻的节点,最后执行一次栅栏同步,等待所有节点的前两步操作结束。Pregel模型: ~4 i/ R6 \- k
    会在每个超步做一次迭代运算,当某次迭代生成的结果没有比上一次更好,说明结+ z# E- i- _6 V6 [9 T+ F: @  E, X
    果已经收敛,可以终止迭代。  Z4 b. C7 |) j. u: n# ?
    图 13-4 Pregel BSP计算模型+ ?4 }! E8 e8 Y% g
    假设有一个带边权重的图,我们的目标是对图中的每个节点计算到其他任一节
    ) L2 k( \" j0 c0 I* d  E点的最短路径长度。一开始,每个图节点a都保存了诸如(b,w)对的集合,这表示a  p/ r5 Z" g& j  n
    到b的边权重为w。
    ' D2 I$ A' N; w0 Q  k6 B: L. L(1)超步8 B: p8 v. o% o! y* ^8 X
    每个节点会将(a,b,w)传递给图中与它关联的后续节点。当节点c收到三元组
    6 L/ L& i" ~8 \1 b(a,b,w)时,它会重新计算c到b的最短距离,如果w+v<u(假设当前已知的c到a的  G0 p) F5 B: D/ h
    最短距离为v,c到b的最短距离为u),那么,更新c到b的最短距离为w+v。最后,消
    3 o: R+ w+ N9 A# p0 f" W息(c,b,w+v)会传递给后续节点。
    * l" h! O- |" r3 i" r3 ^(2)终止条件5 o+ H: J& M9 @
    当所有节点在执行某个超步时都没有更新到其他节点的最短距离时,说明已经/ c; D) M* S+ N8 v- n* }# E! b
    计算出想要的结果,整个迭代过程可以结束。
    ; N3 v9 |" Q5 F' u2 u& C' f3 MPregel通过检查点(checkpoint)的方式进行容错处理。它在每执行完一个超步之
    / r" T0 \  Y# e( k; ^后会记录整个计算的现场,即记录检查点情况。检查点中记录了这一轮迭代中每个
    7 v) u2 z$ X: S% \( N任务的全部状态信息,一旦后续某个计算节点失效,Pregel将从最近的检查点重启整! u4 {5 x; U+ x# z9 |
    个超步。尽管上述的容错策略会重做很多并未失效的任务,但是实现简单。考虑到
    - \/ o% q. V$ y, Y) M服务器故障的概率不高,这种方法在大多数时候还是令人满意的。$ T% Z4 n9 b- q6 T; \
    1 P8 o, }5 {8 t, U
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|Archiver|手机版|小黑屋|Java自学网

    GMT+8, 2024-5-6 08:25 , Processed in 0.167580 second(s), 35 queries .

    Powered by Javazx

    Copyright © 2012-2022, Javazx Cloud.

    快速回复 返回顶部 返回列表