MPP大規(guī)模并行處理架構(gòu)詳解
本文轉(zhuǎn)載自微信公眾號「五分鐘學(xué)大數(shù)據(jù)」,作者園陌。轉(zhuǎn)載本文請聯(lián)系五分鐘學(xué)大數(shù)據(jù)公眾號。
面試官:說下你知道的MPP架構(gòu)的計算引擎?
這個問題不少小伙伴在面試時都遇到過,因為對MPP這個概念了解較少,不少人都卡殼了,但是我們常用的大數(shù)據(jù)計算引擎有很多都是MPP架構(gòu)的,像我們熟悉的Impala、ClickHouse、Druid、Doris等都是MPP架構(gòu)。
采用MPP架構(gòu)的很多OLAP引擎號稱:億級秒開。
本文分為三部分講解,第一部分詳解MPP架構(gòu),第二部分剖析MPP架構(gòu)與批處理架構(gòu)的異同點,第三部分是采用MPP架構(gòu)的OLAP引擎介紹。
一、MPP架構(gòu)
MPP是系統(tǒng)架構(gòu)角度的一種服務(wù)器分類方法。
目前商用的服務(wù)器分類大體有三種:
SMP(對稱多處理器結(jié)構(gòu))
NUMA(非一致存儲訪問結(jié)構(gòu))
MPP(大規(guī)模并行處理結(jié)構(gòu))
我們今天的主角是 MPP,因為隨著分布式、并行化技術(shù)成熟應(yīng)用,MPP引擎逐漸表現(xiàn)出強大的高吞吐、低時延計算能力,有很多采用MPP架構(gòu)的引擎都能達到“億級秒開”。
先了解下這三種結(jié)構(gòu):
1. SMP
即對稱多處理器結(jié)構(gòu),就是指服務(wù)器的多個CPU對稱工作,無主次或從屬關(guān)系。SMP服務(wù)器的主要特征是共享,系統(tǒng)中的所有資源(如CPU、內(nèi)存、I/O等)都是共享的。也正是由于這種特征,導(dǎo)致了SMP服務(wù)器的主要問題,即擴展能力非常有限。
2. NUMA
即非一致存儲訪問結(jié)構(gòu)。這種結(jié)構(gòu)就是為了解決SMP擴展能力不足的問題,利用NUMA技術(shù),可以把幾十個CPU組合在一臺服務(wù)器內(nèi)。NUMA的基本特征是擁有多個CPU模塊,節(jié)點之間可以通過互聯(lián)模塊進行連接和信息交互,所以,每個CPU可以訪問整個系統(tǒng)的內(nèi)存(這是與MPP系統(tǒng)的重要區(qū)別)。但是訪問的速度是不一樣的,因為CPU訪問本地內(nèi)存的速度遠(yuǎn)遠(yuǎn)高于系統(tǒng)內(nèi)其他節(jié)點的內(nèi)存速度,這也是非一致存儲訪問NUMA的由來。
這種結(jié)構(gòu)也有一定的缺陷,由于訪問異地內(nèi)存的時延遠(yuǎn)遠(yuǎn)超過訪問本地內(nèi)存,因此,當(dāng)CPU數(shù)量增加時,系統(tǒng)性能無法線性增加。
3. MPP
即大規(guī)模并行處理結(jié)構(gòu)。MPP的系統(tǒng)擴展和NUMA不同,MPP是由多臺SMP服務(wù)器通過一定的節(jié)點互聯(lián)網(wǎng)絡(luò)進行連接,協(xié)同工作,完成相同的任務(wù),從用戶的角度來看是一個服務(wù)器系統(tǒng)。每個節(jié)點只訪問自己的資源,所以是一種完全無共享(Share Nothing)結(jié)構(gòu)。
MPP結(jié)構(gòu)擴展能力最強,理論可以無限擴展。由于MPP是多臺SPM服務(wù)器連接的,每個節(jié)點的CPU不能訪問另一個節(jié)點內(nèi)存,所以也不存在異地訪問的問題。
MPP架構(gòu)圖:
MPP架構(gòu)
每個節(jié)點內(nèi)的CPU不能訪問另一個節(jié)點的內(nèi)存,節(jié)點之間的信息交互是通過節(jié)點互聯(lián)網(wǎng)絡(luò)實現(xiàn)的,這個過程稱為數(shù)據(jù)重分配。
但是MPP服務(wù)器需要一種復(fù)雜的機制來調(diào)度和平衡各個節(jié)點的負(fù)載和并行處理過程。目前,一些基于MPP技術(shù)的服務(wù)器往往通過系統(tǒng)級軟件(如數(shù)據(jù)庫)來屏蔽這種復(fù)雜性。舉個例子,Teradata就是基于MPP技術(shù)的一個關(guān)系數(shù)據(jù)庫軟件(這是最早采用MPP架構(gòu)的數(shù)據(jù)庫),基于此數(shù)據(jù)庫來開發(fā)應(yīng)用時,不管后臺服務(wù)器由多少節(jié)點組成,開發(fā)人員面對的都是同一個數(shù)據(jù)庫系統(tǒng),而無需考慮如何調(diào)度其中某幾個節(jié)點的負(fù)載。
MPP架構(gòu)特征:
- 任務(wù)并行執(zhí)行;
- 數(shù)據(jù)分布式存儲(本地化);
- 分布式計算;
- 高并發(fā),單個節(jié)點并發(fā)能力大于300用戶;
- 橫向擴展,支持集群節(jié)點的擴容;
- Shared Nothing(完全無共享)架構(gòu)。
NUMA和MPP區(qū)別:
二者有許多相似之處,首先NUMA和MPP都是由多個節(jié)點組成的;其次每個節(jié)點都有自己的CPU,內(nèi)存,I/O等;都可以都過節(jié)點互聯(lián)機制進行信息交互。
那它們的區(qū)別是什么呢,首先是節(jié)點互聯(lián)機制不同,NUMA的節(jié)點互聯(lián)是在同一臺物理服務(wù)器內(nèi)部實現(xiàn)的,MPP的節(jié)點互聯(lián)是在不同的SMP服務(wù)器外部通過I/O實現(xiàn)的。
其次是內(nèi)存訪問機制不同,在NUMA服務(wù)器內(nèi)部,任何一個CPU都可以訪問整個系統(tǒng)的內(nèi)存,但異地內(nèi)存訪問的性能遠(yuǎn)遠(yuǎn)低于本地內(nèi)存訪問,因此,在開發(fā)應(yīng)用程序時應(yīng)該盡量避免異地內(nèi)存訪問。而在MPP服務(wù)器中,每個節(jié)點只訪問本地內(nèi)存,不存在異地內(nèi)存訪問問題。
二、批處理架構(gòu)和MPP架構(gòu)
批處理架構(gòu)(如 MapReduce)與MPP架構(gòu)的異同點,以及它們各自的優(yōu)缺點是什么呢?
相同點:
批處理架構(gòu)與MPP架構(gòu)都是分布式并行處理,將任務(wù)并行的分散到多個服務(wù)器和節(jié)點上,在每個節(jié)點上計算完成后,將各自部分的結(jié)果匯總在一起得到最終的結(jié)果。
不同點:
批處理架構(gòu)和MPP架構(gòu)的不同點可以舉例來說:我們執(zhí)行一個任務(wù),首先這個任務(wù)會被分成多個task執(zhí)行,對于MapReduce來說,這些tasks被隨機的分配在空閑的Executor上;而對于MPP架構(gòu)的引擎來說,每個處理數(shù)據(jù)的task被綁定到持有該數(shù)據(jù)切片的指定Executor上。
正是由于以上的不同,使得兩種架構(gòu)有各自優(yōu)勢也有各自缺陷:
- 批處理的優(yōu)勢:
對于批處理架構(gòu)來說,如果某個Executor執(zhí)行過慢,那么這個Executor會慢慢分配到更少的task執(zhí)行,批處理架構(gòu)有個推測執(zhí)行策略,推測出某個Executor執(zhí)行過慢或者有故障,則在接下來分配task時就會較少的分配給它或者直接不分配,這樣就不會因為某個節(jié)點出現(xiàn)問題而導(dǎo)致集群的性能受限。
- 批處理的缺陷:
任何事情都是有代價的,對于批處理而言,它的優(yōu)勢也造成了它的缺點,會將中間結(jié)果寫入到磁盤中,這嚴(yán)重限制了處理數(shù)據(jù)的性能。
- MPP的優(yōu)勢:
MPP架構(gòu)不需要將中間數(shù)據(jù)寫入磁盤,因為一個單一的Executor只處理一個單一的task,因此可以簡單直接將數(shù)據(jù)stream到下一個執(zhí)行階段。這個過程稱為pipelining,它提供了很大的性能提升。
- MPP的缺陷:
對于MPP架構(gòu)來說,因為task和Executor是綁定的,如果某個Executor執(zhí)行過慢或故障,將會導(dǎo)致整個集群的性能就會受限于這個故障節(jié)點的執(zhí)行速度(所謂木桶的短板效應(yīng)),所以MPP架構(gòu)的最大缺陷就是——短板效應(yīng)。另一點,集群中的節(jié)點越多,則某個節(jié)點出現(xiàn)問題的概率越大,而一旦有節(jié)點出現(xiàn)問題,對于MPP架構(gòu)來說,將導(dǎo)致整個集群性能受限,所以一般實際生產(chǎn)中MPP架構(gòu)的集群節(jié)點不易過多。
舉個例子來說下兩種架構(gòu)的數(shù)據(jù)落盤:要實現(xiàn)兩個大表的join操作,對于批處理而言,如Spark將會寫磁盤三次(第一次寫入:表1根據(jù)join key進行shuffle;第二次寫入:表2根據(jù)join key進行shuffle;第三次寫入:Hash表寫入磁盤), 而MPP只需要一次寫入(Hash表寫入)。這是因為MPP將mapper和reducer同時運行,而MapReduce將它們分成有依賴關(guān)系的tasks(DAG),這些task是異步執(zhí)行的,因此必須通過寫入中間數(shù)據(jù)共享內(nèi)存來解決數(shù)據(jù)的依賴。
批處理架構(gòu)和MPP架構(gòu)融合:
兩個架構(gòu)的優(yōu)勢和缺陷都很明顯,并且它們有互補關(guān)系,如果我們能將二者結(jié)合起來使用,是不是就能發(fā)揮各自最大的優(yōu)勢。目前批處理和MPP也確實正在逐漸走向融合,也已經(jīng)有了一些設(shè)計方案,技術(shù)成熟后,可能會風(fēng)靡大數(shù)據(jù)領(lǐng)域,我們拭目以待!
三、 MPP架構(gòu)的OLAP引擎
采用MPP架構(gòu)的OLAP引擎有很多,下面只選擇常見的幾個引擎對比下,可為公司的技術(shù)選型提供參考。
采用MPP架構(gòu)的OLAP引擎分為兩類,一類是自身不存儲數(shù)據(jù),只負(fù)責(zé)計算的引擎;一類是自身既存儲數(shù)據(jù),也負(fù)責(zé)計算的引擎。
1)只負(fù)責(zé)計算,不負(fù)責(zé)存儲的引擎
1. Impala
Apache Impala是采用MPP架構(gòu)的查詢引擎,本身不存儲任何數(shù)據(jù),直接使用內(nèi)存進行計算,兼顧數(shù)據(jù)倉庫,具有實時,批處理,多并發(fā)等優(yōu)點。
提供了類SQL(類Hsql)語法,在多用戶場景下也能擁有較高的響應(yīng)速度和吞吐量。它是由Java和C++實現(xiàn)的,Java提供的查詢交互的接口和實現(xiàn),C++實現(xiàn)了查詢引擎部分。
Impala支持共享Hive Metastore,但沒有再使用緩慢的 Hive+MapReduce 批處理,而是通過使用與商用并行關(guān)系數(shù)據(jù)庫中類似的分布式查詢引擎(由 Query Planner、Query Coordinator 和 Query Exec Engine 三部分組成),可以直接從 HDFS 或 HBase 中用 SELECT、JOIN 和統(tǒng)計函數(shù)查詢數(shù)據(jù),從而大大降低了延遲。
Impala經(jīng)常搭配存儲引擎Kudu一起提供服務(wù),這么做最大的優(yōu)勢是查詢比較快,并且支持?jǐn)?shù)據(jù)的Update和Delete。
2. Presto
Presto是一個分布式的采用MPP架構(gòu)的查詢引擎,本身并不存儲數(shù)據(jù),但是可以接入多種數(shù)據(jù)源,并且支持跨數(shù)據(jù)源的級聯(lián)查詢。Presto是一個OLAP的工具,擅長對海量數(shù)據(jù)進行復(fù)雜的分析;但是對于OLTP場景,并不是Presto所擅長,所以不要把Presto當(dāng)做數(shù)據(jù)庫來使用。
Presto是一個低延遲高并發(fā)的內(nèi)存計算引擎。需要從其他數(shù)據(jù)源獲取數(shù)據(jù)來進行運算分析,它可以連接多種數(shù)據(jù)源,包括Hive、RDBMS(Mysql、Oracle、Tidb等)、Kafka、MongoDB、Redis等。
2)既負(fù)責(zé)計算,又負(fù)責(zé)存儲的引擎
1. ClickHouse
ClickHouse是近年來備受關(guān)注的開源列式數(shù)據(jù)庫,主要用于數(shù)據(jù)分析(OLAP)領(lǐng)域。
它自包含了存儲和計算能力,完全自主實現(xiàn)了高可用,而且支持完整的SQL語法包括JOIN等,技術(shù)上有著明顯優(yōu)勢。相比于hadoop體系,以數(shù)據(jù)庫的方式來做大數(shù)據(jù)處理更加簡單易用,學(xué)習(xí)成本低且靈活度高。當(dāng)前社區(qū)仍舊在迅猛發(fā)展中,并且在國內(nèi)社區(qū)也非常火熱,各個大廠紛紛跟進大規(guī)模使用。
ClickHouse在計算層做了非常細(xì)致的工作,竭盡所能榨干硬件能力,提升查詢速度。它實現(xiàn)了單機多核并行、分布式計算、向量化執(zhí)行與SIMD指令、代碼生成等多種重要技術(shù)。
ClickHouse從OLAP場景需求出發(fā),定制開發(fā)了一套全新的高效列式存儲引擎,并且實現(xiàn)了數(shù)據(jù)有序存儲、主鍵索引、稀疏索引、數(shù)據(jù)Sharding、數(shù)據(jù)Partitioning、TTL、主備復(fù)制等豐富功能。以上功能共同為ClickHouse極速的分析性能奠定了基礎(chǔ)。
2. Doris
Doris是百度主導(dǎo)的,根據(jù)Google Mesa論文和Impala項目改寫的一個大數(shù)據(jù)分析引擎,是一個海量分布式 KV 存儲系統(tǒng),其設(shè)計目標(biāo)是支持中等規(guī)模高可用可伸縮的 KV 存儲集群。
Doris可以實現(xiàn)海量存儲,線性伸縮、平滑擴容,自動容錯、故障轉(zhuǎn)移,高并發(fā),且運維成本低。部署規(guī)模,建議部署4-100+臺服務(wù)器。
Doris3 的主要架構(gòu):DT(Data Transfer)負(fù)責(zé)數(shù)據(jù)導(dǎo)入、DS(Data Seacher)模塊負(fù)責(zé)數(shù)據(jù)查詢、DM(Data Master)模塊負(fù)責(zé)集群元數(shù)據(jù)管理,數(shù)據(jù)則存儲在 Armor 分布式 Key-Value 引擎中。Doris3 依賴 ZooKeeper 存儲元數(shù)據(jù),從而其他模塊依賴 ZooKeeper 做到了無狀態(tài),進而整個系統(tǒng)能夠做到無故障單點。
3. Druid
Druid是一個開源、分布式、面向列式存儲的實時分析數(shù)據(jù)存儲系統(tǒng)。
Druid的關(guān)鍵特性如下:
- 亞秒級的OLAP查詢分析:采用了列式存儲、倒排索引、位圖索引等關(guān)鍵技術(shù);
- 在亞秒級別內(nèi)完成海量數(shù)據(jù)的過濾、聚合以及多維分析等操作;
- 實時流數(shù)據(jù)分析:Druid提供了實時流數(shù)據(jù)分析,以及高效實時寫入;
- 實時數(shù)據(jù)在亞秒級內(nèi)的可視化;
- 豐富的數(shù)據(jù)分析功能:Druid提供了友好的可視化界面;
- SQL查詢語言;
- 高可用性與高可拓展性:
- Druid工作節(jié)點功能單一,不相互依賴;
- Druid集群在管理、容錯、災(zāi)備、擴容都很容易;
4. TiDB
TiDB 是 PingCAP 公司自主設(shè)計、研發(fā)的開源分布式關(guān)系型數(shù)據(jù)庫,是一款同時支持OLTP與OLAP的融合型分布式數(shù)據(jù)庫產(chǎn)品。
TiDB 兼容 MySQL 5.7 協(xié)議和 MySQL 生態(tài)等重要特性。目標(biāo)是為用戶提供一站式 OLTP 、OLAP 、HTAP 解決方案。TiDB 適合高可用、強一致要求較高、數(shù)據(jù)規(guī)模較大等各種應(yīng)用場景。
5. Greenplum
Greenplum 是在開源的 PostgreSQL 的基礎(chǔ)上采用了MPP架構(gòu)的性能非常強大的關(guān)系型分布式數(shù)據(jù)庫。為了兼容Hadoop生態(tài),又推出了HAWQ,分析引擎保留了Greenplum的高性能引擎,下層存儲不再采用本地硬盤而改用HDFS,規(guī)避本地硬盤可靠性差的問題,同時融入Hadoop生態(tài)。
3)常用的引擎對比
一張圖總結(jié)下常用的OLAP引擎對比:
常見OLAP引擎對比