java自学网VIP

Java自学网

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 2693|回复: 0

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

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

    [LV.Master]出神入化

    2096

    主题

    3754

    帖子

    6万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    66788

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

    发表于 2017-3-20 19:43:57 | 显示全部楼层 |阅读模式
    13.4 流式计算4 ~- w  Q  I* z4 N7 F/ J* @
    MapReduce及其扩展解决了离线批处理问题,但是无法保证实时性。对于实时性
    " r; g* G  M( z' o要求高的场景,可以采用流式计算或者实时分析系统进行处理。7 D( B# z( L4 x$ t
    流式计算(Stream Processing)解决在线聚合(Online Aggregation)、在线过滤, R* s0 i- `: d% @  y" q* F1 o8 p9 X
    (Online Filter)等问题,流式计算同时具有存储系统和计算系统的特点,经常应用4 `! _* P. ]5 Y+ B2 Y$ N. m% b
    在一些类似反作弊、交易异常监控等场景。流式计算的操作算子和时间相关,处理
    6 N" [) \0 `% L最近一段时间窗口内的数据。( ]4 V, p0 h; D! `) ^3 g2 y; S
    13.4.1 原理* H, Z+ j, t; [" D! I8 B& ^/ y
    流式计算强调的是数据流的实时性。MapReduce系统主要解决的是对静态数据的
    9 Q: _/ T* o3 f2 L批量处理,当MapReduce作业启动时,已经准备好了输入数据,比如保存在分布式文
    . b, w7 ]" D7 ~9 i" |4 w' W$ m件系统上。而流式计算系统在启动时,输入数据一般并没有完全到位,而是经由外  d( m* \7 d6 }/ P# R1 B
    部数据流源源不断地流入。另外,流式计算并不像批处理系统那样,重视数据处理
    ; ]6 a5 N6 `* E; |! s) L的总吞吐量,而是更加重视对数据处理的延迟。
      y- P% k5 g: B& ~3 K2 T  w% GMapReduce及其扩展采用的是一种比较静态的模型,如果用它来做数据流的处, N4 l. H! `( v+ k+ ]6 x2 \, _
    理,首先需要将数据流缓存并分块,然后放入集群计算。如果MapReduce每次处理的4 n; e0 n+ m& {( l4 P$ d0 t
    数据量较小,缓存数据流的时间较短,但是,MapReduce框架造成的额外开销将会占
    ! n2 Z5 s& w# ^' f很大比重;如果MapReduce每次处理的数据量较大,缓存数据流的时间会很长,无法; }" R6 S, ^- N% E! @
    满足实时性的要求。
    7 k% l6 x! z: _: ^0 t5 B1 w5 c流式计算系统架构如图13-5所示。, j" v4 P5 L2 T) L- T% A4 b, @
    图 13-5 流式计算系统
    % {6 A. G: m5 h' v源数据写入到流处理节点,流处理节点内部运行用户自定义的钩子函数对输入
    , u$ ~9 x, k9 g  z: S, l3 s% W流进行处理,处理完后根据一定的规则转发给下游的流处理节点继续处理。另外,% _% N# _" I, g! {7 n
    系统中往往还有管理节点,用来管理流处理节点的状态以及节点之间的路由规则。
    + j" L( o/ v' [- t& Y! M4 J典型钩子函数包括:
    2 i1 w" P2 C$ C' ?- D0 ?6 U●聚合函数:计算最近一段时间窗口内数据的聚合值,如max、min、avg、sum、0 W9 A' h1 `4 s  U( X
    count等。& W! ?' a+ O/ h( F9 s+ k/ Y0 `
    ●过滤函数:过滤最近一段时间窗口内满足某些特性的数据,如过滤1秒钟内重
    - l( `8 F8 f3 g1 E复的点击。* v. E+ B: m: G7 o0 [; R9 k
    如果考虑机器故障,问题变得复杂。上游的处理节点出现故障时,下游有两种
    ) n+ V! \0 `8 N3 c选择:第一种选择是等待上游恢复服务,保证数据一致性;第二种选择是继续处# ?' Z6 D# _3 M* O, f9 W# [
    理,优先保证可用性,等到上游恢复后再修复错误的计算结果。
    0 M: V4 u) ]' k流处理节点可以通过主备同步(Master/Slave)的方式容错,即将数据强同步到1 F- C# A' m7 ]6 \4 Y/ Y7 o
    备机,如果主机出现故障,备机自动切换为主机继续提供服务。然而,这种方式的
    4 {3 \7 j) V" @' F! L6 J! n代价很高,且流式处理系统往往对错误有一定的容忍度,实际应用时经常选择其他
    7 j4 l  R$ @/ B" ?- ]& m代价更低的容错方式。) U) h# \% p2 Z5 @# c& I
    13.4.2 Yahoo S40 k( Y* D& S+ f6 F$ g) q
    Yahoo S4最初是Yahoo为了提高搜索广告有效点击率而开发的一个流式处理系# s! h! p1 E, U/ Y* f
    统。S4的主要设计目标是提供一种简单的编程接口来处理数据流,使得用户可以定: V$ e. T/ v) B& U$ E5 m
    制流式计算的操作算子。在容错设计上,S4做得比较简单:一旦S4集群中的某个节* P1 \' J3 V/ J
    点故障,会自动切换到另外一个备用节点,但是原节点的内存状态将丢失。这种方
    / j7 {5 S! `1 X8 [式虽然可能丢失一部分数据,但是成本较低。考虑到服务器故障的概率很低,能够  y4 Y1 I. [0 _5 l# _4 y
    很好地满足流式计算业务需求。
    ; z' p5 m9 J1 M+ t8 M) p5 }; DS4中每个流处理节点称为一个处理节点(Processing Node,PN),其主要工作是. _& ^9 R. j$ y: c* x
    监听事件,当事件到达时调用合适的处理元(Processing Elements,PE)处理事件。如
    & T) k( l/ [, ]) }, ^  P果PE有输出,则还需调用通信层接口进行事件的分发和输出,如图13-6所示。- G! N5 U6 w5 w* K4 N+ r( Z( H
    图 13-6 S4处理节点内部模块
    # S2 H5 a/ c' n) [" x事件监听器(Event Listener)负责监听事件并转交给PE容器(Processing Element; G, E1 x1 t  p8 u+ @8 u
    Container,PEC),由PEC交给合适的PE处理业务逻辑。配置文件中会配置PE原型: R3 k3 P& W, V' E+ x2 W8 \
    (PE prototype),包括其功能、处理的事件类型(event type)、关心的key以及关心
    8 y; y3 r  v) a" T4 I- T( `的key值。每个PE只负责处理自己所关心的事件,也就是说,只有当事件类型、key# w9 z- ^5 F* J. Q- t7 {
    类型和key值都匹配时,才会交由该PE进行计算处理。PE处理完逻辑后根据其定义的
    ; Y2 E  U5 Z$ J) u; f2 e+ T3 G输出方法可以输出事件,事件交由分发器(Dispatcher)与通信层(Communication
    7 ?- [& m: A6 CLayer)进行交互并由输出器(Emitter)输出至下一个逻辑节点。输出器通过对事件8 [4 u- a2 c8 C1 X& I
    的类型、key类型、key值计算哈希值,以路由到配置文件中指定的PN。! ^: ^) l8 [- M2 x
    通信层提供集群路由(Routing)、负载均衡(Load Balancing)、故障恢复管理( X0 Z' G0 [( Q) z
    (Failover Management)、逻辑节点到物理节点的映射(存放在Zookeeper上)。当检
    9 M" [* f$ b! k4 ?1 _测到节点故障时,会切换到备用节点,并自动更新映射关系。通信层隐藏的映射使4 Q# f7 i2 r" f4 o; \
    得PN发送消息时只需要关心逻辑节点而不用关心物理节点。# @1 K* _9 S! z
    13.4.3 Twitter Storm! J6 \2 i$ |, U2 y
    Twitter Storm是目前广泛使用的流式计算系统,它创造性地引入了一种记录级容$ m7 m$ |/ G# m# v2 p" C9 x: j
    错的方法。如图13-7所示,Storm系统中包含如下几种角色:
    5 h- c: m% T& O+ I图 13-7 Storm集群的基本组件$ U5 ~0 X- Z) r
    ●Nimbus:负责资源分配、任务调度、监控状态。Nimbus和supervisor之间的所
    ( E7 w) t/ p0 @; k有协调工作都是通过一个Zookeeper集群来完成。
    % m# j  s0 y4 W; i3 e, b●Supervisor:负责接受nimbus分配的任务,启动和停止属于自己管理的Worker进
    - y* O* R# q/ J. L6 W程。
      C+ P5 ?' I/ D6 S●Worker:运行spout/bolt组件的进程。
    9 C& Q. f, g1 P9 G" ]* u●Spout:产生源数据流的组件。通常情况下spout会从外部数据源中读取数据,7 B* ]3 o# o; _# u
    然后转换为内部的数据格式。Spout是一个主动的角色,其接口中有个nextTuple()函! u  I: G  j% \' ]' n/ B
    数,Storm框架会不停地调用此函数,用户只要在其中生成源数据即可。9 N2 O8 |* I6 N7 t9 e
    ●Bolt:接受数据然后执行处理的组件。Bolt可以执行过滤、函数操作、合并、) ~( N) N1 J6 j
    写数据库等任何操作。Bolt是一个被动的角色,其接口中有个execute(Tuple input)
    ) u9 @$ D# W; R8 w$ ^4 u4 h函数,在接受到消息后会调用此函数,用户可以在其中执行自己想要的操作。
    - |8 q2 w6 y6 o$ E& I: h每个worker上运行着spolt或者bolt组件,数据从spolt组件流入,经过一系列bolt
    , Q9 E! l, L  g7 @+ w9 ]# `) E组件的处理直到生成用户想要的结果。  G! W; N7 S; U/ k% B6 X
    Storm中的一个记录称为tuple,用户在spout中生成一个新的源tuple时可以为其指
    ! v4 I( A4 [1 c定一个消息编号(message id),多个源tuple可以共用一个消息编号,表示这多个源
    $ [* N. m  L2 Mtuple对用户来说是同一个消息单元。Storm的记录级容错机制会告知用户由Spolt发出
    * Q: f  X7 I, i, d! E3 ]1 W7 B的每个消息单元是否在指定时间内被完全处理了,从而允许Splot重新发送出错的消" z; `9 P' z- E8 p* g
    息。如图13-8,message1绑定的源tuple1和tuple2经过了bolt1和bolt2的处理后生成两个
    8 x1 R. j* R$ G' N) S; S( s( _* [) i2 S新的tuple(tuple3和tuple4),并最终都流向bolt3。当这个过程全部完成时,message12 X2 m0 V% N$ K" h
    被完全处理了。Storm中有一个系统级组件,叫做acker。这个acker的任务就是追踪从
    7 N$ n8 y7 `$ W. I! w1 L$ ~/ \spout中流出来的每一个message绑定的若干tuple的处理路径。Bolt1、bolt2、bolt3每次
    " N: u3 T- J- ^; X! z( c' D处理完成一个tuple都会通知acker,acker会判断message1是否被完全处理了,等到完全* w$ i+ R6 M6 C1 X
    处理时通知生成message1的spolt。这里存在两个问题:8 `# N4 q( v4 X
    图 13-8 Storm数据流示例
    8 l+ o  ~; n& {) m& D+ R6 K0 ]1)如何判断message1是否被完全处理了?  G0 f& L0 Z( G+ s
    Acker中保存了message1对应的校验值(64位整数),初始为0。每次发送或者接
    , y* c/ C4 j$ L7 t% L+ ^收一个message1绑定的tuple时都会将tuple的编号与校验值进行异或(XOR)运行,如
    ' X$ E. T% B9 |$ e! f/ {+ ?果每个发送出去的tuple都被接受了,那么,message1对应校验值一定是0,从而认为+ R- N7 D. S9 e# D
    message1被完全处理了。当然,这种方式有一定的误判率,然而考虑到每个tuple的编
    4 d+ f" }6 Z* c( f号为64位整数,这种概率很低。
    4 s9 X/ E6 p2 N6 B3 L2)系统中有很多acker实例,如何选择将message1发给哪个实例?; C3 E1 @8 R  w' c. n; L
    Storm中采用一致性哈希算法来计算message1对应的acker实例。如果acker出现性
    2 _/ ^7 R) M& m8 ^$ [+ g" S0 f能瓶颈,只需要往系统中加入新的acker实例即可。
    ' r/ ]5 Z7 a! c7 }$ g! c3 Z7 M0 C& n( c2 x. i
    & e' ^8 g( _7 X6 o! j
    回复

    使用道具 举报

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

    本版积分规则

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

    GMT+8, 2025-4-1 14:06 , Processed in 0.123775 second(s), 35 queries .

    Powered by Javazx

    Copyright © 2012-2022, Javazx Cloud.

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