进入主页,点击右上角“设为星标”web
比别人更快接收好文章面试
面试官:说下你知道的MPP架构的计算引擎?
sql
这个问题很多小伙伴在面试时都遇到过,由于对MPP这个概念了解较少,很多人都卡壳了,可是咱们经常使用的大数据计算引擎有不少都是MPP架构的,像咱们熟悉的Impala、ClickHouse、Druid、Doris等都是MPP架构。数据库
采用MPP架构的不少OLAP引擎号称:亿级秒开。服务器
本文分为三部分讲解,第一部分详解MPP架构,第二部分剖析MPP架构与批处理架构的异同点,第三部分是采用MPP架构的OLAP引擎介绍。微信
1、MPP架构
MPP是系统架构角度的一种服务器分类方法。网络
目前商用的服务器分类大致有三种:架构
-
SMP(对称多处理器结构) -
NUMA(非一致存储访问结构) -
MPP(大规模并行处理结构)
咱们今天的主角是 MPP,由于随着分布式、并行化技术成熟应用,MPP引擎逐渐表现出强大的高吞吐、低时延计算能力,有不少采用MPP架构的引擎都能达到“亿级秒开”。并发
先了解下这三种结构:app
1. SMP
即对称多处理器结构,就是指服务器的多个CPU对称工做,无主次或从属关系。SMP服务器的主要特征是共享,系统中的全部资源(如CPU、内存、I/O等)都是共享的。也正是因为这种特征,致使了SMP服务器的主要问题,即扩展能力很是有限。
2. NUMA
即非一致存储访问结构。这种结构就是为了解决SMP扩展能力不足的问题,利用NUMA技术,能够把几十个CPU组合在一台服务器内。NUMA的基本特征是拥有多个CPU模块,节点之间能够经过互联模块进行链接和信息交互,因此,每一个CPU能够访问整个系统的内存(这是与MPP系统的重要区别)。可是访问的速度是不同的,由于CPU访问本地内存的速度远远高于系统内其余节点的内存速度,这也是非一致存储访问NUMA的由来。
这种结构也有必定的缺陷,因为访问异地内存的时延远远超过访问本地内存,所以,当CPU数量增长时,系统性能没法线性增长。
3. MPP
即大规模并行处理结构。MPP的系统扩展和NUMA不一样,MPP是由多台SMP服务器经过必定的节点互联网络进行链接,协同工做,完成相同的任务,从用户的角度来看是一个服务器系统。每一个节点只访问本身的资源,因此是一种彻底无共享(Share Nothing)结构。
MPP结构扩展能力最强,理论能够无限扩展。因为MPP是多台SPM服务器链接的,每一个节点的CPU不能访问另外一个节点内存,因此也不存在异地访问的问题。
MPP架构图:

