当前位置: 首页 > 科技观察

MPP大规模并行处理架构详解

时间:2023-03-13 03:30:52 科技观察

本文转载自微信公众号《五分钟学大数据》,作者袁墨。转载本文请联系五分钟学大数据公众号.面试官:说说你知道的MPP架构的计算引擎?很多朋友在面试的时候遇到过这个问题,因为对MPP的概念不太了解,很多人卡壳了,但是我们经常用到的大数据很多计算引擎都是基于MPP架构的,比如我们熟悉的Impala、ClickHouse、Druid、Doris等都是MPP架构。许多使用MPP架构的OLAP引擎被称为:亿秒。本文分为三个部分。第一部分详细解释了MPP架构。第二部分分析了MPP架构与批处理架构的异同。第三部分介绍了使用MPP架构的OLAP引擎。一、MPP体系结构MPP是一种从系统体系结构的角度对服务器进行分类的方法。目前商业服务器的分类一般分为三种:SMP(对称多处理器架构)、NUMA(非统一内存访问架构)、MPP(大规模并行处理架构),我们今天的主角是MPP,因为随着分布式的成熟而对于并行技术应用,MPP引擎逐渐展现出强大的高吞吐量和低延迟计算能力,很多采用MPP架构的引擎都可以做到“亿级秒级”。首先了解这三种结构: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服务器通过一定的节点互联网络连接起来,它们协同工作,完成同一个任务。从用户的角度来看,它是一个服务器系统。每个节点只访问自己的资源,因此是一个完全不共享(ShareNothing)的结构。MPP结构的扩展能力最强,理论可以无限扩展。由于MPP由多个SPM服务器连接,每个节点的CPU无法访问另一个节点的内存,所以不存在远程访问的问题。MPP架构图:MPP架构中每个节点的CPU不能访问另一个节点的内存。节点间的信息交换是通过节点互连网络实现的。此过程称为数据重新分配。但是MPP服务器需要一个复杂的机制来调度和平衡各个节点的负载和并行处理。目前一些基于MPP技术的服务器往往通过系统级软件(如数据库)来屏蔽这种复杂性。例如Teradata是一款基于MPP技术的关系型数据库软件(这是第一个采用MPP架构的数据库)。基于该数据库开发应用时,无论后台服务器由多少个节点组成,开发者面对的都是同一个数据库系统,而无需考虑如何调度部分节点的负载。MPP架构的特点:并行执行任务;分布式数据存储(本地化);分布式计算;高并发,单节点并发能力大于300用户;横向扩展,支持集群节点的扩展;SharedNothing(完全不共享)架构。NUMA和MPP的区别:两者有很多相似之处。第一,NUMA和MPP是由多个节点组成的;第二,每个节点都有自己的CPU、内存、I/O等;两者可以通过节点互联机制进行信息交换。它们之间有什么区别?首先,节点互联机制不同。NUMA节点互连在同一物理服务器内部实现,MPP节点互连在不同SMP服务器外部通过I/O实现。其次,内存访问机制不同。在NUMA服务器中,任何一个CPU都可以访问整个系统的内存,但是远程内存访问的性能远低于本地内存访问。因此,在开发应用程序时应避免远程内存访问。.在MPP服务器中,每个节点只访问本地内存,不存在远程内存访问问题。2.批处理架构与MPP架构批处理架构(如MapReduce)与MPP架构有哪些异同,各自的优缺点?相同点:批处理架构和MPP架构都是分布式并行处理。并行分布到多个服务器和节点,在每个节点上完成计算后,将各个部分的结果进行聚合,得到最终的结果。区别:批处理架构和MPP架构的区别可以举个例子:当我们执行一个任务的时候,会先把这个任务分成多个任务来执行。对于MapReduce,这些任务是随机分配给空闲的Executor;对于MPP架构的引擎来说,每一个处理数据的任务都会绑定到指定的持有数据切片的Executor上。也正是因为以上的差异,两种架构各有优缺点:批处理的优点:对于批处理架构来说,如果一个Executor执行的太慢,Executor会被分配的任务逐渐变少Execution,批处理体系结构具有推测执行策略。如果推测某个Executor太慢或者有故障,在分配任务的时候会少分配或者不分配给它,这样就不会因为某个Executor导致集群性能受限节点有问题。批处理的缺陷:万物皆有价。对于批处理,它的优点也导致了它的缺点,中间结果会写入磁盘,严重限制了处理数据的性能。MPP的优点:MPP架构不需要将中间数据写入磁盘,因为单个Executor只处理单个任务,所以它可以简单地将数据流式传输到下一个执行阶段。这个过程称为流水线,它提供了很大的性能提升。MPP的缺陷:对于MPP架构来说,因为tasks和Executors是绑定的,如果一个Executor执行的太慢或者挂了,整个集群的性能会被故障节点的执行速度所限制(所谓woodenshort木桶板效应),所以MPP架构最大的缺陷就是短板效应。还有一点就是集群中的节点越多,某个节点出现问题的概率就越大。一旦某个节点出现问题,对于MPP架构来说,整个集群的性能都会受到限制。因此,一般来说,实际生产中的MPP架构不容易出现过多的集群节点。以下面两种架构的数据存储为例:实现两个大表的join操作,以批处理为例,Spark会写3次磁盘(第一次写:表1是根据joinkeyshuffle;第二次写入:表2根据joinkey进行shuffle;第三次写入:将Hash表写入磁盘),MPP只需要一次写入(Hashtablewrite)。这是因为MPP同时运行mapper和reducer,而MapReduce将它们划分为依赖任务(DAG)。这些任务是异步执行的,因此必须通过将中间数据写入共享内存来解决数据依赖性。批处理架构与MPP架构融合:两种架构优劣势明显,互为补充。如果能将两者结合起来,能否充分发挥各自的优势。目前批处理和MPP确实在逐渐融合,已经有了一些设计方案。技术成熟后,可能会在大数据领域大行其道。我们拭目以待!3.MPP架构的OLAP引擎有很多OLAP引擎使用MPP架构。以下仅选取几款常用发动机进行对比,可为企业技术选型提供参考。使用MPP架构的OLAP引擎分为两类,一类是本身不存储数据,只负责计算的引擎;另一个是存储数据的引擎,也负责计算。1)一个只负责计算,不负责存储的引擎1.ImpalaApacheImpala是一个使用MPP架构的查询引擎。它本身不存储任何数据,直接使用内存进行计算,兼顾数据仓库。具有实时、批处理、多并发等优点。提供类SQL(Hsql-like)语法,在多用户场景下也能有很高的响应速度和吞吐量。它由Java和C++实现,Java提供查询交互的接口和实现,C++实现查询引擎部分。Impala支持共享的HiveMetastore,但它没有使用慢速的Hive+MapReduce批处理,而是使用类似于商业并行关系数据库中使用的分布式查询引擎(由三部分组成:QueryPlanner、QueryCoordinator和QueryExecEngine)。可直接从HDFS或HBase查询数据,具备SELECT、JOIN、统计功能,大大降低延迟。Impala通常与存储引擎Kudu一起提供服务。这样做最大的好处是查询速度更快,支持数据Update和Delete。2.PrestoPresto是一个采用MPP架构的分布式查询引擎。本身不存储数据,但可以访问多个数据源,支持跨数据源的级联查询。Presto是一款擅长对海量数据进行复杂分析的OLAP工具;但是对于OLTP场景,并不是Presto擅长的,所以不要把Presto当数据库来用。Presto是一种低延迟、高并发的内存计算引擎。需要从其他数据源获取数据进行计算分析。可以连接多种数据源,包括Hive、RDBMS(Mysql、Oracle、Tidb等)、Kafka、MongoDB、Redis等。2)同时负责计算和存储的引擎1.ClickHouseClickHouse是开源的近年来备受关注的列式数据库,主要应用于数据分析(OLAP)领域。具有自包含的存储和计算能力,完全独立实现高可用,支持包括JOIN等完整的SQL语法,技术优势明显。与Hadoop系统相比,以数据库形式处理大数据更容易上手,学习成本低,灵活性高。现在的社区还在快速发展,在国内社区也很受欢迎,各大厂也纷纷跟进大规模使用。ClickHouse在计算层做了非常细致的工作,尽量压榨硬件能力,提高查询速度。实现了单机多核并行、分布式计算、向量化执行、SIMD指令、代码生成等多项重要技术。ClickHouse从OLAP场景需求出发,定制开发了一套全新的高效列式存储引擎,实现了数据有序存储、主键索引、稀疏索引、数据Sharding、数据Partitioning、TTL、master等丰富功能-备份复制等以上功能共同奠定了ClickHouse极速分析性能的基础。2.DorisDoris是百度主导的大数据分析引擎,基于GoogleMesa论文和Impala项目。是一个海量分布式KV存储系统,其设计目标是支持中等规模的高可用、可扩展的KV存储集群。Doris可以实现海量存储、线性伸缩、平滑扩展、自动容错、故障转移、高并发、低运维成本。部署规模,建议部署4-100+台服务器。Doris3的主要架构:DT(DataTransfer)负责数据导入,DS(DataSeacher)模块负责数据查询,DM(DataMaster)模块负责集群元数据管理,数据存储在Armor分布式键值引擎。Doris3依赖ZooKeeper来存储元数据,这样其他模块依赖ZooKeeper就可以实现无状态,进而整个系统可以实现无单点故障。3.DruidDruid是一个开源的、分布式的、面向列式存储的实时分析数据存储系统。Druid的主要特点如下:亚秒级OLAP查询分析:采用列式存储、倒排索引、位图索引等关键技术;亚秒级完成海量数据过滤、聚合、多维分析;实时流数据分析:Druid提供实时流数据分析,高效的实时写入;亚秒级实时数据可视化;丰富的数据分析功能:Druid提供了友好的可视化界面;SQL查询语言;高可用和高扩展性:Druid工作节点功能单一,互不依赖;Druid集群易于管理、容错、容灾、扩容;4.TiDBTiDB是PingCAP自主设计开发的开源分布式关系型数据库。同时支持OLTP和OLAP的融合分布式数据库产品。TiDB兼容MySQL5.7协议和MySQL生态系统等重要特性。目标是为用户提供一站式的OLTP、OLAP、HTAP解决方案。TiDB适用于高可用、强一致性要求高、数据规模大等多种应用场景。5.GreenplumGreenplum是一个基于开源PostgreSQL的MPP架构的非常强大的关系型分布式数据库。为了兼容Hadoop生态,推出了HAWQ。分析引擎保留了Greenplum的高性能引擎。底层存储不再使用本地硬盘,而是使用HDFS,避免本地硬盘可靠性差的问题,同时融入Hadoop生态。3)常用引擎对比一张图总结了常用OLAP引擎的对比:ComparisonofcommonOLAPengines