java自学网VIP

Java自学网

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 2465|回复: 0

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

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

    [LV.Master]出神入化

    2062

    主题

    3720

    帖子

    6万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    66592

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

    发表于 2017-3-20 19:37:40 | 显示全部楼层 |阅读模式
    13.3 MapReduce扩展3 y* r3 U& Y9 i2 @& i: O
    MapReduce框架有效地解决了海量数据的离线批处理问题,在各大互联网公司得
    ; Y+ L9 n: R; p6 E  L1 _到广泛的应用。事实已经证明了MapReduce巨大的影响力,以至于引发了一系列的扩  s6 U. c  X, ~3 G9 ]. n
    展和改进。这些扩展包括:' L8 h# f+ J$ ^" x  o+ V
    ●Google Tenzing:基于MapReduce模型构建SQL执行引擎,使得数据分析人员可
    % @- i$ j7 ^& [4 I2 {6 T% O* w- y以直接通过SQL语言处理大数据。, `7 Z* M  P; S, W+ D6 a" j
    ●Microsoft Dryad:将MapReduce模型从一个简单的两步工作流扩展为任何函数
    & y# M6 K' X  R' c+ v集的组合,并通过一个有向无环图来表示函数之间的工作流。0 b1 C- g. C6 u+ u; ^8 `, \
    ●Google Pregel:用于图模型迭代计算,这种场景下Pregel的性能远远好于8 w0 ?' e0 w' L* ]) ^' g+ h- G
    MapReduce。
    8 F3 @/ ?: p% T) c/ ~13.3.1 Google Tenzing5 z2 L$ x. _/ _1 T' }. E( S
    Google Tenzing是一个构建在MapReduce之上的SQL执行引擎,支持SQL查询且能( y% l) S# v9 C: q* V% Z
    够扩展到成千上万台机器,极大地方便了数据分析人员。
    ( ~! a% C4 Z! ^5 t+ s0 u9 j1.整体架构- y! `  ?  M0 u8 ^0 m! _
    Tenzing系统有四个主要组件:分布式Worker池、查询服务器、客户端接口和元+ k4 w  A# }) p, Z. `1 t
    数据服务器,如图13-2所示。
    % _( S% {* p3 C% J$ u图 13-2 Tenzing整体架构
    + Y9 I8 H7 `0 y& ]; {8 L●查询服务器(Query Server):作为连接客户端和worker池的中间桥梁而存在。
    : \0 M% A: Z& q  i! v查询服务器会解析客户端发送的查询请求,进行SQL优化,然后将执行计划发送给分6 z3 c4 B- V% P5 Z' ?3 c
    布式Worker池执行。Tenzing支持基于规则(rule-based optimizer)以及基于开销
    7 x+ J8 J! t/ v) B(cost-based optimizer)两种优化模式。
    % Z0 @& J3 k9 _7 G  K" @●分布式Worker池:作为执行系统,它会根据查询服务器生成的执行计划运行5 C6 R& k* n3 Z+ T6 c
    MapReduce任务。为了降低查询延时,Tenzing不是每次都重新生成新进程,而是让进7 i" d6 |$ r( M5 b
    程一直处于运行状态。Worker池包含master和worker两种节点,其中,master对应
    * R% c3 M5 K5 w$ bMapReduce框架中的master进程,worker对应MapReduce框架中的map和reduce进程。% _# c/ H, q# B$ f8 C% B# m
    另外,还有一个称为master监听者(master watcher)的守护进程,查询服务器通过5 g" a/ t' w9 ^4 E) X: P
    master监听者获取master信息。
    ! _; L0 n; a" b5 e$ A" s●元数据服务器(Metadata Server):存储和获取表格schema、访问控制列表4 z' W1 P' g; T+ l) b
    (Access Control List,ACL)等全局元数据。元数据服务器使用Bigtable作为持久化的4 R& c. `! ]6 x" r& T0 A5 |" a
    后台存储。5 K! w4 `+ A" S- m: y9 p, h8 \
    ●客户端接口:Tenzing提供三类客户端接口,包括API、命令行客户端(CLI)以
    ' T5 o$ R2 k/ ~, A0 N及Web UI。
    - A8 M  A7 O9 F( w. I●存储(Storage):分布式worker池中的master和worker进程执行MapReduce任务
    $ i3 j7 i3 A7 d/ }1 X- i时需要读写存储服务。另外,查询服务器会从存储服务获取执行结果。
    3 z: L% {6 q- g* j6 u2.查询流程$ y! i* l4 _# R: L1 \2 T0 d7 w
    1)用户通过Web UI、CLI或者API向查询服务器提交查询。
    0 J! M# z6 J. R0 [& c2)查询服务器将查询请求解析为一个中间语法树。' h5 Z$ p  a- a( c4 u
    3)查询服务器从元数据服务器获取相应的元数据,然后创建一个更加完整的中+ [+ N& X" \, k: }% s8 m
    间格式。) e( V* Z  q4 b* r; n0 d4 d+ u
    4)优化器扫描该中间格式进行各种优化,生成物理查询计划。
    5 Q2 c3 Y/ Y4 _( T0 ^5)优化后的物理查询计划由一个或多个MapReduce作业组成。对于每个
    $ P$ H0 |, w# n( m  z. a9 JMapReduce作业,查询服务器通过master监听者找到一个可用的master,master将该作业! S/ ^+ P* Q$ x. ]8 e5 U
    划分为多个任务。
    , E+ [9 j" ?; \$ {& s- B6 o6)空闲的worker从master拉取已就绪的任务。Reduce进程会将它们的结果写入( e4 [0 i8 Q  _; C9 L
    到一个中间存储区域中。3 P/ i; G4 R5 U4 _+ G5 [
    7)查询服务器监控这些中间存储区域,收集中间结果,并流失地返回给客户
    . \: u2 K: C! Q端。. F1 R0 z2 b/ h0 \' _4 L
    3.SQL运算符映射到MapReduce' A7 c5 {; t* N9 ?  b/ X; i
    查询服务器负责将用户的SQL操作转化为MapReduce作业,本节介绍各个SQL物% K" r  m3 \3 R+ S- @7 `6 ~
    理运算符对应的MapReduce实现。  K7 w1 i4 q8 I7 {6 J2 u" u
    (1)选择和投影6 ~' Z' [( l5 }% f: T
    选择运算符σ C (R)的一种MapReduce实现如下。3 ], X9 }+ r5 J& ?: D, r* ^
    Map函数:对R中的每个元素t,检测它是否满足条件C。如果满足,则产生一+ s* c; E* Q/ u+ _% N1 d# J6 C
    个“键-值”对(t,t)。也就是说,键和值都是t。
    ' X: {. Y: A. c) P2 F9 VReduce函数:Reduce的作用类似于恒等式,它仅仅将每个“键-值”对传递到输出
    & j( j" h# d' V2 n+ @# z部分。) W0 _0 V1 i' Y5 m! r* I% K/ L5 ?
    投影运算的处理和选择运算类似,不同的是,投影运算可能会产生多个相同的
    * v* q  m9 P7 F8 |9 k# m元组,因此Reduce函数必须要剔除冗余元组。可以采用如下方式实现投影运算符
    9 U* j$ |! k' ?7 {0 Jπ S (R)。/ x, }/ |3 z! ]) P9 h  H
    Map函数:对R中的每个元组t,通过剔除属性不在S中的字段得到元组t',输出一
    7 z- b: Q  b9 A8 k7 R  s个“键-值”对(t',t')。
    ' u" a! ^& @' [2 ]+ wReduce函数:对任意Map任务产生的每个键t',将存在一个或多个“键-值”对
    2 S1 K( n$ d& Q7 k$ Q( x(t',t'),Reduce函数将(t',[t',t',…,t'])转换为(t',t'),以保证对该键t'只产
    6 V- T8 U: F* ]生一个(t',t')对。
    2 Y5 h, ~/ |6 B9 TTenzing执行时会做一些优化,例如选择运算符下移到存储层;如果存储层支持  f1 l) c: A  O$ `( Z4 x8 l
    列式存储,Tenzing只扫描那些查询执行必须的列。  @5 `, D7 _" u* G& y6 s( ~: D/ X
    (2)分组和聚合
    $ {/ Y& y, k- ]- l& `+ D$ V假定对关系R(A,B,C)按照字段A分组,并计算每个分组中所有元组的字段B# e( U7 I5 H* T2 c
    之和。可以采用如下方式实现γ A,SUM(B) (R)。
    ' M; G/ d, ]7 o. @  I2 GMap函数:对于每个元组,生成“键-值”对(a,b)。4 x! x8 N" M1 @+ O  |4 j4 M# K$ h
    Reduce函数:每个键a代表一个分组,对与键a相关的字段B的值的列表[b 1 ,b 2 ,
    - g7 q9 a) b* }5 ^6 ^…,b n ]执行SUM操作,输出结果为(a,SUM(b 1 ,b 2 ,…,b n ))。
    - \2 M0 H, `) D6 \7 LTenzing支持基于哈希的聚合操作,首先,放松底层MapReduce框架的限制,& r0 J) ]) f7 I6 b. D
    shuffle时保证所有键相同的“键-值”对属于同一个Reduce任务,但是并不要求按照键5 Z+ h# R) N( J+ ]8 ^! w+ |
    有序排列。其次,Reduce函数采用基于哈希的方法对数据分组并计算聚合结果。1 ?- W1 d8 {) b8 w$ N  r, q
    (3)多表连接
    3 M. ^: p) s" ]1 p0 l大表连接是分布式数据库的难题,MapReduce模型能够有效地解决这一类问题。/ d$ r. F" N: I) }9 k6 G/ V
    常见的连接算法包括Sort Merge Join、Hash Join以及Nested Loop Join。
    . s4 X: K0 @$ {& ^: z) k4 Z假设需要将R(A,B)和S(B,C)进行自然连接运算,即寻找字段B相同的元1 G% m/ l% p4 a! y3 Y7 I6 k1 h% g9 C$ O
    组。可以通过Sort Merge Join实现如下:; l3 O- ~3 }4 v
    Map函数:对于R中的每个元组(a,b),生成“键-值”对(b,(R,a)),对S中的
    ) z- [/ O- Z7 g# q# r+ X$ X" F每个元组(b,c),生成“键-值”对(b,(S,c))。* b7 {" n$ c$ {6 }
    Reduce函数:每个键值b会与一系列对相关联,这些对要么来自(R,a),要么来# j2 G, e$ k" t1 k: S1 s
    自(S,c)。键b对应的输出结果是(b,[(a 1 ,b,c 1 ),(a 2 ,b,c 2 ),…]),也就是说,与b
    0 e. Z. w, G9 h, F相关联的元组列表由来自R和S中的具有共同b值的元组组合而成。
    . t& I7 V- z1 ~, n# M4 ?如果两张表格都很大,且二者的大小比较接近,Join字段也没有索引,Sort6 n# @; s; G; U; h2 d8 h0 D
    Merge Join往往比较高效。然而,如果一张表格相比另外一张表格要大很多,Hash
    0 \" ?, ^3 ^% F1 D' lJoin往往更加合适。
    + u3 j% q! D6 A) Z" w9 p! Z" B) m假设R(A,B)比S(B,C)大很多,可以通过Hash Join实现自然连接。Tenzing中! X9 k0 U; \1 ]" D! u/ i) A2 R
    一次Hash Join需要执行三个MapReduce任务。5 \4 ^/ T( B5 y
    MR1:将R(A,B)按照字段B划分为N个哈希分区,记为R 1 ,R 2 ,…,R N ;/ u" L4 l* b, ?, J0 ~5 s$ [0 `7 W# f
    MR2:将S(B,C)按照字段B划分为N个哈希分区,记为S 1 ,S 2 ,…,S n ;& j  X* z2 v$ s! D, i1 T& R
    MR3:每个哈希分区<R i ,S i >对应一个Map任务,这个Map任务会将S i 加载到内
    7 g3 ]7 k- `8 C3 {" _7 {8 G存中。对于R i 中的每个元组(a,b),生成(b,[(a,b,c 1 ),(a,b,c 2 ),…]),其中,
      P% s: u0 c6 q9 |  K7 O) y7 q/ s& b(b,[c 1 ,c 2 ,…])是S i 中存储的元组。Reduce的作用类似于恒等式,输出每个传入9 L- ?1 V& ?' H# d' @. e
    的“键-值”对。
    2 @$ b' L- }* Q  }4 d$ cSort Merge Join和Hash Join适用于两张表格都不能够存放到内存中,且连接列没1 O9 L" z' f: D  k
    有索引的场景。如果S(B,C)在B列有索引,可以通过Remote Lookup Join实现自然
    % B1 v$ K$ O' n! \: K& x连接,如下:7 r# ?7 x/ {% P- |2 c% h3 v
    Map函数:对于R中的每个元组(a,b),通过索引查询S(B,C)中所有列值为b/ v% y  W) W6 ]
    的元组,生成(b,[(a,b,c 1 ),(a,b,c 2 ),…])。# k/ j  N) h" i* B: F$ M
    Reduce函数:Reduce的作用类似于恒等式,输出每个传入的“键-值”对。
    : j: H8 F2 e& A  S2 E6 U& C如果S(B,C)能够存放到内存中,那么,Map进程在执行map任务的过程中会将8 i% k* S4 m" e% a# _
    S(B,C)的所有元组缓存在本地,进一步优化执行效率。另外,同一个Map进程可
    / J7 y3 [2 i7 g! R) ]& H# D9 U能执行多个map任务,这些map任务共享一份S(B,C)的所有元组缓存。! i: a& K% b! x+ }
    13.3.2 Microsoft Dryad% ]5 }% Z# o4 M+ y& u) [
    Microsoft Dryad是微软研究院创建的研究项目,主要用来提供一个分布式并行计  n" R. K0 t! \+ D' j& L
    算平台。在Dryad平台上,每个Dryad工作流被表示为一个有向无环图。图中的每个
    - d3 [- ^& y9 f节点表示一个要执行的程序,节点之间的边表示数据通道中数据的传输方式,其可
    1 @- Y( I- D. L5 i! S5 d能是文件、管道、共享内存、网络RPC等。Dryard工作流如图13-3所示。( o3 W% ~+ e) N& ^3 U. f
    图 13-3 Dryad工作流
    5 ^8 D7 \& B5 Q9 z; F每个节点(vertices)上都有一个处理程序在运行,并且通过数据通道
    9 s' `, V# j  w1 r. }(channels)的方式在它们之间传输数据。类似于Map和Reduce函数,工作流中的0 V9 x4 S' `4 U( [3 L
    grep、sed、map、reduce、merge等函数可以被很多节点执行,每个节点会被分配一部
    0 O, C3 K6 A1 b. t& _* P分输入。Dryad的主控进程(Job Manager)负责将整个工作分割成多个任务,并分发3 c( r7 R. z, T( m$ `
    给多个节点执行。每个节点执行完任务后通知主控进程,接着,主控进程会通知后
    & E: Z2 i' o7 w0 a* b: g8 I续节点获取前一个节点的输出结果。等到后续节点的输入数据全部准备好后,才可
    2 p1 e* D) _* i+ U1 C以继续执行后续任务。
    5 t6 S% r2 T; f5 UDryad与MapReduce具有的共同特性就是,只有任务完成之后才会将输出传递给
    ' F  R) k4 G% w* V4 u接收任务。如果某个任务失败,其结果将不会传递给它在工作流中的任何后续任! E# h. b5 z# |+ ^2 g
    务。因此,主控进程可以在其他计算节点上重启该任务,同时不用担心会将结果重$ [( E8 S8 p/ L. f
    复传递给以前传过的任务。
    - H# `+ N" u+ V& v相比多个MapReduce作业串联模型,Dryad模型的优势在于不需要将每个
    . z( ^5 P' u* NMapReduce作业输出的临时结果存放在分布式文件系统中。如果先存储前一个6 L( [+ Y. _* f& z
    MapReduce作业的结果,然后再启动新的MapReduce作业,那么,这种开销很难避1 m& |' y6 s! w3 p- t
    免。# X  W: p5 }, V+ W  g# @" p& }
    13.3.3 Google Pregel: b# c: q0 l# {  d/ L& X
    Google Pregel用于图模型迭代计算,图中的每个节点对应一个任务,每个图节点* E8 E* a  M" r
    会产生输出消息给图中与它关联的后续节点,而每个节点会对从其他节点传入的输
    " z8 x8 Y  z2 p/ U( q0 I入消息进行处理。% \% @) u% Q! V# |
    Pregel中将计算组织成“超步”(superstep)。在每个超步中,每个节点在上一步
    ( }5 H7 `+ P; ~) F% Z收到的所有消息将被处理,并且将处理完后的结果传递给后续节点。
    5 a" @6 o6 S& h4 T3 S8 _* ^Pregel采用了BSP(Bulk Sychronous Parallel,整体同步并行计算)模型。每个“超
    2 A/ M! C) k- a6 K2 O) G' U& G步”分为三个步骤:每个节点首先执行本地计算,接着将本地计算的结果发送给图中7 a9 t# Z6 ~9 B% |8 l  x" ]" e
    相邻的节点,最后执行一次栅栏同步,等待所有节点的前两步操作结束。Pregel模型
    , P  F7 H* z% G, d% R* b会在每个超步做一次迭代运算,当某次迭代生成的结果没有比上一次更好,说明结
    * y: Y! ]3 a5 r( B7 D果已经收敛,可以终止迭代。
    " ?  z# ?& l: f3 x/ K图 13-4 Pregel BSP计算模型4 S4 g# e, x0 g1 K0 a! `' \
    假设有一个带边权重的图,我们的目标是对图中的每个节点计算到其他任一节- j3 M- Z0 g& ^) @1 }0 z3 k& V
    点的最短路径长度。一开始,每个图节点a都保存了诸如(b,w)对的集合,这表示a
    8 ~! t3 p! j$ X' w8 x到b的边权重为w。: a- \9 S6 B7 _7 h0 M
    (1)超步* h- B. {, f+ Z* [  k8 A# B/ C
    每个节点会将(a,b,w)传递给图中与它关联的后续节点。当节点c收到三元组2 t; i$ `" p% G3 h) [
    (a,b,w)时,它会重新计算c到b的最短距离,如果w+v<u(假设当前已知的c到a的" x, e; [( ~0 W' N
    最短距离为v,c到b的最短距离为u),那么,更新c到b的最短距离为w+v。最后,消7 f4 g: N8 Y* n/ @
    息(c,b,w+v)会传递给后续节点。
    # R% `* h7 i0 M; S% d$ Y2 o4 R(2)终止条件
    8 b( v/ f: j& `# S; c/ o当所有节点在执行某个超步时都没有更新到其他节点的最短距离时,说明已经
    7 `0 M/ ], a. i" d计算出想要的结果,整个迭代过程可以结束。
    $ B- R! k  A8 v3 L; l# @" nPregel通过检查点(checkpoint)的方式进行容错处理。它在每执行完一个超步之
    ; _: ]- ~$ A3 T: ?5 j) g5 e后会记录整个计算的现场,即记录检查点情况。检查点中记录了这一轮迭代中每个, M: p' A$ [. S. O4 O
    任务的全部状态信息,一旦后续某个计算节点失效,Pregel将从最近的检查点重启整
    . {  U0 h4 ?% U( z. t' D" L* y个超步。尽管上述的容错策略会重做很多并未失效的任务,但是实现简单。考虑到
    0 t, s3 a7 w' d7 C! D服务器故障的概率不高,这种方法在大多数时候还是令人满意的。
    ' C+ P2 E6 `" e8 Y2 ]: Y( U
    $ ~/ U# |! m! a: }+ I+ M/ I
    回复

    使用道具 举报

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

    本版积分规则

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

    GMT+8, 2025-2-23 12:58 , Processed in 0.139174 second(s), 30 queries .

    Powered by Javazx

    Copyright © 2012-2022, Javazx Cloud.

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