java自学网VIP

Java自学网

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 2604|回复: 0

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

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

    [LV.Master]出神入化

    2040

    主题

    3698

    帖子

    6万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    66476

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

    发表于 2017-3-20 19:43:57 | 显示全部楼层 |阅读模式
    13.4 流式计算
    # `; {, j) A* [, f, `# A: CMapReduce及其扩展解决了离线批处理问题,但是无法保证实时性。对于实时性) R0 P; U; V2 n& ?
    要求高的场景,可以采用流式计算或者实时分析系统进行处理。
    # F' b' m9 @2 N% N流式计算(Stream Processing)解决在线聚合(Online Aggregation)、在线过滤( f, z$ D1 M$ }$ D9 Y
    (Online Filter)等问题,流式计算同时具有存储系统和计算系统的特点,经常应用
    0 [% t8 }: \) ~' k在一些类似反作弊、交易异常监控等场景。流式计算的操作算子和时间相关,处理
    # E6 ^! J* {0 M2 F- Y5 C最近一段时间窗口内的数据。  }* i" R$ X- U
    13.4.1 原理) ~6 \7 O9 }% Q  |5 Q0 j
    流式计算强调的是数据流的实时性。MapReduce系统主要解决的是对静态数据的* i% f' G1 a2 W0 N
    批量处理,当MapReduce作业启动时,已经准备好了输入数据,比如保存在分布式文
    / P2 Q, ], q0 F$ p( O) s: I) q0 y件系统上。而流式计算系统在启动时,输入数据一般并没有完全到位,而是经由外# C) E. _0 |6 o1 C( W
    部数据流源源不断地流入。另外,流式计算并不像批处理系统那样,重视数据处理* X8 ^5 X9 v6 l2 x$ J
    的总吞吐量,而是更加重视对数据处理的延迟。. T& `7 K. ]* }' C! s
    MapReduce及其扩展采用的是一种比较静态的模型,如果用它来做数据流的处( e7 o( s0 b/ W' H! O
    理,首先需要将数据流缓存并分块,然后放入集群计算。如果MapReduce每次处理的! E& \$ y8 Y- a/ `4 u( K: L
    数据量较小,缓存数据流的时间较短,但是,MapReduce框架造成的额外开销将会占( X5 T+ _; R- W# J: M
    很大比重;如果MapReduce每次处理的数据量较大,缓存数据流的时间会很长,无法& C6 f. }3 H, e8 l' t
    满足实时性的要求。
    & |- N+ `# e/ Z7 b7 g7 _流式计算系统架构如图13-5所示。% c. X' A+ N) ~7 c& \' z9 r" f
    图 13-5 流式计算系统
    " i2 D8 d8 o4 f& \, D: Q/ {- Z* k源数据写入到流处理节点,流处理节点内部运行用户自定义的钩子函数对输入
    0 V( k3 F0 f) z流进行处理,处理完后根据一定的规则转发给下游的流处理节点继续处理。另外,) `/ A, \0 Z8 M/ K" h
    系统中往往还有管理节点,用来管理流处理节点的状态以及节点之间的路由规则。/ U- E# P0 b1 Z* P" X% K
    典型钩子函数包括:
    2 {! j1 u, ^7 o8 q* c●聚合函数:计算最近一段时间窗口内数据的聚合值,如max、min、avg、sum、+ @# ]; X: z" ~6 r! ~$ O0 U
    count等。$ {* y" N5 d. J6 \3 q! g
    ●过滤函数:过滤最近一段时间窗口内满足某些特性的数据,如过滤1秒钟内重
    2 j) M2 q5 f' B8 l3 ]5 j复的点击。& T& W, j" p; t* l
    如果考虑机器故障,问题变得复杂。上游的处理节点出现故障时,下游有两种
    7 D3 D% P9 c& F选择:第一种选择是等待上游恢复服务,保证数据一致性;第二种选择是继续处
    1 q" u6 u. ], v  k  v理,优先保证可用性,等到上游恢复后再修复错误的计算结果。
    8 [- R$ r  F: Z. }流处理节点可以通过主备同步(Master/Slave)的方式容错,即将数据强同步到* B; z4 Z6 a6 j* g$ O% L) Q" v9 q
    备机,如果主机出现故障,备机自动切换为主机继续提供服务。然而,这种方式的+ m( x4 {  Q7 u- X/ V7 _  N
    代价很高,且流式处理系统往往对错误有一定的容忍度,实际应用时经常选择其他9 W. e) T/ T/ k) D7 L& |$ K
    代价更低的容错方式。; F2 v% J7 D( \
    13.4.2 Yahoo S4
    7 K; p! L8 N" x3 W( P' d% l' mYahoo S4最初是Yahoo为了提高搜索广告有效点击率而开发的一个流式处理系1 u6 w, F% ^9 q5 o# a% e, N& O
    统。S4的主要设计目标是提供一种简单的编程接口来处理数据流,使得用户可以定4 w) T0 r% ?$ G; z0 Q( R
    制流式计算的操作算子。在容错设计上,S4做得比较简单:一旦S4集群中的某个节
    ; s% b; k1 V2 w9 Z2 w点故障,会自动切换到另外一个备用节点,但是原节点的内存状态将丢失。这种方
    ! N, d* e' u0 Z/ Q4 Y0 K1 K- Y8 W8 {式虽然可能丢失一部分数据,但是成本较低。考虑到服务器故障的概率很低,能够; a" j4 o- W& }4 t9 K, n' p. L
    很好地满足流式计算业务需求。* x/ f8 n3 L6 i  @, D; T
    S4中每个流处理节点称为一个处理节点(Processing Node,PN),其主要工作是
    " e" I4 ?5 S& @5 f/ K+ c监听事件,当事件到达时调用合适的处理元(Processing Elements,PE)处理事件。如3 P9 Y$ a1 m* b4 n
    果PE有输出,则还需调用通信层接口进行事件的分发和输出,如图13-6所示。
    4 ^: W  K- _/ x图 13-6 S4处理节点内部模块
    6 v" `( U7 i* i; u3 \+ u事件监听器(Event Listener)负责监听事件并转交给PE容器(Processing Element0 b3 ]3 G4 O8 z$ ~
    Container,PEC),由PEC交给合适的PE处理业务逻辑。配置文件中会配置PE原型
    ( @0 M. X6 y' B(PE prototype),包括其功能、处理的事件类型(event type)、关心的key以及关心
    1 J+ ?- l) _7 f) [: ~0 h的key值。每个PE只负责处理自己所关心的事件,也就是说,只有当事件类型、key
    % M  K. h% }' P0 f) c7 C) r5 G类型和key值都匹配时,才会交由该PE进行计算处理。PE处理完逻辑后根据其定义的0 r% u6 u( g4 V! P0 U: b6 N  `' x
    输出方法可以输出事件,事件交由分发器(Dispatcher)与通信层(Communication
    ' S, Z" L  I. a7 T% j" Q% }Layer)进行交互并由输出器(Emitter)输出至下一个逻辑节点。输出器通过对事件
    ; d3 \# A' l0 H8 @的类型、key类型、key值计算哈希值,以路由到配置文件中指定的PN。
    3 J' {+ u4 S5 b$ f/ Y通信层提供集群路由(Routing)、负载均衡(Load Balancing)、故障恢复管理
    ( J" \. i3 X) h1 p( H(Failover Management)、逻辑节点到物理节点的映射(存放在Zookeeper上)。当检
    . M( G9 j) N) U" ~8 I测到节点故障时,会切换到备用节点,并自动更新映射关系。通信层隐藏的映射使+ ~% g' `7 s$ F; o1 x/ \8 w
    得PN发送消息时只需要关心逻辑节点而不用关心物理节点。9 z) \6 V  a% y9 L
    13.4.3 Twitter Storm
    $ Y1 C3 B0 A5 l3 wTwitter Storm是目前广泛使用的流式计算系统,它创造性地引入了一种记录级容
    " ]8 g- L$ O: \) O错的方法。如图13-7所示,Storm系统中包含如下几种角色:
    / Y- t3 L/ H; O  Q( R( M* a. J图 13-7 Storm集群的基本组件
    7 T8 P& W' j" E1 i●Nimbus:负责资源分配、任务调度、监控状态。Nimbus和supervisor之间的所
    & c, P; r/ I9 o2 G, M有协调工作都是通过一个Zookeeper集群来完成。
    ; r; h, r/ j0 P●Supervisor:负责接受nimbus分配的任务,启动和停止属于自己管理的Worker进9 D5 m/ J  M; X; }2 r5 {
    程。
    ! [! \9 w- G5 {6 X; i●Worker:运行spout/bolt组件的进程。
    . t9 W2 [! Y. Z; `* D' I- a# T/ v●Spout:产生源数据流的组件。通常情况下spout会从外部数据源中读取数据,
    % u: a5 W2 K: ^然后转换为内部的数据格式。Spout是一个主动的角色,其接口中有个nextTuple()函- B# l6 Z. U/ H& C. F+ S* J2 r! g
    数,Storm框架会不停地调用此函数,用户只要在其中生成源数据即可。
    / U* c$ V% E4 m: L2 Q●Bolt:接受数据然后执行处理的组件。Bolt可以执行过滤、函数操作、合并、8 X7 N% N2 x0 D
    写数据库等任何操作。Bolt是一个被动的角色,其接口中有个execute(Tuple input)( j& ?2 f  P6 K$ E+ m# h* f
    函数,在接受到消息后会调用此函数,用户可以在其中执行自己想要的操作。
    ; s$ J. a. X! h! Q3 K! r( P每个worker上运行着spolt或者bolt组件,数据从spolt组件流入,经过一系列bolt6 b' [& q: z) u# Q9 R" X. y5 X
    组件的处理直到生成用户想要的结果。
    3 [+ e1 _/ v' NStorm中的一个记录称为tuple,用户在spout中生成一个新的源tuple时可以为其指: {4 ]* Q  j9 l8 `
    定一个消息编号(message id),多个源tuple可以共用一个消息编号,表示这多个源
    1 D  T# L/ c" W) S& g; n3 K' Ituple对用户来说是同一个消息单元。Storm的记录级容错机制会告知用户由Spolt发出' U0 ?* @0 N& U
    的每个消息单元是否在指定时间内被完全处理了,从而允许Splot重新发送出错的消! H% W, A  @8 C# v* g" E
    息。如图13-8,message1绑定的源tuple1和tuple2经过了bolt1和bolt2的处理后生成两个
    % S& p6 w/ n9 e# i8 g新的tuple(tuple3和tuple4),并最终都流向bolt3。当这个过程全部完成时,message1
    / l" ?- Z5 c1 Z2 d) L/ i被完全处理了。Storm中有一个系统级组件,叫做acker。这个acker的任务就是追踪从* G! {6 n  k% X1 Q. A& ^0 `) b
    spout中流出来的每一个message绑定的若干tuple的处理路径。Bolt1、bolt2、bolt3每次
    & \, c9 n  U) l7 G. P处理完成一个tuple都会通知acker,acker会判断message1是否被完全处理了,等到完全- i: W. g6 M7 V9 G6 L6 F
    处理时通知生成message1的spolt。这里存在两个问题:. W  _9 Z3 F7 j2 |) K3 R. n
    图 13-8 Storm数据流示例
    : v2 a* i% C( a% o& n& d1)如何判断message1是否被完全处理了?! Z: L4 P& a4 L0 r0 X
    Acker中保存了message1对应的校验值(64位整数),初始为0。每次发送或者接
    ! T9 M" c8 ?  X收一个message1绑定的tuple时都会将tuple的编号与校验值进行异或(XOR)运行,如
    - n, [; T; O3 l& W/ L1 G果每个发送出去的tuple都被接受了,那么,message1对应校验值一定是0,从而认为
    ' e9 G. U7 l( @message1被完全处理了。当然,这种方式有一定的误判率,然而考虑到每个tuple的编
    ! V  R  }/ [; o+ P号为64位整数,这种概率很低。
    . K" k" a# K3 F2)系统中有很多acker实例,如何选择将message1发给哪个实例?2 N; E8 R5 K7 V) z
    Storm中采用一致性哈希算法来计算message1对应的acker实例。如果acker出现性
    % y( P% T" ^* E( i能瓶颈,只需要往系统中加入新的acker实例即可。% ~4 v2 q) R- L3 P7 D3 H5 Q: ^

    9 q# Y0 p) I& u" |, @. ^
    & y) P7 W. b% _4 [& A$ a
    回复

    使用道具 举报

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

    本版积分规则

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

    GMT+8, 2025-1-22 14:59 , Processed in 0.121504 second(s), 33 queries .

    Powered by Javazx

    Copyright © 2012-2022, Javazx Cloud.

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