Elasticsearch、MongoDB和Hadoop比較

Neil Zhu,簡(jiǎn)書(shū)ID Not_GOD,University AI 創(chuàng)始人 & Chief Scientist,致力于推進(jìn)世界人工智能化進(jìn)程。制定并實(shí)施 UAI 中長(zhǎng)期增長(zhǎng)戰(zhàn)略和目標(biāo),帶領(lǐng)團(tuán)隊(duì)快速成長(zhǎng)為人工智能領(lǐng)域最專業(yè)的力量。
作為行業(yè)領(lǐng)導(dǎo)者,他和UAI一起在2014年創(chuàng)建了TASA(中國(guó)最早的人工智能社團(tuán)), DL Center(深度學(xué)習(xí)知識(shí)中心全球價(jià)值網(wǎng)絡(luò)),AI growth(行業(yè)智庫(kù)培訓(xùn))等,為中國(guó)的人工智能人才建設(shè)輸送了大量的血液和養(yǎng)分。此外,他還參與或者舉辦過(guò)各類國(guó)際性的人工智能峰會(huì)和活動(dòng),產(chǎn)生了巨大的影響力,書(shū)寫了60萬(wàn)字的人工智能精品技術(shù)內(nèi)容,生產(chǎn)翻譯了全球第一本深度學(xué)習(xí)入門書(shū)《神經(jīng)網(wǎng)絡(luò)與深度學(xué)習(xí)》,生產(chǎn)的內(nèi)容被大量的專業(yè)垂直公眾號(hào)和媒體轉(zhuǎn)載與連載。曾經(jīng)受邀為國(guó)內(nèi)頂尖大學(xué)制定人工智能學(xué)習(xí)規(guī)劃和教授人工智能前沿課程,均受學(xué)生和老師好評(píng)。

原地址

IT界在過(guò)去幾年中出現(xiàn)了一個(gè)有趣的現(xiàn)象。很多新的技術(shù)出現(xiàn)并立即擁抱了“大數(shù)據(jù)”。稍微老一點(diǎn)的技術(shù)也會(huì)將大數(shù)據(jù)添進(jìn)自己的特性,避免落大部隊(duì)太遠(yuǎn),我們看到了不同技術(shù)之間的邊際的模糊化。假如你有諸如Elasticsearch或者Solr這樣的搜索引擎,它們存儲(chǔ)著JSON文檔,MongoDB存著JSON文檔,或者一堆JSON文檔存放在一個(gè)Hadoop集群的HDFS中。你可以使用這三種配置完成很多同養(yǎng)的事情。

ES是否可以作為一個(gè)NoSQL數(shù)據(jù)庫(kù)?粗看,這句話說(shuō)的不太對(duì),但是這是一個(gè)合理的場(chǎng)景。類似地,MongoDB在MapReduce的基礎(chǔ)上使用分片的技術(shù)同樣可以完成Hadoop可以做的工作。當(dāng)然使用眾多功能,我們可以在Hadoop之上(Hive、HBase、Pig和同樣的一些)你也可以用多種方式查詢Hadoop集群中的數(shù)據(jù)。

