|
13.5 实时分析5 X* _0 E7 p7 W
海量数据离线分析对于MapReduce这样的批处理系统挑战并不大,如果要求实
/ `! |" m, F3 H) y. q4 `时,又分为两种情况:如果查询模式单一,那么,可以通过MapReduce预处理后将最
% W4 D: Y' S, @8 A. w终结果导入到在线系统提供实时查询;如果查询模式复杂,例如涉及多个列任意组1 D- M, t$ \% c: h0 c3 h1 L; @
合查询,那么,只能通过实时分析系统解决。实时分析系统融合了并行数据库和云/ o3 b" b5 J; G
计算这两类技术,能够从海量数据中快速分析出汇总结果。
8 Z- {- f4 R6 W% X6 o; b0 Q13.5.1 MPP架构1 Z5 R" u, m8 g
并行数据库往往采用MPP(Massively Parallel Processing,大规模并行处理)架
# v% }% ?# `3 q# w构。MPP架构是一种不共享的结构,每个节点可以运行自己的操作系统、数据库" G" F; A4 ^- X' M% _( ~ T! G# Y
等。每个节点内的CPU不能访问另一个节点的内存,节点之间的信息交互是通过节5 W$ X$ {+ `9 b X" b
点互联网络实现的。% I' I/ T. q( x v
如图13-9所示,将数据分布到多个节点,每个节点扫描本地数据,并由Merge操
0 _; o. O7 ~+ m: C0 p作符执行结果汇总。
@9 \1 i5 ]- K2 m- |( l图 13-9 MPP Merge操作符: I; t$ b0 r. C. z4 A0 P" `6 Z
常见的数据分布算法有两种:
! ^1 [, ?* K2 r% ~0 b●范围分区(Range partitioning):按照范围划分数据。. Y: G* R+ d2 n
●哈希分区(Hashing):根据哈希函数计算结果将每个元组分配给相应的节
/ F, ?( }- w* |' r3 O$ E点。4 f/ m1 e. B2 b! K/ V* o
Merge操作符:系统中存在一个或者多个合并节点,它会发送命令给各个数据分
: I0 n* [$ R$ a& w4 D片请求相应的数据,每个数据分片所在的节点扫描本地数据,排序后回复合并节
# D+ @- P- p: {* e! w0 b点,由合并节点通过merge操作符执行数据汇总。Merge操作符是一个统称,涉及的
- N7 Y' g7 `. c操作可能是limit、order by、group by、join等。这个过程相当于执行一个Reduce任务
9 d" L3 ^' M6 K: q个数为1的MapReduce作业,不同的是,这里不需要考虑执行过程中服务器出现故障) \& q$ n* O; v# G6 A
的情况。
: x$ ^( I% r: `5 y @如果Merge节点处理的数据量特别大,可以通过Split操作符将数据划分到多个节/ x% U4 t l6 ?/ k. K& D% U
点,每个节点对一部分数据执行group by、join等操作后再合并最终结果。6 x2 W: e! e6 P t4 X# Z
如图13-10,假如需要执行"select*from A,B where A.x=B.y",可以分别根据A.x和3 {9 x. E. \7 J( q% `2 M1 P) N
B.x的哈希值将表A和B划分为A0、A1以及B0、B1。由两个节点分别对A0、B0以及, p. r8 A$ u; |* }
A1、B1执行join操作后再合并join结果。6 ?3 b0 L5 t, G7 S N
图 13-10 MPP Split操作符
; H. T$ p. L9 D. r# x并行数据库的SQL查询和MapReduce计算有些类似,可以认为MapReduce模型是
( Z+ u- W) e5 d* b一种更高层次的抽象。由于考虑问题的角度不同,并行数据库处理的SQL查询执行时5 i: ~0 ]1 d/ g* i
间通常很短,出现异常时整个操作重做即可,不需要像MapReduce实现那样引入一个
8 Y. r6 o% s# k1 t8 h4 Z% w主控节点管理计算节点,监控计算节点故障,启动备份任务等。+ S) d; A, e8 M$ U, M) o
13.5.2 EMC Greenplum
# C) k9 w1 M9 HGreenplum是EMC公司研发的一款采用MPP架构的OLAP产品,底层基于开源的4 V/ w( O1 _; C9 c% J: H
PostgreSQL数据库。
( w+ p+ G8 u, V1.整体架构5 W$ Z; b+ F" U
如图13-11,Greenplum系统主要包含两种角色:Master服务器(Master Server)1 _) L) U( `/ A, S4 Z0 x
和Segment服务器(Segment Server)。在Greenplum中每个表都是分布在所有节点上
! J$ D" N0 N' j$ A1 M的。Master服务器首先对表的某个或多个列进行哈希运算,然后根据哈希结果将表的: C a. k! v Y# ]2 d( U Q @, u8 G
数据分布到Segment服务器中。整个过程中Master服务器不存放任何用户数据,只是
5 e, Q. ]+ W, e% ?" a& o- A; B对客户端进行访问控制和存储表分布逻辑的元数据。0 W. \" L( p3 W; {8 ]* O/ y
图 13-11 Greenplum整体架构
- i' v {) R4 H' [) p1 l3 DGreenplum支持两种访问方式:SQL和MapReduce。用户将SQL操作语句发送给) U1 A# Z, u# [
Master服务器,由Master服务器执行词法分析、语法分析,生成查询计划,并将查询" D6 T6 |& V5 f/ {1 p
请求分发给多台Segment服务器。每个Segment服务器返回部分结果后,Master服务器- @$ d/ S* q. N
会进行聚合并将最终结果返回给用户。除了高效查询,Greenplum还支持通过数据的- { [+ J D2 _
并行装载,将外部数据并行装载到所有的Segement服务器。8 E( `$ R) p* p2 D6 q. O
2.并行查询优化器
7 ?4 y0 @0 ]8 PGreenplum的并行查询优化器负责将用户的SQL或者MapReduce请求转化为物理1 L2 M$ [+ ]/ i2 ?; c% P6 I, I, N
执行计划。Greenplum采用基于代价的查询优化算法(cost-based optimization),从各
! J2 ~8 b% p" ~4 [7 {种可能的查询计划中选择一个代价最小的。Greenplum优化器会考虑集群全局统计信' v* ^1 q. q* n8 r% X2 X
息,例如数据分布,另外,除了考虑单机执行的CPU、内存资源消耗,还需要考虑
: \% a5 S) D) y数据的网络传输开销。
# t& X: Z5 {# {2 K( EGreenplum除了生成传统关系数据库的物理运算符,包括表格扫描(Scan)、过& ^$ T6 o9 [9 c0 q% i
滤(Filter)、聚集(Aggregation)、排序(Sort)、联表(Join),还会生成一些并- ]4 o) u5 {- u4 Y! J, j- m3 X( l
行运算符,用来描述查询执行过程中如何在节点之间传输数据。0 Y- R0 I$ M% ?0 V5 a( s9 q
●广播(Broadcast,N:N):每个计算节点将目标数据发送给所有其他节点。
# V" t' O- D9 {6 F" t: u●重新分布(Redistribute,N:N):类似MapReduce中的shuffle过程,每个计算节
5 K+ e3 D& @ d0 I1 Y: X点将目标数据重新哈希后分散到所有其他节点。1 G6 z8 l0 }8 ?1 _+ b) g0 I7 a* Z
●汇总(Gather,N:1):所有的计算节点将目标数据发送给某个节点(一般为
p4 @- c2 K# B: ?. D2 E7 EMaster服务器)。! D% m8 F! L% B" M1 |
图13-12中有四张表格:订单信息表(orders),订单项表(lineitem),顾客信: o6 y1 \5 u7 q+ Z o; V# Z6 C5 P
息表(customer)以及顾客国籍表(nation)。其中,orders表记录了订单的基本信
. h9 { F' o0 l, e* J, V3 r \/ Q息,包括订单主键(o_orderkey)、顾客主键(o_custkey)和订单发生日期
6 V; W4 _/ n3 r }(o_orderdate);lineitem表记录了订单项信息,包括订单主键(l_orderkey)和订单8 L F7 [ G% K+ {
金额(l_price);customer表记录了顾客的基本信息,包括顾客主键(c_custkey)和- k5 \5 W( t( G7 N: n7 U) q
顾客国籍主键(c_nationkey);nation表记录了顾客的国籍信息,包括国籍主键
. A, z4 ]/ p: u% V! k6 x) Y6 X7 N(n_nationkey)和国籍名称(n_name)。Orders表和lineitem表通过订单主键关联,
, k) K5 V( ?5 G) |- Q- sorders表和customer表通过顾客主键关联,customer表和nation通过国籍主键关联。左3 X. [- C; S" O
边的SQL语句查询订单发生日期在1994年8月1日开始三个月内的所有订单,按照顾客
$ D4 p# K4 o! U% j- B分组,计算每个分组的所有订单交易额,并按照交易额逆序排列。在右边的物理查. M/ g E. p4 x7 E7 F
询计划中,首先分别对lineitem和orders,custom和nation执行联表操作,联表后生成
. O5 x1 S8 ~! k* R: T1 m) [的结果分别记为Join_table1和Join_table2。接着,再对Join_table1和Join_table2执行联8 ` V. S9 i4 r5 j. T- n
表操作。其中,custom和nation联表时会将nation表格的数据广播(Broadcast)到所有
8 `" m' w3 v* o4 b3 P的计算节点(共4个);Join_table1和Join_table2联表时会将Join_table1按照Join列
' b* u. ]) t# t1 ^3 L(o_custkey)哈希后重新分布(Redistribute)到所有的计算节点。最后,每个计算节2 [& }: \- d% g# s
点都有一部分Join_table1和Join_table2的数据,且Join列(o_custkey以及c_custkey)相
% P& Z! n9 T7 p6 k( i同的数据分布在同一个计算节点,每个计算节点分别执行Hash Join、HashAggregate
6 ?& N& Z/ o* M0 K2 z3 U- D6 o以及Sort操作。最后,将每个计算节点上的部分结果汇总(Gather)到Master服务8 ^/ p+ G. B3 E2 [# ~
器,整个SQL语句执行完成。3 B+ [3 E$ @. Y/ h8 t/ W# h
图 13-12 Greenplum查询优化示例& Y% O% R2 P. R, Q# z
13.5.3 HP Vertica
( w! l2 z3 a& |# _$ {% fVertica是Michael Stonebraker的学术研究项目C-Store的商业版本,并最终被惠普
2 X0 A1 D: \5 d4 O @0 z公司收购。Vertica在架构上与OceanBase有相似之处,这里介绍其中一些有趣的思: P7 z1 v7 ^" j$ ?# i
想。& k1 I8 u/ D2 O- k2 p1 e
1.混合存储模型
6 P- k. z* m' @Vertica的数据包含两个部分:ROS(Read-Optimized Storage)以及WOS(Write-) G/ f' |& A/ V9 o) n! v6 z& }
Optimized Storage),WOS的数据在内存中且不排序和加索引,ROS的数据在磁盘中; n5 Z$ s, \8 l% X
有序且压缩存储。后台的"TUPLE MOVER"会不断地将数据从WOS读出并往ROS更新) ?1 X! j: O: W5 s
(同时完成排序和索引)。Vertica的这种设计和OceanBase很相似,ROS对应
: `& q0 y5 q' A3 @1 wOceanBase中的ChunkServer,WOS对应OceanBase中的UpdateServer。由于后台采
" k G3 f) J1 G4 s4 h5 E4 h用"BULK"的方式批量更新,性能非常好。: [* y3 g7 X# w' V8 ^# R6 W+ _! V
2.多映射(Projections)存储
0 ]% E \6 r. O5 D5 [8 c lVertica没有采用传统关系数据库的B树索引,而是冗余存储一张表格的多个视& R! P6 d+ m+ d$ s- P
图,定义为映射。
* G* @8 \9 {2 C4 X6 C* W每个映射包含表格的部分列,可以分别对不同的映射定义不同的排序主键。如
+ O7 f8 D" J$ G$ y1 U' t7 j p图13-13所示,系统中有一张表格逻辑上包含5列<A,B,C,D,E>,物理存储成三个映$ g) ]# }9 W% L" D! M5 f
射,分别为:Projection1(A,B,C,主键为<A,B>),Projection2(A,B,C,主键为<5 v5 r4 q5 g! z8 ~/ V7 J
B,A>)和Projection3(B,D,E,主键为<B>)。3 X# s( ]% @4 @+ g# t& k
图 13-13 vertica projections示例9 {1 H T. }: |! G. e; c; Z0 t
a)"select A,B,C from table where A=1"=>查询Projection1+ v4 u0 Z" q* H# n0 g( w
b)"select A,B,C from table where B=1"=>查询Projection2
# K- j' z Y9 n" Oc)"select B,D from table where B=1"=>查询Projection3+ j! \' M' ?8 l4 @0 |
Vertica通常维护多个不同排序的有重叠的映射,尽量使得每个查询的数据只来自: D7 V' {, ~9 C( B, e w
一个映射,以提高查询性能。为了支持任意列查询,需要保证每个列至少在一个映9 |1 P/ ]' H3 ]$ l- d
射中出现。
" G6 S0 J. N/ t3.列式存储5 U( Z1 j2 s& t% F- M+ w+ f
Vertica中的每一列数据独立存储在磁盘中的连续块上。查询数据时,Vertica只需6 N. ? K" A$ v3 ]/ _0 K6 W
要读取那些需要的列,而不是被选择的行的所有的列数据。
7 h( B/ I- l* ?: ]" k4.压缩技术, A% F# t, h, A/ a, @
Vertica根据数据类型、基数(可能的取值个数)、排序自动对数据进行压缩,从: U* l* |) N1 D* N# x4 G x
而最小化每列占用的空间。常用的压缩算法包括:2 B: y* B+ U+ I) b: Y" t
●Run Length Encoding:列类型为整数,基数较小且有序;
4 _. e b- k% ] Z: a' w●位图索引:列类型为整数,基数较小;" |: N- y0 z/ X* Z. p1 w
●按块字典压缩:列类型为字符串且基数较小;
: r9 a. k1 _0 }/ \7 w●LZ通用压缩算法:其他列值特征不明显的场景。7 g+ I1 N, L) r; s
基于列的压缩由于同样的数据类型和相同的取值范围,通常会大幅度提高压缩 A0 a& Y, p" q: J
效果。另外,vertica还支持直接在压缩后的数据上做运算。6 a. M+ Z m" I* b5 E
13.5.4 Google Dremel( Q0 E4 F9 r. G" H3 x0 b9 {
Google Dremel是Google的实时分析系统,可以扩展到上千台机器规模,处理PB H. _0 p0 N8 J' L" c# V2 r; n
级别的数据。Dremel还是Google Bigquery服务的底层存储和查询引擎。相比传统的并% N* M; r% L( m6 L% U. S
行数据库,Dremel的优势在于可扩展性,磁盘的顺序读取速度在100MB/s上下,而# h! @& p) j& x( L% d* o- |3 C
Dremel能够在1秒内处理1TB的数据,即使压缩率为10:1,也至少需要1000个磁盘并( z4 o+ V9 D7 R( W9 i% }2 h
发读。9 G/ ^& c; I& z) N6 [' x( l( c! L- ?
1.系统架构; I6 A7 ~8 Q1 z& O& m5 w( N6 r
Dremel系统融合了并行数据库和Web搜索技术。首先,它借鉴了Web搜索中
9 \' l% {' f8 [: _9 m% b的“查询树”的概念,将一个巨大复杂的查询,分割成大量较小的查询,使其能并发' d! F& Z" f$ T1 n* P
地在大量节点上执行。其次,和并行数据库类似,Dremel提供了一个SQL-like的接+ Z: L6 v8 w8 M, A" I2 C9 X
口,且支持列式存储。4 L7 P8 |/ K5 N8 o* \* F
如图13-14所示,Dremel采用多层并层级向上汇报的方式实现数据运算后的汇
4 M1 q4 N& j* W聚,即:
" s% k, `) A/ Q. {0 M- B图 13-14 Dremel系统架构
. k+ A- Y R/ Y! {. m* Q●叶子节点执行查询后得到部分结果向上层中间节点汇报;" {$ B/ r! }7 ^4 k9 v
●中间节点再向上层中间节点汇报(此层可以重复几次或零次);" \/ ]* M/ U% q/ w3 {4 a4 T
●中间节点向根节点汇报最终结果。
: I' e Z0 D: K$ p- nDremel要求数据在向上层汇报中,是可以聚集的,也就是说,在逐级上报的过, ?5 J. c- F1 t0 Z$ u5 x5 q# W. I1 o8 O
程中数据量不断变小,最终的结果不会很大,确保在一台机器能够承受的范围。3 \$ v* Q: @4 W1 F, B$ j
2.Dremel与MapReduce的比较; B( E4 c* q6 X1 c5 ?
MapReduce的输出结果直接由reduce任务写入到分布式文件系统,因此,只要" x9 L# C4 P- X) p
reduce任务个数足够多,输出结果可以很大;而Dremel中的最终数据汇聚到一个根节' U; R) j. Y X2 I. j+ l) ^
点,因此一般要求最终的结果集比较小,例如GB级别以下。0 v" Z" V# [9 g) R! R
Dremel的优势在于实时性,只要服务器个数足够多,大部分情况下能够在3秒以
: P8 n; k3 F; X- z内处理完成TB级别数据。" `" k! e5 Z; h* D' w6 w$ w" F
( X* `; \ R1 s& s/ k4 K7 A2 @ |
|