每一个节点内的CPU不能访问另外一个节点的内存,节点之间的信息交互是经过节点互联网络实现的,这个过程称为数据重分配。
可是MPP服务器须要一种复杂的机制来调度和平衡各个节点的负载和并行处理过程。目前,一些基于MPP技术的服务器每每经过系统级软件(如数据库)来屏蔽这种复杂性。举个例子,Teradata就是基于MPP技术的一个关系数据库软件(这是最先采用MPP架构的数据库),基于此数据库来开发应用时,无论后台服务器由多少节点组成,开发人员面对的都是同一个数据库系统,而无需考虑如何调度其中某几个节点的负载。
MPP架构特征:
-
任务并行执行; -
数据分布式存储(本地化); -
分布式计算; -
高并发,单个节点并发能力大于300用户; -
横向扩展,支持集群节点的扩容; -
Shared Nothing(彻底无共享)架构。
NUMA和MPP区别:
两者有许多类似之处,首先NUMA和MPP都是由多个节点组成的;其次每一个节点都有本身的CPU,内存,I/O等;均可以都过节点互联机制进行信息交互。
那它们的区别是什么呢,首先是节点互联机制不一样,NUMA的节点互联是在同一台物理服务器内部实现的,MPP的节点互联是在不一样的SMP服务器外部经过I/O实现的。
其次是内存访问机制不一样,在NUMA服务器内部,任何一个CPU均可以访问整个系统的内存,但异地内存访问的性能远远低于本地内存访问,所以,在开发应用程序时应该尽可能避免异地内存访问。而在MPP服务器中,每一个节点只访问本地内存,不存在异地内存访问问题。
2、批处理架构和MPP架构
批处理架构(如 MapReduce)与MPP架构的异同点,以及它们各自的优缺点是什么呢?
相同点:
批处理架构与MPP架构都是分布式并行处理,将任务并行的分散到多个服务器和节点上,在每一个节点上计算完成后,将各自部分的结果汇总在一块儿获得最终的结果。
不一样点:
批处理架构和MPP架构的不一样点能够举例来讲:咱们执行一个任务,首先这个任务会被分红多个task执行,对于MapReduce来讲,这些tasks被随机的分配在空闲的Executor上;而对于MPP架构的引擎来讲,每一个处理数据的task被绑定到持有该数据切片的指定Executor上。
正是因为以上的不一样,使得两种架构有各自优点也有各自缺陷:
-
批处理的优点:
对于批处理架构来讲,若是某个Executor执行过慢,那么这个Executor会慢慢分配到更少的task执行,批处理架构有个推测执行策略,推测出某个Executor执行过慢或者有故障,则在接下来分配task时就会较少的分配给它或者直接不分配,这样就不会由于某个节点出现问题而致使集群的性能受限。
-
批处理的缺陷:
任何事情都是有代价的,对于批处理而言,它的优点也形成了它的缺点,会将中间结果写入到磁盘中,这严重限制了处理数据的性能。
-
MPP的优点:
MPP架构不须要将中间数据写入磁盘,由于一个单一的Executor只处理一个单一的task,所以能够简单直接将数据stream到下一个执行阶段。这个过程称为pipelining
,它提供了很大的性能提高。
-
MPP的缺陷:
对于MPP架构来讲,由于task和Executor是绑定的,若是某个Executor执行过慢或故障,将会致使整个集群的性能就会受限于这个故障节点的执行速度(所谓木桶的短板效应),因此MPP架构的最大缺陷就是——短板效应。另外一点,集群中的节点越多,则某个节点出现问题的几率越大,而一旦有节点出现问题,对于MPP架构来讲,将致使整个集群性能受限,因此通常实际生产中MPP架构的集群节点不易过多。
举个例子来讲下两种架构的数据落盘:要实现两个大表的join操做,对于批处理而言,如Spark将会写磁盘三次(第一次写入:表1根据join key
进行shuffle;第二次写入:表2根据join key
进行shuffle;第三次写入:Hash表写入磁盘), 而MPP只须要一次写入(Hash表写入)。这是由于MPP将mapper和reducer同时运行,而MapReduce将它们分红有依赖关系的tasks(DAG),这些task是异步执行的,所以必须经过写入中间数据共享内存来解决数据的依赖。
批处理架构和MPP架构融合:
两个架构的优点和缺陷都很明显,而且它们有互补关系,若是咱们能将两者结合起来使用,是否是就能发挥各自最大的优点。目前批处理和MPP也确实正在逐渐走向融合,也已经有了一些设计方案,技术成熟后,可能会风靡大数据领域,咱们拭目以待!
3、 MPP架构的OLAP引擎
采用MPP架构的OLAP引擎有不少,下面只选择常见的几个引擎对比下,可为公司的技术选型提供参考。
采用MPP架构的OLAP引擎分为两类,一类是自身不存储数据,只负责计算的引擎;一类是自身既存储数据,也负责计算的引擎。
1)只负责计算,不负责存储的引擎
1. Impala
Apache Impala是采用MPP架构的查询引擎,自己不存储任何数据,直接使用内存进行计算,兼顾数据仓库,具备实时,批处理,多并发等优势。
提供了类SQL(类Hsql)语法,在多用户场景下也能拥有较高的响应速度和吞吐量。它是由Java和C++实现的,Java提供的查询交互的接口和实现,C++实现了查询引擎部分。
Impala支持共享Hive Metastore,但没有再使用缓慢的 Hive+MapReduce 批处理,而是经过使用与商用并行关系数据库中相似的分布式查询引擎(由 Query Planner、Query Coordinator 和 Query Exec Engine 三部分组成),能够直接从 HDFS 或 HBase 中用 SELECT、JOIN 和统计函数查询数据,从而大大下降了延迟。
Impala常常搭配存储引擎Kudu一块儿提供服务,这么作最大的优点是查询比较快,而且支持数据的Update和Delete。
2. Presto
Presto是一个分布式的采用MPP架构的查询引擎,自己并不存储数据,可是能够接入多种数据源,而且支持跨数据源的级联查询。Presto是一个OLAP的工具,擅长对海量数据进行复杂的分析;可是对于OLTP场景,并非Presto所擅长,因此不要把Presto当作数据库来使用。
Presto是一个低延迟高并发的内存计算引擎。须要从其余数据源获取数据来进行运算分析,它能够链接多种数据源,包括Hive、RDBMS(Mysql、Oracle、Tidb等)、Kafka、MongoDB、Redis等。
2)既负责计算,又负责存储的引擎
1. ClickHouse
ClickHouse是近年来备受关注的开源列式数据库,主要用于数据分析(OLAP)领域。
它自包含了存储和计算能力,彻底自主实现了高可用,并且支持完整的SQL语法包括JOIN等,技术上有着明显优点。相比于hadoop体系,以数据库的方式来作大数据处理更加简单易用,学习成本低且灵活度高。当前社区仍旧在迅猛发展中,而且在国内社区也很是火热,各个大厂纷纷跟进大规模使用。
ClickHouse在计算层作了很是细致的工做,竭尽所能榨干硬件能力,提高查询速度。它实现了单机多核并行、分布式计算、向量化执行与SIMD指令、代码生成等多种重要技术。
ClickHouse从OLAP场景需求出发,定制开发了一套全新的高效列式存储引擎,而且实现了数据有序存储、主键索引、稀疏索引、数据Sharding、数据Partitioning、TTL、主备复制等丰富功能。以上功能共同为ClickHouse极速的分析性能奠基了基础。
2. Doris
Doris是百度主导的,根据Google Mesa论文和Impala项目改写的一个大数据分析引擎,是一个海量分布式 KV 存储系统,其设计目标是支持中等规模高可用可伸缩的 KV 存储集群。
Doris能够实现海量存储,线性伸缩、平滑扩容,自动容错、故障转移,高并发,且运维成本低。部署规模,建议部署4-100+台服务器。
Doris3 的主要架构:DT(Data Transfer)负责数据导入、DS(Data Seacher)模块负责数据查询、DM(Data Master)模块负责集群元数据管理,数据则存储在 Armor 分布式 Key-Value 引擎中。Doris3 依赖 ZooKeeper 存储元数据,从而其余模块依赖 ZooKeeper 作到了无状态,进而整个系统可以作到无端障单点。
3. Druid
Druid是一个开源、分布式、面向列式存储的实时分析数据存储系统。
Druid的关键特性以下:
-
亚秒级的OLAP查询分析:采用了 列式存储、倒排索引、位图索引等关键技术; -
在亚秒级别内完成海量数据的过滤、聚合以及多维分析等操做; -
实时流数据分析:Druid提供了实时流数据分析,以及高效实时写入; -
实时数据在亚秒级内的可视化; -
丰富的数据分析功能:Druid提供了友好的可视化界面; -
SQL查询语言; -
高可用性与高可拓展性: -
Druid工做节点功能单一,不相互依赖; -
Druid集群在管理、容错、灾备、扩容都很容易;
4. TiDB
TiDB 是 PingCAP 公司自主设计、研发的开源分布式关系型数据库,是一款同时支持OLTP与OLAP的融合型分布式数据库产品。
TiDB 兼容 MySQL 5.7 协议和 MySQL 生态等重要特性。目标是为用户提供一站式 OLTP 、OLAP 、HTAP 解决方案。TiDB 适合高可用、强一致要求较高、数据规模较大等各类应用场景。
5. Greenplum
Greenplum 是在开源的 PostgreSQL 的基础上采用了MPP架构的性能很是强大的关系型分布式数据库。为了兼容Hadoop生态,又推出了HAWQ,分析引擎保留了Greenplum的高性能引擎,下层存储再也不采用本地硬盘而改用HDFS,规避本地硬盘可靠性差的问题,同时融入Hadoop生态。
3)经常使用的引擎对比
一张图总结下经常使用的OLAP引擎对比:

-- END --
扫描二维码
收获更多技术
五分钟学大数据

点个在看,支持一下
本文分享自微信公众号 - 五分钟学大数据(gh_d4a7af3ecd50)。
若有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一块儿分享。