1. 程式人生 > >Hawq學習筆記 --- MPP(大規模並行處理)架構(Massively Parallel Processing)

Hawq學習筆記 --- MPP(大規模並行處理)架構(Massively Parallel Processing)

MPP是 Massively Parallel Processing的縮寫。

       MPP 是將任務並行的分散到多個伺服器和節點上,在每個節點上計算完成後,將各自部分的結果彙總在一起得到最終的結果。   首先MPP 必須消除手工切分資料的工作量。 這是MySQL 在網際網路應用中的主要侷限性。   另外MPP 的切分必須在任何時候都是平均的 , 不然某些節點處理的時間就明顯多於另外一些節點。    對於工作負載是不是要平均分佈有同種和異種之分,同種就是所有節點在資料裝載的時候都同時轉載,異種就是可以指定部分節點專門用來裝載資料(邏輯上的不 是物理上) , 而其他所有節點用來負責查詢。 Aster Data 和 Greenplum 都屬於這種。 兩者之間並沒有明顯的優勢科研,同種的工作負載情況下,需要軟體提供商保證所有節點的負載是平衡的。 而異種的工作負載可以在你覺得資料裝載很慢的情況下手工指定更多節點裝載資料 。 區別其實就是自動化和手工控制,看個人喜好而已。 另外一個問題是查詢如何被初始化的。 比如要查詢銷售最好的10件商品,每個節點都要先計算出自己的最好的10件商品,然後向上彙總,彙總的過程,肯定有些節點做的工作比其他節點要多。
   上面只是一個簡單的單表查詢,如果是兩個表的連線查詢,可能還會涉及到節點之間計算的中間過程如何傳遞的問題。 是將大表和小表都平均分佈,然後節點計算的時候將得到的結果彙總(可能要兩次彙總),還是將大表平均分佈,小表的資料傳輸給每個節點,這樣彙總就只需要一 次。 (其中一個特例可以參考後面給出的Oracle Partition Wise Join) 。 兩種執行計劃很難說誰好誰壞,資料量的大小可能會產生不同的影響。 有些特定的廠商專門對這種執行計劃做過了優化的,比如EMC Greenplum 和 HP Vertica 。 這其中涉及到很多取捨問題,比如資料分佈模式,資料重新分佈的成本,中間交換資料的網絡卡速度,儲存介質讀寫的速度和資料量大小(計算過程一般都會用臨時表 儲存中間過程)。 一般在設計MPP 資料倉庫的時候都會有一個指導原則用來得到比較好的效能,比如資料如何分佈,customer 一般按照hash 分佈比較好,而sales_order 一般按照時間分佈。所以一般建議在選型做POC 的時候,針對你自己需要的典型查詢模式和負載進行
測試
。 一般優化的時候會考慮如下問題:查詢如何初始化? 是否有足夠的節點用來處理查詢?同樣的,資料裝載的時候是否有足夠節點用來裝載資料資料裝載如何影響查詢的,一些列資料庫資料裝載的時候一般不適合處理查詢。資料該複製多少份?把常用的資料分佈在更多的節點上顯然會減少資料移動的影響

一般用來做高可用的資料能用在查詢上嘛?有什麼工具能檢視查詢的執行計劃嗎?這些功能能幫助你定位效能瓶頸或給出你指導意見嘛? 在開始使用MPP 的時候你至少應該明白幾件事:不同的資料分佈策略到底如何影響你的不同的工作負載模式如何影響你的設計Share Everthing 和 Share Nothing 資料倉庫裡面share everything 的代表是Oracle 的Exadata 。 Sybase 也從oracle 引入了rac 的套件,但是Sybase 本身沒有硬體,所有架構上還是跟Exadata 有很大區別。 就跟普通所說的RAC 和 Exadata 的在架構上的區別一樣。

Exadata 是用一個儲存陣列來存放資料的,跟Oracle 10g 裡面ASM Disk + Disk 是完全不同的。   share nothing 的架構在資料倉庫裡面更多, Teradata,IBM Netezza , Vertica,Greenplum, Aster Data 基本都是。 這個是比較傳統的share nothing 架構, Sybase IQ , Vertica , Greenplum Community , Aster Data 基本都是這種,純軟體上實現的share nothing, 裡面Disk 跟Disk 之間是分開的,Node 跟Node 之間就是純的物理上的伺服器。   Teradata ,IBM Netazza ,將來可能出現的EMC Greenplum + 硬體(現在的Greenplum DCA不是 ) ,HP Vertica + 硬體。 (IBM Netazza Architecture)   裡面的磁碟陣列是磁碟陣列,互相之間是可以轉移資料的, 前面講的幾個(Sybase IQ) 這種Disk 跟Disk 之間是不能傳資料的,要交換資料必須通過計算層面傳送內部訊息。   他們之間最大的區別就是在執行計劃裡面資料重分佈會非常不一樣,具體這個後面我寫Exadata vs Netezza 會詳細說。 大家也可以參考最下面參考資料給出的連線: 純軟體的MPP 理論上的伸縮性可能可以到比較高的級別,但是資料越大可能執行某些SQL 就沒有在比較小資料量的時候優秀了。 大概的梯度在1P 跟200TB 左右吧。    軟體+硬體的伸縮性更好,但是他硬體必須是一開始就預訂好的,不能今天加一臺機器,明天加兩個磁碟的,裡面使用的私有化硬體也都是專門為特殊目的而造 的,比如內部通道一般使用Cisco 的InfiniBand , 磁碟陣列也基本都是一些高階磁碟(但不是NetAPP 那麼高階的), 不是簡單的任意伺服器安裝軟體就算資料倉庫了。   各資料倉庫MPP 的實現   Microsoft 沒有mpp , 他的叢集甚至都不是線性伸縮的(坑爹啊), 但是他08 年就收購了在Linux+Ingres 上做MPP 的DATAllegro , 但是新版還沒出來。   Sybase IQ 最新版15。3 做出來MPP , 時間是今年7月份才釋出,Sybase IQ 本身是共享磁碟,但是它跟RAC 的區別是它不共享節點的計算資源。    基於Mysql 的InfoBright 沒有MPP , 但是非常有名的Percona 給了他們一個MPP 的解決方案, 完全的share nothing ,不共享磁碟,但是由於Mysql 本身並沒有parallel query 的能力,所以其實這個MPP 計算能力很有限。   Vertica , Greenplum , Aster Data 的MPP 都是純軟體的share nothing 並且不共享磁碟的, 資料移動和重分佈完全是靠計算機叢集完成。    Teradata , IBM Netezza 以及將來可能出現的HP Vertica +硬體, Greenplum + EMC 硬體 , Aster Data + Teradata 硬體都是完全的share nothing , 他們共享的是磁碟陣列, 但是部分資料傳輸和重分佈是靠磁碟陣列完成。