一、為什么說HADOOP擴展性優(yōu)于MPP架構(gòu)的關(guān)系型數(shù)據(jù)庫
1. hadoop(hive)跟mpp的本質(zhì)區(qū)別是什么,這個有的時候界限很模糊,比如說存儲,如果我把mpp的存儲架在hdfs上,那存儲模型就沒有區(qū)別了,所以地下我打算還是用比較傳統(tǒng)的認(rèn)知來作區(qū)別。
2. hive跟mpp的存儲模型不一樣,hive用的hdfs,而mpp需要自己做切分,自己做切分就帶來動態(tài)調(diào)整的問題,hdfs的擴展是通過元數(shù)據(jù)來做的,他有中心節(jié)點用來存元數(shù)據(jù),在加入新的節(jié)點的時候,只需要修改元數(shù)據(jù)就可以了,所以hdfs的擴展能力是受到管理元數(shù)據(jù)那臺機器的性能限制的,一般來說可以到10k這個規(guī)模,再向上就不行了。但是mpp通常采用的是沒有中心節(jié)點的存儲模型,比如hash,你每次增加節(jié)點的時候,都需要rehash,這樣當(dāng)規(guī)模到了幾百臺的時候,擴展能力就下來了。當(dāng)然,現(xiàn)在可以把存儲架在hdfs上,這樣在存儲上就沒有太大區(qū)別了。
3. hive跟mpp的內(nèi)存管理方式不大一樣,mpp內(nèi)存管理比較精細(xì),他主要的想法是在每個機器上放個數(shù)據(jù)庫,傳統(tǒng)數(shù)據(jù)庫的內(nèi)存管理比較復(fù)雜,主要是內(nèi)外存交互的東西,這樣的架構(gòu)決定了mpp在小數(shù)據(jù)量的時候,latency可以做的比較小,但是在大數(shù)據(jù)量的時候,throughput做不上去。而hive的內(nèi)存管理非常粗放,他后來就是mapreduce的job,mr的job是沒有太多精細(xì)的內(nèi)存管理的,他就是拼了命地scan,完了頂多就是個spill,這樣的架構(gòu)導(dǎo)致throughput很大,但是latency很高,當(dāng)你集群規(guī)模很大的時候,你一般會追求很大的throughput,當(dāng)數(shù)據(jù)量很大的時候,如果你用mpp那種傳統(tǒng)的內(nèi)存管理的話,大批量的計算反而會慢,而且更加占資源,所以vertica這種一開始就考慮了列式存儲就是這個道理。
4.事務(wù),你可以認(rèn)為hive不支持傳統(tǒng)意義上的那種高并發(fā)的事務(wù),而mpp試圖想要支持,一旦你要上分布式事務(wù),基本上你的可擴展性就上不去了,至于為啥,陳皓有一篇文章寫的不錯,建議看下。hive的ddl是可以多個并發(fā)的,但是dml不行,而ddl他是通過傳統(tǒng)的數(shù)據(jù)庫去做的,所以這個也是個中心節(jié)點,dml不行的話,就決定了他可以在底層跑mr這么重粒度的東西,他跑的時候,會在整個表上面加一把大鎖。
5.failover機制,hive的failover就是mr的failover,job掛掉了重新?lián)Q機器跑就完了,但是mpp如果采用傳統(tǒng)架構(gòu)的話,他的計算是要attach到數(shù)據(jù)節(jié)點上去的,如果你規(guī)模上去,那么fail的可能性就上去了,這樣如果你每次計算都有臺機器掛了,你一掛,別人就要等你,而不是換臺機器繼續(xù)跑,那么這個也限制了可擴展性,當(dāng)然,如果mpp在底層用了統(tǒng)一的存儲,完了計算也可以到處轉(zhuǎn)移,再想個辦法把中間狀態(tài)記錄下來,也可以擴展(這個實際上就是sparksql)。
延伸閱讀:
二、MongoDB是什么
非關(guān)系型數(shù)據(jù)庫(nosql ),屬于文檔型數(shù)據(jù)庫。MongoDB采用類JSON的documents來存儲數(shù)據(jù)。數(shù)據(jù)結(jié)構(gòu)由鍵值(key=>value)對組成。
MongoDB采用動態(tài)數(shù)據(jù)模型schema,這意味著不需要預(yù)先定義表的數(shù)據(jù)類型和字段名。當(dāng)MongoDB需要更新文檔documents的時候,可以輕松增加新的字段名或者刪除舊的字段。MongoDB讓數(shù)據(jù)結(jié)構(gòu)更加層級化,因而存儲數(shù)組等復(fù)雜數(shù)據(jù)結(jié)構(gòu)。 在同一個集合collection中,文檔document對字段也沒有強約束,因此更容易設(shè)計差異化的數(shù)據(jù)結(jié)構(gòu)。