java自学网VIP

Java自学网

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 2339|回复: 0

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

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

    [LV.Master]出神入化

    2025

    主题

    3683

    帖子

    6万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    66105

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

    发表于 2017-3-20 19:43:57 | 显示全部楼层 |阅读模式
    13.4 流式计算
    # H4 B* ~% [) F! K! yMapReduce及其扩展解决了离线批处理问题,但是无法保证实时性。对于实时性
    * c; f2 T9 v6 k* G& r& u( u; N要求高的场景,可以采用流式计算或者实时分析系统进行处理。1 Y* S  C% @0 G- w( m% h
    流式计算(Stream Processing)解决在线聚合(Online Aggregation)、在线过滤
    ! T3 r5 V# _$ y2 @(Online Filter)等问题,流式计算同时具有存储系统和计算系统的特点,经常应用
      w! L- _# t9 |8 N) ~: k在一些类似反作弊、交易异常监控等场景。流式计算的操作算子和时间相关,处理
    1 P2 k' x" @. Y5 O最近一段时间窗口内的数据。' ^. P' h+ B" N) C3 G
    13.4.1 原理
    $ F) t) M4 G6 b) s流式计算强调的是数据流的实时性。MapReduce系统主要解决的是对静态数据的
    ; C3 Q% ]  \( X* ]" T3 b批量处理,当MapReduce作业启动时,已经准备好了输入数据,比如保存在分布式文
    ! M$ ?9 @/ [8 l  M6 h% d/ Q0 D件系统上。而流式计算系统在启动时,输入数据一般并没有完全到位,而是经由外
    . }; \2 ^2 A; t部数据流源源不断地流入。另外,流式计算并不像批处理系统那样,重视数据处理/ B- r) R1 v) P0 P# E' }3 Q3 R
    的总吞吐量,而是更加重视对数据处理的延迟。
    1 b) ?% _9 Q/ F! V0 d8 x1 w1 tMapReduce及其扩展采用的是一种比较静态的模型,如果用它来做数据流的处
    3 Q: A* F: `- z& K理,首先需要将数据流缓存并分块,然后放入集群计算。如果MapReduce每次处理的
    1 n# N( m) M1 d5 n, K* Q6 @# U数据量较小,缓存数据流的时间较短,但是,MapReduce框架造成的额外开销将会占
    9 V; ?1 d6 d$ x7 V很大比重;如果MapReduce每次处理的数据量较大,缓存数据流的时间会很长,无法
    / b& L$ i7 d6 x8 T9 f1 L$ Z满足实时性的要求。
    $ R* r1 z; ]4 @$ [% g( ^流式计算系统架构如图13-5所示。
    + I: c1 K& D8 b5 ?! Y图 13-5 流式计算系统
    + j; }- D( E2 A$ i, E6 P! o7 A+ Y源数据写入到流处理节点,流处理节点内部运行用户自定义的钩子函数对输入1 a/ u* s% @0 N0 l7 Y; L" j; x- K+ E
    流进行处理,处理完后根据一定的规则转发给下游的流处理节点继续处理。另外,
    4 H7 `3 ~8 I9 F系统中往往还有管理节点,用来管理流处理节点的状态以及节点之间的路由规则。# M5 ~6 _5 J6 N% g8 ^
    典型钩子函数包括:
      ]' T' {; Y5 R/ w& o●聚合函数:计算最近一段时间窗口内数据的聚合值,如max、min、avg、sum、
    # ^3 c! R0 q; A1 z# Kcount等。! H# O; I; y1 G. D
    ●过滤函数:过滤最近一段时间窗口内满足某些特性的数据,如过滤1秒钟内重
    , v- N( E; h$ U+ s复的点击。
    % s9 T1 S6 v' e$ a  A) E如果考虑机器故障,问题变得复杂。上游的处理节点出现故障时,下游有两种
    0 V8 y, T" q& c& B( ^选择:第一种选择是等待上游恢复服务,保证数据一致性;第二种选择是继续处
      J8 M2 h8 j- @" E. s理,优先保证可用性,等到上游恢复后再修复错误的计算结果。5 O: X  `6 M: T
    流处理节点可以通过主备同步(Master/Slave)的方式容错,即将数据强同步到1 @0 c$ Z6 w) O* F3 g) f& [
    备机,如果主机出现故障,备机自动切换为主机继续提供服务。然而,这种方式的) k# H, f% \* y5 \. b$ G
    代价很高,且流式处理系统往往对错误有一定的容忍度,实际应用时经常选择其他
    ) c, u- R- Z: Y代价更低的容错方式。* t7 Q0 m& ~: N' M, V# x
    13.4.2 Yahoo S4
    , s/ E1 {% D1 d' J( d0 sYahoo S4最初是Yahoo为了提高搜索广告有效点击率而开发的一个流式处理系' X% A# p- r/ n3 v" h, n# w5 W5 o
    统。S4的主要设计目标是提供一种简单的编程接口来处理数据流,使得用户可以定2 O, t4 C5 ?. Q# Q* Y+ O
    制流式计算的操作算子。在容错设计上,S4做得比较简单:一旦S4集群中的某个节1 @2 y7 n9 a, M* ]4 r
    点故障,会自动切换到另外一个备用节点,但是原节点的内存状态将丢失。这种方
    3 a: t7 E# r. W& n8 O4 `式虽然可能丢失一部分数据,但是成本较低。考虑到服务器故障的概率很低,能够1 l* i) t7 l) u, \
    很好地满足流式计算业务需求。( {. g$ J7 ~; l& e, h) F
    S4中每个流处理节点称为一个处理节点(Processing Node,PN),其主要工作是
    ! O' l' p9 k% R- |& W. l& p监听事件,当事件到达时调用合适的处理元(Processing Elements,PE)处理事件。如
    : O0 z$ j. F, Y; S, O果PE有输出,则还需调用通信层接口进行事件的分发和输出,如图13-6所示。: s8 d/ J$ Z" w# }& K+ O( |) S
    图 13-6 S4处理节点内部模块
    $ q& Z2 C) A+ `0 y. r: s9 u. @事件监听器(Event Listener)负责监听事件并转交给PE容器(Processing Element# S+ j8 c) ]8 f! P/ X
    Container,PEC),由PEC交给合适的PE处理业务逻辑。配置文件中会配置PE原型
    4 K" G3 i+ [1 M( p( T(PE prototype),包括其功能、处理的事件类型(event type)、关心的key以及关心' h/ ~, X% B8 S1 O5 r+ r7 P3 o, T" x
    的key值。每个PE只负责处理自己所关心的事件,也就是说,只有当事件类型、key0 ]. H$ h* \0 n
    类型和key值都匹配时,才会交由该PE进行计算处理。PE处理完逻辑后根据其定义的* N' u4 S$ C* c; y
    输出方法可以输出事件,事件交由分发器(Dispatcher)与通信层(Communication
    / s! ?2 `; ]+ t  }Layer)进行交互并由输出器(Emitter)输出至下一个逻辑节点。输出器通过对事件
    - n, R& g  A+ A* `/ a的类型、key类型、key值计算哈希值,以路由到配置文件中指定的PN。; H+ P& s: f' I$ U! U5 M
    通信层提供集群路由(Routing)、负载均衡(Load Balancing)、故障恢复管理2 ^  R" a. ]- x% g6 |: u
    (Failover Management)、逻辑节点到物理节点的映射(存放在Zookeeper上)。当检1 m& h0 p5 S3 E% y
    测到节点故障时,会切换到备用节点,并自动更新映射关系。通信层隐藏的映射使
    1 ^& ~- q+ @( I, a  c# M  f1 @% R; a得PN发送消息时只需要关心逻辑节点而不用关心物理节点。! `. E# m$ a# b- }+ n& D* j
    13.4.3 Twitter Storm$ u' v+ f+ F2 b3 P
    Twitter Storm是目前广泛使用的流式计算系统,它创造性地引入了一种记录级容
    * Z6 z% L7 |4 A错的方法。如图13-7所示,Storm系统中包含如下几种角色:
    * a3 ~4 [$ n3 ]/ |7 y  W图 13-7 Storm集群的基本组件3 V9 x5 Z; K0 A- v: Z
    ●Nimbus:负责资源分配、任务调度、监控状态。Nimbus和supervisor之间的所  V+ Q/ l7 n; @, f. K
    有协调工作都是通过一个Zookeeper集群来完成。
    4 S, u3 \1 B1 ~. c+ o●Supervisor:负责接受nimbus分配的任务,启动和停止属于自己管理的Worker进) |1 }4 G* v; Z" N8 F
    程。, w, d8 L( }- q' a' d
    ●Worker:运行spout/bolt组件的进程。
    ) P) ^+ p0 I5 m. [7 ~: ?; E$ }●Spout:产生源数据流的组件。通常情况下spout会从外部数据源中读取数据,& d- t; f. p8 J/ I  ?  j
    然后转换为内部的数据格式。Spout是一个主动的角色,其接口中有个nextTuple()函' O# S& t, ?/ l# r. v1 v
    数,Storm框架会不停地调用此函数,用户只要在其中生成源数据即可。
    6 F9 ?7 t1 {9 r6 m$ ^  J●Bolt:接受数据然后执行处理的组件。Bolt可以执行过滤、函数操作、合并、
    2 J2 n+ H! E3 n4 f写数据库等任何操作。Bolt是一个被动的角色,其接口中有个execute(Tuple input)' F: v/ f/ s$ q( i; Z; D9 D* O! z% R
    函数,在接受到消息后会调用此函数,用户可以在其中执行自己想要的操作。5 `" Z. D4 I5 Y: U
    每个worker上运行着spolt或者bolt组件,数据从spolt组件流入,经过一系列bolt5 H9 v% e8 f# q4 K: w
    组件的处理直到生成用户想要的结果。1 W1 S. Y0 R5 l8 o- t; w4 n
    Storm中的一个记录称为tuple,用户在spout中生成一个新的源tuple时可以为其指
    6 o' Y1 P, e; j定一个消息编号(message id),多个源tuple可以共用一个消息编号,表示这多个源
    " {6 i% }& O- c3 Atuple对用户来说是同一个消息单元。Storm的记录级容错机制会告知用户由Spolt发出
    0 D& c* X% |' ?, i* x( o' s的每个消息单元是否在指定时间内被完全处理了,从而允许Splot重新发送出错的消$ Z2 |' `: W- [: }, w
    息。如图13-8,message1绑定的源tuple1和tuple2经过了bolt1和bolt2的处理后生成两个
    $ J" W/ }* V: R) r新的tuple(tuple3和tuple4),并最终都流向bolt3。当这个过程全部完成时,message11 d( [% f6 q. D. m$ l3 n
    被完全处理了。Storm中有一个系统级组件,叫做acker。这个acker的任务就是追踪从
    & h- C. B" m9 l+ r: U3 Z/ D; Rspout中流出来的每一个message绑定的若干tuple的处理路径。Bolt1、bolt2、bolt3每次
    ( a; g9 t( z- v处理完成一个tuple都会通知acker,acker会判断message1是否被完全处理了,等到完全
    8 T: r4 L: R' N& y7 z处理时通知生成message1的spolt。这里存在两个问题:
    ' |) {, m+ o, B" W+ o图 13-8 Storm数据流示例& `$ c! N( u% p  F- M/ }9 i+ ?/ L) x; o
    1)如何判断message1是否被完全处理了?4 l0 D# c  j3 e+ @
    Acker中保存了message1对应的校验值(64位整数),初始为0。每次发送或者接
    7 L3 E! d0 H; T/ w6 J+ ~收一个message1绑定的tuple时都会将tuple的编号与校验值进行异或(XOR)运行,如7 c6 g) R+ X' h5 f; |0 @: X. K
    果每个发送出去的tuple都被接受了,那么,message1对应校验值一定是0,从而认为: k. M/ {! q1 L; i4 t6 p1 `
    message1被完全处理了。当然,这种方式有一定的误判率,然而考虑到每个tuple的编0 ?5 G6 ]6 _- o) B$ Z6 C4 t) `
    号为64位整数,这种概率很低。2 q0 Q- Z5 ~0 h! p3 f) m
    2)系统中有很多acker实例,如何选择将message1发给哪个实例?
    ; {+ _4 P1 ^$ u3 [2 ~Storm中采用一致性哈希算法来计算message1对应的acker实例。如果acker出现性& c! \2 w# a! Y3 o8 m& _2 c. B3 s& v
    能瓶颈,只需要往系统中加入新的acker实例即可。
    # p% O1 N. w: t0 _1 `3 G" w/ |9 K* T
    : i6 T8 j) W2 B! X% h
    8 D! J# M6 Y" p0 d
    回复

    使用道具 举报

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

    本版积分规则

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

    GMT+8, 2024-5-6 17:56 , Processed in 0.074559 second(s), 35 queries .

    Powered by Javazx

    Copyright © 2012-2022, Javazx Cloud.

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