乐趣区

关于java:MPP相关

一、MPP 倒退历程

1、SMP(Symmetric Multi-Processor)


所谓对称多处理器构造,是指服务器中多个 CPU 对称工作,无主次或从属关系。各 CPU 共享雷同的物理内存,每个 CPU 拜访内存中的任何地址所需工夫是雷同的,因而 SMP 也被称为统一存储器拜访构造 (UMA:Uniform Memory Access)。对 SMP 服务器进行扩大的形式包含减少内存、应用更快的 CPU、减少 CPU、裁减 I /O(槽口数与总线数) 以及增加更多的外部设备 (通常是磁盘存储)。
SMP 服务器的次要特色是共享,零碎中所有资源(CPU、内存、I/ O 等) 都是共享的。也正是因为这种特色,导致了 SMP 服务器的次要问题,那就是它的扩大能力十分无限。对于 SMP 服务器而言,每一个共享的环节都可能造成 SMP 服务器扩大时的瓶颈,而最受限制的则是内存。因为每个 CPU 必须通过雷同的内存总线拜访雷同的内存资源,因而随着 CPU 数量的减少,内存拜访抵触将迅速减少,最终会造成 CPU 资源的节约,使 CPU 性能的有效性大大降低。

有试验数据表明,SMP 型的服务器 CPU 最好是 2 - 4 颗就 OK 了,多余的就节约了。

2、NUMA(Non-Uniform Memory Access)


因为 SMP 在扩大能力上的限度,人们开始探索如何进行无效地扩大从而构建大型零碎的技术,NUMA 就是这种致力下的后果之一。利用 NUMA 技术,能够把几十个 CPU(甚至上百个 CPU)组合在一个服务器内。NUMA 服务器的基本特征是具备多个 CPU 模块,每个 CPU 模块由多个 CPU(如 4 个)组成,并且具备独立的本地内存、I/ O 槽口等。因为其节点之间能够通过互联模块 (如称为 Crossbar Switch) 进行连贯和信息交互,因而每个 CPU 能够拜访整个零碎的内存 (这是 NUMA 零碎与 MPP 零碎的重要差异)。显然,拜访本地内存的速度将远远高于拜访远地内存(零碎内其它节点的内存) 的速度,这也是非统一存储拜访 NUMA 的由来。因为这个特点,为了更好地施展零碎性能,开发应用程序时须要尽量减少不同 CPU 模块之间的信息交互。利用 NUMA 技术,能够较好地解决原来 SMP 零碎的扩大问题,在一个物理服务器内能够反对上百个 CPU。比拟典型的 NUMA 服务器的例子包含 HP 的 Superdome、SUN15K、IBMp690 等。

每个 CPU 模块之间都是通过互联模块进行连贯和信息交互,CPU 都是互通互联的,同时,每个 CPU 模块均匀划分为若干个 Chip(不多于 4 个),每个 Chip 都有本人的内存控制器及内存插槽。

在 NUMA 中还有三个节点的概念:
1)本地节点: 对于某个节点中的所有 CPU,此节点称为本地节点。
2)街坊节点: 与本地节点相邻的节点称为街坊节点。
3)远端节点: 非本地节点或街坊节点的节点,称为远端节点。
4)街坊节点和远端节点, 都称作非本地节点(Off Node)。

CPU 拜访不同类型节点内存的速度是不雷同的,拜访本地节点的速度最快,拜访远端节点的速度最慢,即访问速度与节点的间隔无关,间隔越远访问速度越慢,此间隔称作 Node Distance。应用程序要尽量的缩小不通 CPU 模块之间的交互,如果应用程序能有办法固定在一个 CPU 模块里,那么利用的性能将会有很大的晋升。

3、MPP(Massively Parallel Processing)

MPP 是将工作并行的扩散到多个服务器和节点上,在每个节点上计算实现后,将各自局部的后果汇总在一起失去最终的后果 (与 Hadoop 类似)。MPP 的零碎扩大和 NUMA 不同,MPP 是由多台 SMP 服务器通过肯定的节点互联网络进行连贯,协同工作,实现雷同的工作,从用户的角度来看是一个服务器零碎。每个节点只拜访本人的资源,所以是一种齐全无共享(Share Nothing)构造。

(1)MPP 构造扩大能力最强,实践能够有限扩大。因为 MPP 是多台 SPM 服务器连贯的,每个节点的 CPU 不能拜访另一个节点内存,所以也不存在异地拜访的问题。
(2) 每个节点内的 CPU 不能拜访另一个节点的内存,节点之间的信息交互是通过节点互联网络实现的,这个过程称为数据重调配。
(3)MPP 服务器须要一种简单的机制来调度和均衡各个节点的负载和并行处理过程。目前,一些基于 MPP 技术的服务器往往通过零碎级软件(如数据库)来屏蔽这种复杂性。举个例子,Teradata 就是基于 MPP 技术的一个关系数据库软件(这是最早采纳 MPP 架构的数据库),基于此数据库来开发利用时,不论后盾服务器由多少节点组成,开发人员面对的都是同一个数据库系统,而无需思考如何调度其中某几个节点的负载。

MPP 架构特色:(1)工作并行执行;(2)数据分布式存储(本地化);(3)分布式计算;(4)高并发,单个节点并发能力大于 300 用户;(5)横向扩大,反对集群节点的扩容;(6)Shared Nothing(齐全无共享)架构;(7)公有资源。

MPP 和 NUMA:
相同点 :首先 NUMA 和 MPP 都是由多个节点组成的;其次每个节点都有本人的 CPU,内存,I/O 等;都能够都过节点互联机制进行信息交互。
不同点:首先是节点互联机制不同,NUMA 的节点互联是在同一台物理服务器外部实现的,MPP 的节点互联是在不同的 SMP 服务器内部通过 I/O 实现的。其次是内存拜访机制不同,在 NUMA 服务器外部,任何一个 CPU 都能够拜访整个零碎的内存,但异地内存拜访的性能远远低于本地内存拜访,因而,在开发应用程序时应该尽量避免异地内存拜访。而在 MPP 服务器中,每个节点只拜访本地内存,不存在异地内存拜访问题。

二、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 架构的 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、罕用的引擎比照

Reference

https://www.jianshu.com/p/060…
https://blog.csdn.net/wylfeng…
https://zhuanlan.zhihu.com/p/…
https://www.eefocus.com/embed…

退出移动版