java自学网VIP

Java自学网

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 2542|回复: 0

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

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

    [LV.Master]出神入化

    2025

    主题

    3683

    帖子

    6万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    66345

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

    发表于 2017-3-20 19:43:57 | 显示全部楼层 |阅读模式
    13.4 流式计算; v1 r3 g) G& }% z
    MapReduce及其扩展解决了离线批处理问题,但是无法保证实时性。对于实时性3 r/ x9 J4 n  r* C5 g
    要求高的场景,可以采用流式计算或者实时分析系统进行处理。
    1 \! d$ [( N5 @& ?流式计算(Stream Processing)解决在线聚合(Online Aggregation)、在线过滤9 `+ ?; i: I& d& ]' C" Q" v, Q2 p& `) S
    (Online Filter)等问题,流式计算同时具有存储系统和计算系统的特点,经常应用
    / ]3 @2 W$ o+ u" S( X5 n在一些类似反作弊、交易异常监控等场景。流式计算的操作算子和时间相关,处理
    4 N# F! j! _* k2 ]0 N+ M最近一段时间窗口内的数据。% _/ p3 M0 A, C' d8 k
    13.4.1 原理! o3 w) I7 E" j
    流式计算强调的是数据流的实时性。MapReduce系统主要解决的是对静态数据的
    . s* z3 t9 {7 \, Q7 |$ j批量处理,当MapReduce作业启动时,已经准备好了输入数据,比如保存在分布式文
    % H  h7 f+ c9 i件系统上。而流式计算系统在启动时,输入数据一般并没有完全到位,而是经由外
    + T5 s) m; r% [部数据流源源不断地流入。另外,流式计算并不像批处理系统那样,重视数据处理
    - l, e' T7 p3 m+ S: t的总吞吐量,而是更加重视对数据处理的延迟。
    9 ^% ]4 O- W, y; ^! mMapReduce及其扩展采用的是一种比较静态的模型,如果用它来做数据流的处( O4 u' [+ L( m& o$ d
    理,首先需要将数据流缓存并分块,然后放入集群计算。如果MapReduce每次处理的( r4 C5 h' }8 ^9 P
    数据量较小,缓存数据流的时间较短,但是,MapReduce框架造成的额外开销将会占9 w- @" w. N& i' R1 O7 {+ P& |
    很大比重;如果MapReduce每次处理的数据量较大,缓存数据流的时间会很长,无法! h2 ?3 `! P2 T1 d
    满足实时性的要求。
    3 f; f6 o6 F1 B流式计算系统架构如图13-5所示。; W- V5 A: }: U3 Y, J
    图 13-5 流式计算系统
    ! X* D8 P0 z, C, G源数据写入到流处理节点,流处理节点内部运行用户自定义的钩子函数对输入- |: v9 p2 a3 m6 J$ \
    流进行处理,处理完后根据一定的规则转发给下游的流处理节点继续处理。另外,
    7 u" d, t2 H% v$ V1 r% n: _' \& i' ?系统中往往还有管理节点,用来管理流处理节点的状态以及节点之间的路由规则。2 N" A$ u# ]$ A- @
    典型钩子函数包括:
    ( y0 ], {# [; @( c  x. ]% N●聚合函数:计算最近一段时间窗口内数据的聚合值,如max、min、avg、sum、, W+ q: |: w4 w$ _9 G$ g
    count等。
      A: f6 o8 Q! ~7 P●过滤函数:过滤最近一段时间窗口内满足某些特性的数据,如过滤1秒钟内重5 ?! S$ n- b  w+ B/ V/ H$ {% M
    复的点击。% d; C* K" N$ n: Z2 U# K
    如果考虑机器故障,问题变得复杂。上游的处理节点出现故障时,下游有两种% \0 T5 i  h8 d" t5 H% O! P* y( m8 F
    选择:第一种选择是等待上游恢复服务,保证数据一致性;第二种选择是继续处
    ( B/ }5 t9 a6 z* ~- j理,优先保证可用性,等到上游恢复后再修复错误的计算结果。
    ( F( n' @7 g9 j5 p流处理节点可以通过主备同步(Master/Slave)的方式容错,即将数据强同步到2 N2 H" N$ o: r4 b) E) d. L" E$ A
    备机,如果主机出现故障,备机自动切换为主机继续提供服务。然而,这种方式的/ ?+ F1 H! `; W% T! m- W
    代价很高,且流式处理系统往往对错误有一定的容忍度,实际应用时经常选择其他
    . c9 Q  `. V* m$ A1 t% h: ~9 ^代价更低的容错方式。2 D6 T; D9 T0 d, }& ~6 _" S
    13.4.2 Yahoo S4* m4 J3 T( }( @, k& c7 O+ r, U7 s
    Yahoo S4最初是Yahoo为了提高搜索广告有效点击率而开发的一个流式处理系
    , }# y4 X* m( d8 C: r统。S4的主要设计目标是提供一种简单的编程接口来处理数据流,使得用户可以定
    / H0 s1 h7 ~0 B1 r制流式计算的操作算子。在容错设计上,S4做得比较简单:一旦S4集群中的某个节
    % u; D" a& }9 _3 y" _点故障,会自动切换到另外一个备用节点,但是原节点的内存状态将丢失。这种方
    $ Z1 t% J; A% o/ @% F" ~+ p# k式虽然可能丢失一部分数据,但是成本较低。考虑到服务器故障的概率很低,能够, A9 D& T# J- i( o) N3 ^
    很好地满足流式计算业务需求。
    ; x" _# z: e. ^+ x* a( ]2 f& G9 ]: TS4中每个流处理节点称为一个处理节点(Processing Node,PN),其主要工作是
    ( F2 |% T9 y7 b3 h- S; d监听事件,当事件到达时调用合适的处理元(Processing Elements,PE)处理事件。如
    6 a4 f  G( [$ e8 ~8 x果PE有输出,则还需调用通信层接口进行事件的分发和输出,如图13-6所示。  Z- k7 u( `' F, ^/ Q
    图 13-6 S4处理节点内部模块3 R! w# S( x2 w% h; g
    事件监听器(Event Listener)负责监听事件并转交给PE容器(Processing Element
    4 [' }, k% y- M, `1 nContainer,PEC),由PEC交给合适的PE处理业务逻辑。配置文件中会配置PE原型
    0 Y8 }( P2 n4 p- F, o& I  k/ G(PE prototype),包括其功能、处理的事件类型(event type)、关心的key以及关心
    * Q4 m1 c: ~3 t9 j4 E& \3 f的key值。每个PE只负责处理自己所关心的事件,也就是说,只有当事件类型、key
    3 H. i2 w/ E- e类型和key值都匹配时,才会交由该PE进行计算处理。PE处理完逻辑后根据其定义的' R9 F  z, P0 {* ]% Q& @" p
    输出方法可以输出事件,事件交由分发器(Dispatcher)与通信层(Communication1 L) |5 v" _; O5 Z3 e$ u  F
    Layer)进行交互并由输出器(Emitter)输出至下一个逻辑节点。输出器通过对事件& e4 A, ~5 h7 Q- b7 v2 W* i
    的类型、key类型、key值计算哈希值,以路由到配置文件中指定的PN。
    $ c+ u' u, n5 x+ K通信层提供集群路由(Routing)、负载均衡(Load Balancing)、故障恢复管理: f2 X; y( r4 m/ q) j
    (Failover Management)、逻辑节点到物理节点的映射(存放在Zookeeper上)。当检
    ; R: Y$ A3 Q8 E+ q- Y3 J测到节点故障时,会切换到备用节点,并自动更新映射关系。通信层隐藏的映射使
    ( i" z: i# E" n$ f) y得PN发送消息时只需要关心逻辑节点而不用关心物理节点。
    $ m& `# ]& J' d13.4.3 Twitter Storm5 U* v* e7 {& X4 w1 g
    Twitter Storm是目前广泛使用的流式计算系统,它创造性地引入了一种记录级容
    ! T& A! u) v0 w0 }, O错的方法。如图13-7所示,Storm系统中包含如下几种角色:1 r+ y7 a/ l& l4 }. M* L! [
    图 13-7 Storm集群的基本组件
    : A) ^- e( D# R) W$ B; {●Nimbus:负责资源分配、任务调度、监控状态。Nimbus和supervisor之间的所
    . Q# v3 i. y/ N: {有协调工作都是通过一个Zookeeper集群来完成。
    5 a5 ]- e! D/ A4 j2 d0 h- i●Supervisor:负责接受nimbus分配的任务,启动和停止属于自己管理的Worker进0 ?: x9 B  G# k# ]1 v; ^- w/ d4 p
    程。7 C0 Q0 E6 L6 @
    ●Worker:运行spout/bolt组件的进程。
    5 m' `1 Q: O7 I- a( @●Spout:产生源数据流的组件。通常情况下spout会从外部数据源中读取数据,
    " w* h$ h6 G4 p+ a* H$ v然后转换为内部的数据格式。Spout是一个主动的角色,其接口中有个nextTuple()函( @; L4 f2 i- T* n& _6 k- I  Y
    数,Storm框架会不停地调用此函数,用户只要在其中生成源数据即可。4 |, E- s8 z  l) X+ i; E
    ●Bolt:接受数据然后执行处理的组件。Bolt可以执行过滤、函数操作、合并、
    * f* \& s  c! Q4 s/ d4 r写数据库等任何操作。Bolt是一个被动的角色,其接口中有个execute(Tuple input)2 J: S! A# [/ Q# C3 f9 H0 w
    函数,在接受到消息后会调用此函数,用户可以在其中执行自己想要的操作。
    1 N" ^- _, _& M& @4 N3 Y3 }每个worker上运行着spolt或者bolt组件,数据从spolt组件流入,经过一系列bolt5 A: U( \) c* d+ V; C! v$ _
    组件的处理直到生成用户想要的结果。0 G0 N; N( s& q& A4 k* i
    Storm中的一个记录称为tuple,用户在spout中生成一个新的源tuple时可以为其指
    3 r; g4 p! r$ q/ I; [. V) B& |定一个消息编号(message id),多个源tuple可以共用一个消息编号,表示这多个源
    6 R) B1 R9 x$ O: Ttuple对用户来说是同一个消息单元。Storm的记录级容错机制会告知用户由Spolt发出0 z7 U" G6 q' u$ F! N
    的每个消息单元是否在指定时间内被完全处理了,从而允许Splot重新发送出错的消
    8 K( Z8 l$ V3 N; z. `息。如图13-8,message1绑定的源tuple1和tuple2经过了bolt1和bolt2的处理后生成两个! z% a$ w2 p( H' K' x
    新的tuple(tuple3和tuple4),并最终都流向bolt3。当这个过程全部完成时,message1
    / }! k- |/ g; L  y$ w; P被完全处理了。Storm中有一个系统级组件,叫做acker。这个acker的任务就是追踪从: e5 a! x8 k% q' _
    spout中流出来的每一个message绑定的若干tuple的处理路径。Bolt1、bolt2、bolt3每次$ O% ~* K# W6 Q
    处理完成一个tuple都会通知acker,acker会判断message1是否被完全处理了,等到完全
    * p5 s9 \1 r9 k' o2 U: y, J处理时通知生成message1的spolt。这里存在两个问题:8 U: K: o6 J2 v; ?" h% ?% U
    图 13-8 Storm数据流示例
    1 J, u( m4 l' l) ]+ I# t1)如何判断message1是否被完全处理了?! N# n& q6 w1 O" }! A! }
    Acker中保存了message1对应的校验值(64位整数),初始为0。每次发送或者接
    $ m; B: y5 Z# Y4 P7 G8 j& P收一个message1绑定的tuple时都会将tuple的编号与校验值进行异或(XOR)运行,如
    . `- W9 |& x" a! M果每个发送出去的tuple都被接受了,那么,message1对应校验值一定是0,从而认为
    8 [. f# g% g+ H2 O% x1 pmessage1被完全处理了。当然,这种方式有一定的误判率,然而考虑到每个tuple的编
    + _5 \1 J' n  @. o" l- K号为64位整数,这种概率很低。0 c3 E, v( y( |" n4 E
    2)系统中有很多acker实例,如何选择将message1发给哪个实例?
      I1 G% m+ [! ?  yStorm中采用一致性哈希算法来计算message1对应的acker实例。如果acker出现性0 R* v4 |+ d7 Q: E
    能瓶颈,只需要往系统中加入新的acker实例即可。# S0 N- P8 Q+ S

    % L8 z( C5 z, R8 z
    3 x9 f* B" z# f: T; a
    回复

    使用道具 举报

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

    本版积分规则

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

    GMT+8, 2024-11-21 20:38 , Processed in 0.091587 second(s), 34 queries .

    Powered by Javazx

    Copyright © 2012-2022, Javazx Cloud.

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