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