mpp架構是什麼?它與各種sql on hadoop架構根本區別在那裡,優點和缺點是什麼?求專業人士賜教?


首先我假設題主問的是正統的MPP資料庫對比SQL On Hadoop。因為一些SQL On Hadoop系統例如Impala也被稱為MPP架構。

那麼對比兩邊其實是諸如Vertica,阿里ADS,GreenPlum,Redshift vs Impala,Hive以及SparkSQL,Presto等。

這兩者很大程度上的差異其實在於,對存儲的控制。對於Hadoop而言,數據最常見的存在形式是數據湖,也就是數據本身未經很多整理,數據傾向於讀取的時候再解析,而且多個系統處理不同的workload一起共享同一套數據湖。例如你可以用Spark,MR以及Impala讀取Hive的數據,甚至直接讀取HDFS上的Parquet,ORC文件。這份數據可以用來做BI數倉也可以用來做ML模型訓練等等。

而MPP資料庫則相反,MPP為了速度,需要將數據導入做一定處理,整理成優化的格式以便加速。這樣做的後果就是,它們的存儲類似一個黑盒,數據進去之後很難被別的系統直接讀取。當然Vertica之類的系統也有SQL On Hadoop的運行模式,但是速度會有所下降,看過Vertica的Benchmark,對比Impala在Hadoop模式下,並不是有多大的優勢,甚至有部分查詢更慢。這部分性能損失,就是拋開黑盒存儲所帶來的差異。

另外SQL On Hadoop產品和MPP資料庫的很多差異,其實是工程上成熟度的差異。例如CBO這樣的優化,可能在資料庫領域已經非常常見,但是對SQL On Hadoop還可以說是個新鮮玩意,至少2016-08-30為止,SparkSQL和Presto還沒有CBO。而列存的引入也是近些年的事情,相對Vertica應該是從誕生就使用了列存。這些差異很可能會很快被補上。

而底層存儲部分,隨著Parquet ORC這樣相對複雜,借用了不少傳統資料庫領域經驗的格式不斷優化,也許今後SQL On Hadoop會和MPP資料庫越來越近似。


@Bo Yang定義已經說的很清楚了。MPP的代表產品有:Vertica/Redshift(Paracel,被Amazon買買下了源碼的license後變成Redshift)/Greenplum。仔細觀察不難發現,這三者其實有非常很多相同點:

1.全部基於PostgreSQL

2.都是基於列的存儲(Columnar Storage)

3.操作都是以Scan為基礎,依賴Compression來提供性能的優化

這寫都不是巧合,源頭都可以追尋到今年圖靈獎得主得主Michael Stonebraker,05年的一篇論文:http://people.csail.mit.edu/tdanford/6830papers/stonebraker-cstore.pdf

MPP和SQL on Hadoop的最大區別就在於,MPP架構是Full-SQL compatiable的,實現不局限於將Query分解為一連串的MR job去執行。並且由於每一列的數據類型進行了特定的壓縮和編碼(比如run-length/delta/bytecoding),能做的優化要比單純的MapReduce多很多,效率自然也要高不少。相較於SQL on Hadoop,MPP更適合做interactive ad-hoc analysis,前者則更適用於對於海量數據做批處理或者需要使用UDF(自定義函數)的場景。在Scalability方面,MPP相較Hadoop類系統要差,依賴於定製硬體,而且沒有可靠的開源實現。


MPP是massively parallel processing,一般指使用多個SQL資料庫節點搭建的數據倉庫系統。執行查詢的時候,查詢可以分散到多個SQL資料庫節點上執行,然後匯總返回給用戶。

MPP解決了單個SQL資料庫不能存放海量數據的問題,但是也存在一些問題,例如:當節點數達到100左右的時候,MPP有些仍會遇到Scalability的問題,速度變慢,或者不穩定。而且,當增加或者刪除節點的時候,需要的維護工作仍然比較大,集群會遇到數據遷移和重新平衡的問題。

