|
13.5 实时分析
2 ?9 R8 q9 M4 F! W海量数据离线分析对于MapReduce这样的批处理系统挑战并不大,如果要求实2 W7 H( i- ^+ Z, ~2 K1 Z1 C
时,又分为两种情况:如果查询模式单一,那么,可以通过MapReduce预处理后将最
( W/ {! C& k% a! g' D7 o终结果导入到在线系统提供实时查询;如果查询模式复杂,例如涉及多个列任意组; c, ` }+ S* [3 L( x/ a
合查询,那么,只能通过实时分析系统解决。实时分析系统融合了并行数据库和云2 j7 h# v+ C! B" Z6 o
计算这两类技术,能够从海量数据中快速分析出汇总结果。
* Z& k4 g0 G& \* Y" c- H13.5.1 MPP架构
; x3 B( B9 `* g/ @7 a; _并行数据库往往采用MPP(Massively Parallel Processing,大规模并行处理)架
4 N- o4 _; u0 z3 [& D( A0 G5 F0 l构。MPP架构是一种不共享的结构,每个节点可以运行自己的操作系统、数据库
0 Y$ k+ M' s( N% y- h, P) b等。每个节点内的CPU不能访问另一个节点的内存,节点之间的信息交互是通过节8 T: q, }& L! T0 _/ Q
点互联网络实现的。
/ g8 A& M9 i9 g, P$ k如图13-9所示,将数据分布到多个节点,每个节点扫描本地数据,并由Merge操$ a8 w. M& V! {7 v( W
作符执行结果汇总。& M4 \1 W. T x) j* P+ Z
图 13-9 MPP Merge操作符
?# j& c4 e) Z. ^8 o4 l5 {5 H常见的数据分布算法有两种:
5 C# D, j* U: i1 s, j: N! r●范围分区(Range partitioning):按照范围划分数据。( v& b6 r: D+ l# C7 S( u
●哈希分区(Hashing):根据哈希函数计算结果将每个元组分配给相应的节
2 i+ Y( \ u7 S, P( t- X- [6 }点。
+ k1 C" C6 L' G+ ~Merge操作符:系统中存在一个或者多个合并节点,它会发送命令给各个数据分
6 ?: g: W# ?: C) U& u! y/ {5 _片请求相应的数据,每个数据分片所在的节点扫描本地数据,排序后回复合并节2 A% Q7 ^# U: a9 `' l( D
点,由合并节点通过merge操作符执行数据汇总。Merge操作符是一个统称,涉及的5 f$ c3 ~6 s% r' Q
操作可能是limit、order by、group by、join等。这个过程相当于执行一个Reduce任务
. ?" q6 u" D% B个数为1的MapReduce作业,不同的是,这里不需要考虑执行过程中服务器出现故障# y# f0 A3 P, E% y
的情况。, s9 F# `* i% b5 T
如果Merge节点处理的数据量特别大,可以通过Split操作符将数据划分到多个节
2 v# }) r0 U" u e( K/ d1 u( i点,每个节点对一部分数据执行group by、join等操作后再合并最终结果。$ D3 }) @( H$ w, p2 s. u
如图13-10,假如需要执行"select*from A,B where A.x=B.y",可以分别根据A.x和. j4 o; q5 c9 H) d4 O7 o
B.x的哈希值将表A和B划分为A0、A1以及B0、B1。由两个节点分别对A0、B0以及3 [6 K& E' k) |! Q- h6 a% m2 a
A1、B1执行join操作后再合并join结果。6 k+ v: Q$ c1 h8 I: J0 N! r
图 13-10 MPP Split操作符
8 B" W1 T- m/ R: O) |并行数据库的SQL查询和MapReduce计算有些类似,可以认为MapReduce模型是4 {7 K, {8 }/ p L( T( G+ I) r
一种更高层次的抽象。由于考虑问题的角度不同,并行数据库处理的SQL查询执行时3 h) }6 Z3 n3 {) H0 X9 Y
间通常很短,出现异常时整个操作重做即可,不需要像MapReduce实现那样引入一个. d) |, y4 X5 K8 @) F( J3 Q1 k
主控节点管理计算节点,监控计算节点故障,启动备份任务等。" J0 U8 T" Z- ~3 {5 X
13.5.2 EMC Greenplum
/ t! t, e% O( } rGreenplum是EMC公司研发的一款采用MPP架构的OLAP产品,底层基于开源的+ Y# b/ r3 ]0 m6 u. E
PostgreSQL数据库。
5 g8 C+ J( L D# h4 w1.整体架构6 ~6 q5 K Z# ]( \" s2 h/ t
如图13-11,Greenplum系统主要包含两种角色:Master服务器(Master Server)# }* p( P2 g1 Z! w! _+ u+ I
和Segment服务器(Segment Server)。在Greenplum中每个表都是分布在所有节点上
) F6 E& D$ X y4 w/ c, {的。Master服务器首先对表的某个或多个列进行哈希运算,然后根据哈希结果将表的4 k4 w2 C5 O' Y6 O7 V
数据分布到Segment服务器中。整个过程中Master服务器不存放任何用户数据,只是+ W }% a2 I% {% P) S
对客户端进行访问控制和存储表分布逻辑的元数据。! B. j% E; A2 X1 |6 K7 w
图 13-11 Greenplum整体架构0 x3 T8 T5 A' n, R4 e, Z. Z% v
Greenplum支持两种访问方式:SQL和MapReduce。用户将SQL操作语句发送给& x; n- k; t. Z: ?1 J0 T) l
Master服务器,由Master服务器执行词法分析、语法分析,生成查询计划,并将查询& e8 h2 c+ V$ g7 K- J$ n3 @
请求分发给多台Segment服务器。每个Segment服务器返回部分结果后,Master服务器! Z# b3 p' y9 ^
会进行聚合并将最终结果返回给用户。除了高效查询,Greenplum还支持通过数据的
1 g ~8 i1 m/ i g并行装载,将外部数据并行装载到所有的Segement服务器。2 M; }- }1 q8 c5 u
2.并行查询优化器1 z6 W+ `7 K! O" e; [- [6 Z& w
Greenplum的并行查询优化器负责将用户的SQL或者MapReduce请求转化为物理7 H5 _# s% h' [ z6 m
执行计划。Greenplum采用基于代价的查询优化算法(cost-based optimization),从各. |) T) M( b' L4 \" R$ h5 j
种可能的查询计划中选择一个代价最小的。Greenplum优化器会考虑集群全局统计信
1 K# o0 I J2 ^% t6 l; H息,例如数据分布,另外,除了考虑单机执行的CPU、内存资源消耗,还需要考虑
6 T5 |) w* V3 z5 |2 d数据的网络传输开销。
/ T8 s; f8 m0 yGreenplum除了生成传统关系数据库的物理运算符,包括表格扫描(Scan)、过+ K3 \! m. V) ?3 ~
滤(Filter)、聚集(Aggregation)、排序(Sort)、联表(Join),还会生成一些并
9 Q0 s$ p" {9 Q! n+ b$ R( }行运算符,用来描述查询执行过程中如何在节点之间传输数据。: N0 M/ n7 ?1 A" N0 ]4 U
●广播(Broadcast,N:N):每个计算节点将目标数据发送给所有其他节点。; v- R* K- y! k3 p
●重新分布(Redistribute,N:N):类似MapReduce中的shuffle过程,每个计算节3 ^: C. Q( O6 v2 [ h; _: E
点将目标数据重新哈希后分散到所有其他节点。6 d( o% p3 l- l9 h6 ]
●汇总(Gather,N:1):所有的计算节点将目标数据发送给某个节点(一般为
# |1 }' q" D9 c2 ZMaster服务器)。
: V) h4 a5 S* g% Y* U图13-12中有四张表格:订单信息表(orders),订单项表(lineitem),顾客信% l$ B1 r2 x2 V6 z
息表(customer)以及顾客国籍表(nation)。其中,orders表记录了订单的基本信' Q4 j# S1 ]3 u; @) u
息,包括订单主键(o_orderkey)、顾客主键(o_custkey)和订单发生日期
2 Y0 r4 x- q# v1 I4 q(o_orderdate);lineitem表记录了订单项信息,包括订单主键(l_orderkey)和订单
) ?9 |' U* M$ A7 U9 {金额(l_price);customer表记录了顾客的基本信息,包括顾客主键(c_custkey)和
, s! l* Y/ r$ @* q0 q顾客国籍主键(c_nationkey);nation表记录了顾客的国籍信息,包括国籍主键/ N7 s- `! m N7 X
(n_nationkey)和国籍名称(n_name)。Orders表和lineitem表通过订单主键关联,0 x1 \- B ]: e w
orders表和customer表通过顾客主键关联,customer表和nation通过国籍主键关联。左! l3 }8 d* F4 ?2 z" v; a
边的SQL语句查询订单发生日期在1994年8月1日开始三个月内的所有订单,按照顾客" p0 ]8 U( r% V1 E) k8 k1 l2 f4 n
分组,计算每个分组的所有订单交易额,并按照交易额逆序排列。在右边的物理查! ?. d$ u) H! `( _
询计划中,首先分别对lineitem和orders,custom和nation执行联表操作,联表后生成
4 z0 f0 Y: l1 w1 P的结果分别记为Join_table1和Join_table2。接着,再对Join_table1和Join_table2执行联( A+ Y" n& o/ m4 d6 T
表操作。其中,custom和nation联表时会将nation表格的数据广播(Broadcast)到所有
7 v, a( b& a* o ^的计算节点(共4个);Join_table1和Join_table2联表时会将Join_table1按照Join列6 T; i0 Z6 @% _/ X0 `0 a" l$ m7 X
(o_custkey)哈希后重新分布(Redistribute)到所有的计算节点。最后,每个计算节9 H' r% O A# D/ I i
点都有一部分Join_table1和Join_table2的数据,且Join列(o_custkey以及c_custkey)相
) Q& s& C6 U) Q4 p) G同的数据分布在同一个计算节点,每个计算节点分别执行Hash Join、HashAggregate
* q2 _& y; q& F( G' V以及Sort操作。最后,将每个计算节点上的部分结果汇总(Gather)到Master服务
# H$ Q! }* f$ {. [( |5 x0 N: c: h器,整个SQL语句执行完成。
1 o C. @0 a: ?2 U: D7 a图 13-12 Greenplum查询优化示例+ D) K6 j2 ~8 O) C
13.5.3 HP Vertica
) f" v' K9 K7 [% M. ~; Z* J- dVertica是Michael Stonebraker的学术研究项目C-Store的商业版本,并最终被惠普 f+ k# m, s ]/ D) C# L! E4 {
公司收购。Vertica在架构上与OceanBase有相似之处,这里介绍其中一些有趣的思
; P8 J# b2 E. @想。
0 n. O( [( H# B) ~ d9 N1.混合存储模型
5 l% u4 `0 Y. Q! N( c. ^" G6 OVertica的数据包含两个部分:ROS(Read-Optimized Storage)以及WOS(Write-
0 N5 c; m3 k. u* M) e7 |3 z2 ^$ |3 ^Optimized Storage),WOS的数据在内存中且不排序和加索引,ROS的数据在磁盘中
, \8 m# B1 p" C6 q有序且压缩存储。后台的"TUPLE MOVER"会不断地将数据从WOS读出并往ROS更新) C! i5 s. u7 P7 X
(同时完成排序和索引)。Vertica的这种设计和OceanBase很相似,ROS对应
% E$ ]' T( R- ~! N& `OceanBase中的ChunkServer,WOS对应OceanBase中的UpdateServer。由于后台采
$ q6 m7 X/ S+ j& ^, H用"BULK"的方式批量更新,性能非常好。
" i- g( {' h. u# W0 f5 N2.多映射(Projections)存储
: C+ L0 d1 ^8 q. c K) EVertica没有采用传统关系数据库的B树索引,而是冗余存储一张表格的多个视5 C& v- L6 h% S. r' p
图,定义为映射。! W+ z2 m/ h. Z* O- t
每个映射包含表格的部分列,可以分别对不同的映射定义不同的排序主键。如
; s$ Z6 c% G* d图13-13所示,系统中有一张表格逻辑上包含5列<A,B,C,D,E>,物理存储成三个映6 H$ ` v4 P/ v' L3 z2 E
射,分别为:Projection1(A,B,C,主键为<A,B>),Projection2(A,B,C,主键为<
$ N3 B' d8 l+ DB,A>)和Projection3(B,D,E,主键为<B>)。, M- `; W9 Q, v
图 13-13 vertica projections示例
2 p7 a8 i2 w- T) ?) A% f" C' _a)"select A,B,C from table where A=1"=>查询Projection17 O. x" D9 J' O5 A4 D
b)"select A,B,C from table where B=1"=>查询Projection2+ q! h# S8 s/ t& p
c)"select B,D from table where B=1"=>查询Projection3$ _1 \/ h9 L& Q1 [. ^; u
Vertica通常维护多个不同排序的有重叠的映射,尽量使得每个查询的数据只来自
; [& W1 u! o# N9 Y& @一个映射,以提高查询性能。为了支持任意列查询,需要保证每个列至少在一个映
: L6 N' g4 `+ o2 X( j射中出现。: `$ U+ C7 k, `2 N; r
3.列式存储8 R; _2 U4 N; E* o/ I6 t" O
Vertica中的每一列数据独立存储在磁盘中的连续块上。查询数据时,Vertica只需7 [0 _% f" e* t$ f
要读取那些需要的列,而不是被选择的行的所有的列数据。
" d. |0 ]. Y; o4.压缩技术: \+ N8 w! V' k% [+ O
Vertica根据数据类型、基数(可能的取值个数)、排序自动对数据进行压缩,从$ V* {) `' v0 [: Z. r! O$ r: _3 }
而最小化每列占用的空间。常用的压缩算法包括:6 p& z! ~! v& @2 R# e" l! L' X/ Z
●Run Length Encoding:列类型为整数,基数较小且有序;
, W# k2 N! C$ W0 ]' ?+ I; c$ h●位图索引:列类型为整数,基数较小;/ }7 f7 U ]' ?* T3 I
●按块字典压缩:列类型为字符串且基数较小;
7 ]% C9 O8 w, n) k& E●LZ通用压缩算法:其他列值特征不明显的场景。# I4 c6 T) w' s% N) p$ U
基于列的压缩由于同样的数据类型和相同的取值范围,通常会大幅度提高压缩
`6 @5 G2 h; Y6 \) K# |% ] i) E% r效果。另外,vertica还支持直接在压缩后的数据上做运算。* z* B) ^4 A% j b6 ~% i4 v
13.5.4 Google Dremel
, {5 B4 Q6 G3 w0 wGoogle Dremel是Google的实时分析系统,可以扩展到上千台机器规模,处理PB
7 Z: a0 \( D" p$ z: w级别的数据。Dremel还是Google Bigquery服务的底层存储和查询引擎。相比传统的并 d) S* X5 f; R( m
行数据库,Dremel的优势在于可扩展性,磁盘的顺序读取速度在100MB/s上下,而
. z8 Y' |: q3 u$ E. ZDremel能够在1秒内处理1TB的数据,即使压缩率为10:1,也至少需要1000个磁盘并
9 X# I8 w p! k发读。* W1 ^7 W- q8 P( K
1.系统架构+ ~$ ]! U* O7 ^) K5 ^1 x
Dremel系统融合了并行数据库和Web搜索技术。首先,它借鉴了Web搜索中
8 H! q; A/ N4 ^& U# A的“查询树”的概念,将一个巨大复杂的查询,分割成大量较小的查询,使其能并发: }) L s% j1 R* c, _+ A7 \3 q8 p
地在大量节点上执行。其次,和并行数据库类似,Dremel提供了一个SQL-like的接
, Y9 R1 Z( j( U. U6 F口,且支持列式存储。2 G& C# O1 Y4 h; d. E6 [7 \6 T
如图13-14所示,Dremel采用多层并层级向上汇报的方式实现数据运算后的汇
, t9 c Z1 e% |$ j2 l聚,即:
! W# a y0 [3 Q3 j0 U' n9 K/ D, x图 13-14 Dremel系统架构
$ P7 w& E% J z6 `; |5 d; c●叶子节点执行查询后得到部分结果向上层中间节点汇报;, ?$ F2 u' Z( o" P* y$ o
●中间节点再向上层中间节点汇报(此层可以重复几次或零次);/ r# E! ]; L) y7 ^9 @
●中间节点向根节点汇报最终结果。9 @; ^; `7 @+ V$ E
Dremel要求数据在向上层汇报中,是可以聚集的,也就是说,在逐级上报的过
: m6 d* b, W0 m, P: M7 e+ t: g3 N程中数据量不断变小,最终的结果不会很大,确保在一台机器能够承受的范围。% I7 R2 w6 B/ j% a4 G# l* T
2.Dremel与MapReduce的比较: D1 u1 |6 c# d9 q% m9 O
MapReduce的输出结果直接由reduce任务写入到分布式文件系统,因此,只要. m5 A% r+ m2 w( z/ k) J3 x
reduce任务个数足够多,输出结果可以很大;而Dremel中的最终数据汇聚到一个根节 Q/ Z, K/ R+ v" j" g" v$ v
点,因此一般要求最终的结果集比较小,例如GB级别以下。9 Z# q; v, }1 H: o: @) ` D
Dremel的优势在于实时性,只要服务器个数足够多,大部分情况下能够在3秒以
: `+ z/ d* N) p2 W* X- x' D内处理完成TB级别数据。
' p, S; ^2 |, f3 N- N6 F' N, U- [* F% j, o, O. M9 k I7 t
|
|