那么,我們現(xiàn)在是否能說(shuō)Hadoop、MongoDB和Elasticsearch這三個(gè)是完全相同的呢?顯然不行!每個(gè)工具都有自身最為適用的場(chǎng)景,但是每個(gè)都有相當(dāng)?shù)撵`活性能夠勝任不同的角色?,F(xiàn)在的問(wèn)題就變成“這些技術(shù)的最合適的使用場(chǎng)景是什么?”。下面我們來(lái)瞧瞧。

Elasticsearch已經(jīng)超越了其最初的純搜索引擎的角色,現(xiàn)在已經(jīng)增加了分析和可視化的特性——但是它的核心仍舊是一個(gè)全文搜索引擎。Elasticsearch建立在Lucene之上并且支持極其快速的查詢和豐富的查詢語(yǔ)法。如果你有數(shù)百萬(wàn)的文檔需要通過(guò)關(guān)鍵詞進(jìn)行定位時(shí),Elasticsearch肯定是最佳選擇。當(dāng)然,如果你的文檔是JSON的,你就可以把Elasticsearch當(dāng)作一種輕量級(jí)的“NoSQL數(shù)據(jù)庫(kù)”。但是Elasticsearch不是一個(gè)合適的數(shù)據(jù)庫(kù)引擎,對(duì)復(fù)雜的查詢和聚合并不是很強(qiáng),盡管統(tǒng)計(jì)facet可以提供一定的關(guān)于給定查詢的統(tǒng)計(jì)信息的支持。Elasticsearch中的facet主要是用來(lái)支持分面的瀏覽功能。

目前Elasticsearch已經(jīng)增加了aggregation的功能

如果你在尋找一個(gè)對(duì)應(yīng)于一個(gè)關(guān)鍵詞查詢的少量的文檔集合,并且要支持在這些結(jié)果中分面的導(dǎo)航,那么Elasticsearch肯定是最好的選擇。如果你需要進(jìn)行更加復(fù)雜的計(jì)算,對(duì)數(shù)據(jù)執(zhí)行服務(wù)端的腳本,輕松地運(yùn)行MapReduce job,那么MongoDB或者Hadoop就進(jìn)入待選項(xiàng)中。

MongoDB是NoSQL數(shù)據(jù)庫(kù),被設(shè)計(jì)成一個(gè)高可擴(kuò)展,并且有自動(dòng)分片的功能及一些額外性能優(yōu)化的功能。MongoDB是一個(gè)面向文檔的數(shù)據(jù)庫(kù),以JSON的形式進(jìn)行數(shù)據(jù)的存儲(chǔ)(準(zhǔn)確地說(shuō)可以稱為BSON,對(duì)JSON進(jìn)行了一些增強(qiáng))——例如,一個(gè)native數(shù)據(jù)類型。MongoDB提供了一個(gè)文本索引類型來(lái)支持全文檢索,所以我們可以看到在Elasticsearch和MongoDB之間的界限,基本的關(guān)鍵詞搜索對(duì)應(yīng)于文檔的集合。

MongoDB超過(guò)Elasticsearch的地方在于其對(duì)于服務(wù)器端js腳本的支持、聚合的管道、MapReduce的支持和capped collections。使用MongoDB,你可以使用聚合管道來(lái)處理一個(gè)集合中的文檔,通過(guò)一個(gè)管道操作的序列來(lái)多步地對(duì)文檔進(jìn)行處理。管道操作可以生成全新的文檔并且從最終的結(jié)果中移除文檔。這是一個(gè)在檢索數(shù)據(jù)時(shí)的相當(dāng)強(qiáng)的過(guò)濾、處理和轉(zhuǎn)化數(shù)據(jù)的特點(diǎn)。MongoDB也支持對(duì)一個(gè)數(shù)據(jù)collection進(jìn)行map/reduce job的執(zhí)行,使用定制的js函數(shù)進(jìn)行操作的map和reduce過(guò)程。這就保證了MongoDB可以對(duì)選定的數(shù)據(jù)執(zhí)行任意類型的計(jì)算或者轉(zhuǎn)換的終極的靈活性。

MongoDB另一個(gè)極其強(qiáng)大的特性稱之為“Capped collections”。使用這個(gè)特性,用戶可以定義一個(gè)collection的最大size——然后這個(gè)collection可以被盲寫,并且會(huì)roll-over必須的數(shù)據(jù)來(lái)獲取log和其他供分析的流數(shù)據(jù)。

你看到,Elasticsearch和MongoDB有一個(gè)可能的應(yīng)用場(chǎng)景的重疊,它們不是同樣的工具。但是Hadoop呢?Hadoop就是MapReduce,這已經(jīng)有MongoDB就地支持了?。∈遣皇沁€有一個(gè)專屬于Hadoop的場(chǎng)景,MongoDB就只是適合。

有!Hadoop是老MapReduce了,提供了最為靈活和強(qiáng)大的環(huán)境來(lái)進(jìn)行大量數(shù)據(jù)的處理,毫無(wú)疑問(wèn)的是能夠搞定不能使用Elasticsearch或者M(jìn)ongoDB處理的場(chǎng)景。

為了更加清楚地認(rèn)識(shí)到這點(diǎn),看看Hadoop如何使用HDFS抽象存儲(chǔ)的——從關(guān)聯(lián)的計(jì)算特性上。通過(guò)HDFS中存儲(chǔ)的數(shù)據(jù),任意job都可以對(duì)于數(shù)據(jù)進(jìn)行運(yùn)算,使用寫在核心MapReduce API上,或者使用Hadoop流技術(shù)直接使用native語(yǔ)言編程?;贖adoop 2和YARN,甚至核心編程模型都已經(jīng)被抽象了,你不再受到MapReduce的牽制了。使用YARN你可以在Hadoop上實(shí)現(xiàn)MPI并且用那種方式寫job。

額外地,Hadoop生態(tài)系統(tǒng)提供了一個(gè)交錯(cuò)的工具集合,建立在HDFS和核心MapReduce之上,來(lái)進(jìn)行數(shù)據(jù)的查詢、分析和處理。Hive提供了一個(gè)類似SQL的語(yǔ)言,使得業(yè)務(wù)分析可以使用一個(gè)用戶習(xí)慣的語(yǔ)法進(jìn)行查詢。HBASE提供了一個(gè)基于Hadoop的面向列的數(shù)據(jù)庫(kù)。Pig和Sizzle提供了兩個(gè)更加不同的編程模型來(lái)查詢Hadoop數(shù)據(jù)。對(duì)存儲(chǔ)在HDFS中的數(shù)據(jù)的使用,你可以繼承Mahout的機(jī)器學(xué)習(xí)的能力至你的工具集。當(dāng)使用RHadoop時(shí),你可以直接使用R統(tǒng)計(jì)語(yǔ)言來(lái)對(duì)Hadoop數(shù)據(jù)執(zhí)行高級(jí)的統(tǒng)計(jì)分析

所以,盡管Hadoop和MongoDB也有部分重疊的應(yīng)用場(chǎng)景并且共同擁有一些有用的功能(無(wú)縫的水平擴(kuò)展),但是兩者之間還是有著特定的場(chǎng)景。如果你僅僅想要通過(guò)關(guān)鍵字和簡(jiǎn)單的分析,那么Elasticsearch可以完成任務(wù);如果你需要查詢文檔,并且包含更加復(fù)雜的分析過(guò)程,那么MongoDB相當(dāng)適合;如果你有一個(gè)海量的數(shù)據(jù),需要大量不同的復(fù)雜處理和分析,那么Hadoop提供了最為廣泛的工具和靈活性。

一個(gè)亙古不變的道理就是選擇手頭最適合的工具做事。在大數(shù)據(jù)這樣的背景下,技術(shù)層出不窮,技術(shù)間的界限也是相當(dāng)?shù)哪:?,這對(duì)我們的選擇是一件相當(dāng)困難的事情。正如你所見(jiàn),特定的場(chǎng)景有著最適合的技術(shù),這種差異性是相當(dāng)重要的。最好的消息就是你不在限定在某一種工具或者技術(shù)上。依賴于你面對(duì)的場(chǎng)景,這就使得我們能夠構(gòu)建一個(gè)整合的系統(tǒng)。例如,我們知道Elasticsearch和Hadoop是可以很好地一起共事的,使用Elasticsearch快速的關(guān)鍵詞查詢,Hadoop job則能處理相當(dāng)復(fù)雜的分析。

最終,采用了最大的搜索和細(xì)致的分析來(lái)確認(rèn)最為合適的選擇。在選擇任何技術(shù)或者平臺(tái)時(shí),需要仔細(xì)地驗(yàn)證它們,理解這個(gè)東東適合哪些場(chǎng)景,哪里可以進(jìn)行優(yōu)化,需要做出哪些犧牲。從一個(gè)小小的預(yù)研項(xiàng)目開(kāi)始,確認(rèn)完畢后,再將技術(shù)應(yīng)用到真正的平臺(tái)上,緩慢地升級(jí)到新的層級(jí)。

跟隨這些建議,你可以成功地在大數(shù)據(jù)技術(shù)中遨游,并且獲得相應(yīng)的回報(bào)。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容