SQL on Hadoop是利用Hadoop平台存儲數據,在其之上實現SQL查詢引擎。最大的特點和Scalability非常好,可以支持超過1000各節點的集群。但是由於Hadoop的特點,很多查詢還是需要做大量的數據掃描操作,因此查詢速度往往比MPP要慢,而且支持的同時並發查詢數一般也比較低。


其實兩者的區別差異正在逐步減少,hawq的開源(pivotal商用產品叫HDB)就是一個例子,可以簡單理解為greenplum 的hadoop版本,那你說hawq是mpp還是sql on hadoop呢,其實區分他們的意義不大,關鍵看應用.現在的很多企業談及大數據就是hadoop好像hadoop能幹所有事情,好像不說hadoop就掉價一樣,其實你仔細研究下他的業務就會發現,一個mpp資料庫又快又好就能解決問題,開發人員成本還低,但是他就不用,他就用hadoop就用spark,這些為用而用的技術都沒切在重點上,重點在於我們對於數據的分析和應用,場景和應用是決定我們的技術,而不是反過來。


同意 @Twisted Python 的觀點,再簡單闡述一下自己的看法:

  1. MPP
    1. 原理樸素上說就是分治思想,均分task。
    2. 然後每個worker/segment上做的都是同樣的sub-task,pipeline方式執行,理想情況下性能是非常優異的。
    3. 但是很容易受到慢worker(它是最長路徑)和interconnect的影響,所以scalability不佳,集群規模在十幾個節點後就沒有性能提升了(甚至還可能下降)。
  2. HADOOP
    1. 原理更類似batch processing,更細粒度切分task,worker能者多勞(每個worker上執行的任務可以是不平均,不一致的)。
    2. 單獨worker看,性能不及MPP,但是勝在scalability優異,幾百個節點是沒問題的,在集群性上遠勝MPP。

另外從業務上看,傳統企業數據量有限,所以更傾向於full-sql支持的MPP方案。而互聯網企業更樂於用hadoop來處理更大規模的數據。

近幾年來二者是互相融合學習的(MPP提升scalability,hadoop提升sql的支持),所以今後二者的區別應該會越來越模糊,最後可能誕生一個大一統OLAP方案(甚至再融合OLTP)。

部分觀點參考自這裡:Apache HAWQ: Next Step In Massively Parallel Processing

裡邊關於MPP說的很細,感興趣可以去看看。


MPP資料庫適合存儲高密度價值數據,並且是長期存儲和多次使用,所以MPP並行資料庫會花大量經歷在Load階段,把數據處理成適合分析格式。帶來的優點是查詢速度快,通常在秒計甚至毫秒級以內就可以返回查詢結果。缺點是不支持細粒度的容錯,不支持高並發,集群數量擴展有上限,執行引擎和存儲緊耦合導致數據難以被其他分析引擎進行分析。

SQL-on-Hadoop架構可以分為兩類:

  • SQL over Processing Framework:例如SparkSQL,Drill/Datameer,Presto,Impala
  • OLAP over Hadoop:例如Kylin,Druid,AtScale,Kyvos

SQL over Processing Framework系統的共同特點是「Hadoop通用計算框架+SQL解析引擎」,存儲層、執行引擎層、SQL解析層三者分離,可以方便替換執行引擎,對使用者而言,同一份數據可以採用不同並行執行引擎來分析。優點是靈活性高,支持細粒度容錯,集群擴展性好,缺點是效率無法保證。

OLAP over Hadoop系統的共同特點是預計算,即數據都以時間序列的方式進入系統並經過數據預聚合和建立索引,因為是預計算,所以應對多維查詢時速度非常快(計算時間複雜度O(1))且穩定,支持高並發,支持集群擴展。缺點是靈活性較差。


推薦閱讀:

以後的路線如何走,入職半年的職場小白的困惑,研發、弱電、強電?
大數據技術中,關於用戶行為分析方面的有哪些技術?
Gopher China 2017 大會怎麼樣?
如何評價大數據的未來?
2017 年最令你震驚、悚然的數據是什麼?

TAG:SQL | Hadoop | 大數據 |