java自学网VIP

Java自学网

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 2511|回复: 0

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

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

    [LV.Master]出神入化

    2096

    主题

    3754

    帖子

    6万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    66788

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

    发表于 2017-3-20 19:37:40 | 显示全部楼层 |阅读模式
    13.3 MapReduce扩展1 M( y# M" t4 O
    MapReduce框架有效地解决了海量数据的离线批处理问题,在各大互联网公司得
    ) P: B! E8 q7 A4 ?  [: f# [, o' X到广泛的应用。事实已经证明了MapReduce巨大的影响力,以至于引发了一系列的扩4 X3 r. Q" b  L$ m1 O& H
    展和改进。这些扩展包括:1 F! V0 V$ |) V2 v/ @$ D, e
    ●Google Tenzing:基于MapReduce模型构建SQL执行引擎,使得数据分析人员可
    $ r- S7 t: r! W2 g以直接通过SQL语言处理大数据。' @/ H7 J7 g% A' t4 G
    ●Microsoft Dryad:将MapReduce模型从一个简单的两步工作流扩展为任何函数3 q9 c2 \  A- U
    集的组合,并通过一个有向无环图来表示函数之间的工作流。
    $ W' _* t2 j' C( Q●Google Pregel:用于图模型迭代计算,这种场景下Pregel的性能远远好于0 V5 H: u. ?0 x8 [, b  a
    MapReduce。
    2 n, R+ }) X3 t2 J) T: A13.3.1 Google Tenzing
    6 s( ]" O( p2 w) z6 `) mGoogle Tenzing是一个构建在MapReduce之上的SQL执行引擎,支持SQL查询且能( ]* P0 T. N5 k$ O
    够扩展到成千上万台机器,极大地方便了数据分析人员。; e2 n) Q9 N3 x) t8 b- h" L& `
    1.整体架构: S" V9 D5 w# s* q3 P4 b  [
    Tenzing系统有四个主要组件:分布式Worker池、查询服务器、客户端接口和元# s3 a1 G" u; W3 f+ o
    数据服务器,如图13-2所示。
    : G/ P; C8 ~+ d$ c' S, U图 13-2 Tenzing整体架构  P) X6 e5 q: Z% P
    ●查询服务器(Query Server):作为连接客户端和worker池的中间桥梁而存在。
    . E1 ]# [* ?5 `查询服务器会解析客户端发送的查询请求,进行SQL优化,然后将执行计划发送给分  ~1 X! i# [, \
    布式Worker池执行。Tenzing支持基于规则(rule-based optimizer)以及基于开销
    ) V8 |3 ~0 o6 d(cost-based optimizer)两种优化模式。
    + o! ^3 g5 W* Y: A2 |! ^●分布式Worker池:作为执行系统,它会根据查询服务器生成的执行计划运行
    : R9 q( p8 Q- f7 ~' s' gMapReduce任务。为了降低查询延时,Tenzing不是每次都重新生成新进程,而是让进
    & o) g9 e/ M# t& A8 [% n( S, L程一直处于运行状态。Worker池包含master和worker两种节点,其中,master对应
    7 }# A4 x: L! Z# [MapReduce框架中的master进程,worker对应MapReduce框架中的map和reduce进程。
    + _. J' @# P9 j; {; v+ r另外,还有一个称为master监听者(master watcher)的守护进程,查询服务器通过6 ]2 Q: \+ s0 w2 Z$ V
    master监听者获取master信息。
    : [) W5 g% s" U9 j: i: U7 c  b7 R●元数据服务器(Metadata Server):存储和获取表格schema、访问控制列表
    ( U+ P$ s* c# H+ B  r$ k(Access Control List,ACL)等全局元数据。元数据服务器使用Bigtable作为持久化的
    , N3 t# C! m7 j/ S2 |% u后台存储。
    ! X# @# J3 M3 |8 V$ H0 [/ k●客户端接口:Tenzing提供三类客户端接口,包括API、命令行客户端(CLI)以
    + \# w. m3 n# z  u. x- r及Web UI。
    4 [( X! D1 n9 ^●存储(Storage):分布式worker池中的master和worker进程执行MapReduce任务6 c8 e$ `, [) \  p  \, G/ A# E
    时需要读写存储服务。另外,查询服务器会从存储服务获取执行结果。( U0 D5 ^; G7 ]/ g' P
    2.查询流程6 |: J) I; R8 G# |! `
    1)用户通过Web UI、CLI或者API向查询服务器提交查询。+ Y& L  ]7 g( V- G
    2)查询服务器将查询请求解析为一个中间语法树。
    , l& P) Z2 k% a6 F: ^. O3)查询服务器从元数据服务器获取相应的元数据,然后创建一个更加完整的中
      W2 ^; e+ ^/ t- `# T( F, Q间格式。
    . ~/ L$ S  v2 c, z8 s4)优化器扫描该中间格式进行各种优化,生成物理查询计划。
    ) w# L/ \' `( ]5)优化后的物理查询计划由一个或多个MapReduce作业组成。对于每个
    ; N$ E8 P$ @4 H! O* mMapReduce作业,查询服务器通过master监听者找到一个可用的master,master将该作业
      }3 I, p  ^1 b8 D. i, g划分为多个任务。
    ; y' M, U4 ^& j2 V+ ^# W0 W6)空闲的worker从master拉取已就绪的任务。Reduce进程会将它们的结果写入5 G" E5 u! p3 U' H2 v( \! `9 ?
    到一个中间存储区域中。. W4 S) q1 N6 j
    7)查询服务器监控这些中间存储区域,收集中间结果,并流失地返回给客户
    ; D, Y( j, _4 z端。1 v2 W, f8 V: p" K$ o0 x
    3.SQL运算符映射到MapReduce* I! W9 u; A  o! A  r
    查询服务器负责将用户的SQL操作转化为MapReduce作业,本节介绍各个SQL物% X" N+ U0 }8 y9 I- R6 r
    理运算符对应的MapReduce实现。
    $ V: s2 w7 i  O, @, c3 k(1)选择和投影0 P" u- t/ y) F1 W4 Q
    选择运算符σ C (R)的一种MapReduce实现如下。$ n. X& W2 D# A5 w7 @% x% ^
    Map函数:对R中的每个元素t,检测它是否满足条件C。如果满足,则产生一" U+ [1 t. a# q3 C, q" x
    个“键-值”对(t,t)。也就是说,键和值都是t。1 Z- j9 Y& i" |0 E/ {  i" q
    Reduce函数:Reduce的作用类似于恒等式,它仅仅将每个“键-值”对传递到输出9 o. r. U  e" P% c! n  M4 A# d
    部分。
    8 I+ f- M+ I$ d* ]: V6 F  Z( g投影运算的处理和选择运算类似,不同的是,投影运算可能会产生多个相同的0 R5 E; |: t% U, B# X; }, b
    元组,因此Reduce函数必须要剔除冗余元组。可以采用如下方式实现投影运算符
    " N( N6 v# s+ |* Kπ S (R)。1 _* r1 c- U0 S5 b( D5 b, ]/ G
    Map函数:对R中的每个元组t,通过剔除属性不在S中的字段得到元组t',输出一
    , q; ^) T2 W, ~个“键-值”对(t',t')。2 t4 h  d# d9 A
    Reduce函数:对任意Map任务产生的每个键t',将存在一个或多个“键-值”对. t/ N% ]6 t3 k" Q, J3 x
    (t',t'),Reduce函数将(t',[t',t',…,t'])转换为(t',t'),以保证对该键t'只产
    & l2 F- y* t7 |3 X6 Q生一个(t',t')对。
    $ n, X1 w. Q. f* H; R) CTenzing执行时会做一些优化,例如选择运算符下移到存储层;如果存储层支持
    ; B, l2 h2 {4 b6 K( J列式存储,Tenzing只扫描那些查询执行必须的列。& x, P6 D* @1 ]; K2 B9 R9 }
    (2)分组和聚合
      ~9 k% g* j" {9 i. }( f9 X6 w假定对关系R(A,B,C)按照字段A分组,并计算每个分组中所有元组的字段B
    + ?& \, M2 V# g6 A% s; H/ z之和。可以采用如下方式实现γ A,SUM(B) (R)。+ J  F/ |: Z+ ]4 ^) J& q
    Map函数:对于每个元组,生成“键-值”对(a,b)。
    / s; t. j+ a- C/ k# l/ z# \Reduce函数:每个键a代表一个分组,对与键a相关的字段B的值的列表[b 1 ,b 2 ,
    7 L( l# z. r! u; O…,b n ]执行SUM操作,输出结果为(a,SUM(b 1 ,b 2 ,…,b n ))。
    % r+ J. i( f: Q1 pTenzing支持基于哈希的聚合操作,首先,放松底层MapReduce框架的限制,
    2 z! Y9 _% o' b! j2 U+ W# x7 Sshuffle时保证所有键相同的“键-值”对属于同一个Reduce任务,但是并不要求按照键, ~, x  v4 E- _7 T* \
    有序排列。其次,Reduce函数采用基于哈希的方法对数据分组并计算聚合结果。0 R* b# @9 S7 Y: G0 H( J
    (3)多表连接
    ; E. u* F$ Q6 ]( k& {大表连接是分布式数据库的难题,MapReduce模型能够有效地解决这一类问题。0 e. \- s& C& E* L; h2 X
    常见的连接算法包括Sort Merge Join、Hash Join以及Nested Loop Join。
    & R& d7 `5 N+ o: p& Q$ H0 c假设需要将R(A,B)和S(B,C)进行自然连接运算,即寻找字段B相同的元
    / v3 g' D. u, w2 E" _0 b* ]组。可以通过Sort Merge Join实现如下:
    * O% K, G; x2 iMap函数:对于R中的每个元组(a,b),生成“键-值”对(b,(R,a)),对S中的& r+ M9 |, a; R
    每个元组(b,c),生成“键-值”对(b,(S,c))。
    7 p1 W: M7 W# m* X$ W  t" R- lReduce函数:每个键值b会与一系列对相关联,这些对要么来自(R,a),要么来
    " ?7 ]) k& [: `9 R自(S,c)。键b对应的输出结果是(b,[(a 1 ,b,c 1 ),(a 2 ,b,c 2 ),…]),也就是说,与b
    1 b) c3 @8 u& P2 `相关联的元组列表由来自R和S中的具有共同b值的元组组合而成。
    - }5 J' e/ F7 X& H- C: {) y' {' p如果两张表格都很大,且二者的大小比较接近,Join字段也没有索引,Sort% G0 T, h" B% `- X
    Merge Join往往比较高效。然而,如果一张表格相比另外一张表格要大很多,Hash1 Z$ g& p  o. k+ f  c$ a) w
    Join往往更加合适。: u9 p. T( L' x
    假设R(A,B)比S(B,C)大很多,可以通过Hash Join实现自然连接。Tenzing中
    6 P: m- n& F2 J4 }1 V) H一次Hash Join需要执行三个MapReduce任务。
    2 W) x$ l5 g; G; OMR1:将R(A,B)按照字段B划分为N个哈希分区,记为R 1 ,R 2 ,…,R N ;
    ! h1 \, @6 T8 W: d% N! B4 s% p, sMR2:将S(B,C)按照字段B划分为N个哈希分区,记为S 1 ,S 2 ,…,S n ;( z& B5 Z& a# j; d/ M" t
    MR3:每个哈希分区<R i ,S i >对应一个Map任务,这个Map任务会将S i 加载到内' w' O( `' }0 j# o, B; l; G
    存中。对于R i 中的每个元组(a,b),生成(b,[(a,b,c 1 ),(a,b,c 2 ),…]),其中,. c  u4 N5 o% {
    (b,[c 1 ,c 2 ,…])是S i 中存储的元组。Reduce的作用类似于恒等式,输出每个传入4 l4 Y# w  [: _" N$ [$ H$ m/ [8 c
    的“键-值”对。
    2 A0 w& b5 p/ p; \/ y6 z7 ?Sort Merge Join和Hash Join适用于两张表格都不能够存放到内存中,且连接列没
    6 Q$ T/ C1 W% g8 C有索引的场景。如果S(B,C)在B列有索引,可以通过Remote Lookup Join实现自然
    4 Q' l- I) U* x! `' ]9 \0 ]连接,如下:: N" Q& Q3 O5 G4 V/ C
    Map函数:对于R中的每个元组(a,b),通过索引查询S(B,C)中所有列值为b6 v# e5 l: F6 t9 F
    的元组,生成(b,[(a,b,c 1 ),(a,b,c 2 ),…])。, E+ C2 l+ t7 G9 M& r
    Reduce函数:Reduce的作用类似于恒等式,输出每个传入的“键-值”对。
    1 t! O+ ^& e' p, _$ P; A$ U如果S(B,C)能够存放到内存中,那么,Map进程在执行map任务的过程中会将$ B  @: G6 j2 S% ]
    S(B,C)的所有元组缓存在本地,进一步优化执行效率。另外,同一个Map进程可2 `1 j4 f( r, |( J; B
    能执行多个map任务,这些map任务共享一份S(B,C)的所有元组缓存。
    " [! v( `5 ^0 A  \' u* ~; m13.3.2 Microsoft Dryad% {0 \& p9 D; w+ R% r
    Microsoft Dryad是微软研究院创建的研究项目,主要用来提供一个分布式并行计* n) N% C8 G. L" w2 t
    算平台。在Dryad平台上,每个Dryad工作流被表示为一个有向无环图。图中的每个
    * o; w: e5 ~: _节点表示一个要执行的程序,节点之间的边表示数据通道中数据的传输方式,其可) X0 [6 M6 b4 F+ j9 y  [5 q
    能是文件、管道、共享内存、网络RPC等。Dryard工作流如图13-3所示。+ q' F4 |/ C* M0 E( U
    图 13-3 Dryad工作流( Q! j; C5 S9 }
    每个节点(vertices)上都有一个处理程序在运行,并且通过数据通道5 @+ y3 N) J) a
    (channels)的方式在它们之间传输数据。类似于Map和Reduce函数,工作流中的9 `2 h% k$ Q6 c) U2 ^: K
    grep、sed、map、reduce、merge等函数可以被很多节点执行,每个节点会被分配一部
    . Y& U. W1 }( i8 o) D$ q( X分输入。Dryad的主控进程(Job Manager)负责将整个工作分割成多个任务,并分发
    3 h$ }* Z8 a* o8 f( V给多个节点执行。每个节点执行完任务后通知主控进程,接着,主控进程会通知后' p- j1 @, T; j( W- W1 O$ `% [$ F
    续节点获取前一个节点的输出结果。等到后续节点的输入数据全部准备好后,才可
    * Z' r3 ~, c  M2 Q& A以继续执行后续任务。
    " M: i5 T; K2 w5 MDryad与MapReduce具有的共同特性就是,只有任务完成之后才会将输出传递给
    ! _: D" k: i, n+ |接收任务。如果某个任务失败,其结果将不会传递给它在工作流中的任何后续任
    & e, @. H7 X! w& |4 J务。因此,主控进程可以在其他计算节点上重启该任务,同时不用担心会将结果重
    " Y! c" A  }( i9 K复传递给以前传过的任务。
    9 _  M* L, H# H0 ^5 N相比多个MapReduce作业串联模型,Dryad模型的优势在于不需要将每个! C, f  Z( p4 L. \# k
    MapReduce作业输出的临时结果存放在分布式文件系统中。如果先存储前一个9 Q+ _4 t' t* |' z: Y0 G" `& t
    MapReduce作业的结果,然后再启动新的MapReduce作业,那么,这种开销很难避" J$ m, r, t' h  _& ]
    免。
    3 d' ^0 s) j+ I  a2 D& s3 H; ]' n13.3.3 Google Pregel
    $ z* q( g6 x3 n2 c0 H1 p* y! gGoogle Pregel用于图模型迭代计算,图中的每个节点对应一个任务,每个图节点' j& |% Y$ `, p! O( y( ~
    会产生输出消息给图中与它关联的后续节点,而每个节点会对从其他节点传入的输. x5 M$ Q5 a, ~) s) h
    入消息进行处理。7 l. ]3 ^. a0 D+ S
    Pregel中将计算组织成“超步”(superstep)。在每个超步中,每个节点在上一步
    + ~- h" |+ }+ H+ `9 A5 }0 ~+ B, c收到的所有消息将被处理,并且将处理完后的结果传递给后续节点。; G, s  u* [8 a* q
    Pregel采用了BSP(Bulk Sychronous Parallel,整体同步并行计算)模型。每个“超7 I7 o) u2 I7 m
    步”分为三个步骤:每个节点首先执行本地计算,接着将本地计算的结果发送给图中
    0 F/ e! E3 a* Q$ i( @相邻的节点,最后执行一次栅栏同步,等待所有节点的前两步操作结束。Pregel模型7 c( }+ Q( Y4 L; ?$ V
    会在每个超步做一次迭代运算,当某次迭代生成的结果没有比上一次更好,说明结8 j' r7 B* b$ P) N' B9 D
    果已经收敛,可以终止迭代。+ e/ a5 g7 O4 ~3 X* N& @+ ~$ q
    图 13-4 Pregel BSP计算模型% q& ]$ V- T9 F4 ^: g2 z! Q
    假设有一个带边权重的图,我们的目标是对图中的每个节点计算到其他任一节
    - s: R% C1 f( u! @0 g/ b点的最短路径长度。一开始,每个图节点a都保存了诸如(b,w)对的集合,这表示a; W' x! f1 \5 G: A" ?1 y8 Q7 x* \
    到b的边权重为w。/ z+ U: U( L9 U* C; K0 N$ P' ?
    (1)超步) H1 \' Q1 [; G, Y  Y7 y; Z
    每个节点会将(a,b,w)传递给图中与它关联的后续节点。当节点c收到三元组
    0 w, D& ^7 X- F9 Q. N$ h( h' c7 g' Q(a,b,w)时,它会重新计算c到b的最短距离,如果w+v<u(假设当前已知的c到a的
    + ]4 K7 T, |7 ^最短距离为v,c到b的最短距离为u),那么,更新c到b的最短距离为w+v。最后,消
    , a  ~2 g+ [( p/ D9 x8 q息(c,b,w+v)会传递给后续节点。
    8 q( u) u3 ^! H- M) w) N(2)终止条件
    # X2 W) ?- a! t5 ?/ D当所有节点在执行某个超步时都没有更新到其他节点的最短距离时,说明已经
    8 M8 \( g/ q1 S! v. ]" ?( o计算出想要的结果,整个迭代过程可以结束。% @% n  m/ x3 o9 M* v1 M* V
    Pregel通过检查点(checkpoint)的方式进行容错处理。它在每执行完一个超步之
    ' _  v/ T: t- Y+ J; f4 e1 e后会记录整个计算的现场,即记录检查点情况。检查点中记录了这一轮迭代中每个9 n& F; z0 r- m  {
    任务的全部状态信息,一旦后续某个计算节点失效,Pregel将从最近的检查点重启整
    4 d. A0 T8 J( U0 v, p9 `/ D* C5 E4 |7 U个超步。尽管上述的容错策略会重做很多并未失效的任务,但是实现简单。考虑到% H5 s/ Z& @( M: ~8 a* }
    服务器故障的概率不高,这种方法在大多数时候还是令人满意的。
    3 I- g8 {8 @3 Y( i( F9 A
    " G  C& X# X0 r" X
    回复

    使用道具 举报

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

    本版积分规则

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

    GMT+8, 2025-4-1 14:19 , Processed in 0.208099 second(s), 33 queries .

    Powered by Javazx

    Copyright © 2012-2022, Javazx Cloud.

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