MapReduce和Spark主要解決哪些方面的問題?
希望能具體點,實際大應用的例子?具體怎麼應用的?
主要不是原理角度,是實際案例角度?
簡單的說就是問題可以劃分成若干單元,每個單元的計算互不相關,單元計算結果可以在可以承受的時間內合成為總結果的計算。再說直白一點:所有分治模型都可交由hadoop解決。可以說spark是功能更全面的hadoop,支持一些諸如filter、group之類的操作,但是原本思想仍是map reduce,差別不太大。
map reduce確切的說是兩步操作:map操作和reduce操作。具體執行的時候其實是語言無關的,只要你能按照其標準輸入輸出,哪怕用brainfu*k寫的代碼,能獨立運行都可以。當然hadoop在java上有框架介面,spark直接構建在scala上會更加方便開發,但是實際上完全可以用任意語言做map reduce。
舉個幾乎每個教程都會談到的例子:單詞出現次數統計。如果只有很少的文本,這個統計基本上就是劃分單詞,統計次數而已,單機上寫個循環就能解決。但是如果文本量超TB甚至更多,單機的效率自然吃不消。但是我們可以把這超長文本劃分為若干段,每一段就MB量級,分配給一個計算節點,那麼每段對於一個分散式計算節點而言計算量就可以接受了。
mapper部分是一個結算節點用的處理程序,用標準輸入輸出流接收數據和輸出處理結果。對於單詞統計,它輸入的內容自然是一段文章,輸出的內容則是這段文章中的單詞統計結果。顯然節點之間所做的工作僅與送給此節點的數據有關,而與其它節點的數據或結果無關。例如對於文字 「I love hadoop」,這個mapper可以給出如下輸出:
I 1love 1hadoop 1reducer則是負責收集數據的。它通過標準流輸入輸出,輸入格式等同於mapper的輸出格式。hadoop會把所有mapper的結果簡單拼接一下然後全扔給reducer(根據配置不同,可能拼接時會有排序)。
reducer所做的工作則是將這些內容合成出最終結果。比如兩段文本「I love hadoop」,以及「I love you」,分配給mapper處理,會得到兩個輸出
1-------I 1
love 1hadoop 12
-------I 1love 1you 1然後reducer拿到的輸出則是拼在一起的結果
I 1love 1
hadoop 1I 1love 1you 1reducer進行處理合併,最終結果大概是
I 2love 2hadoop 1you 1而hadoop或者spark框架的存在,使得你可以寫好mapper和reducer,然後告訴框架你的數據在哪兒,怎麼劃分之類的配置,框架自動將需要的工作分配給實際上的計算節點,自動連接的mapper和reducer的輸入輸出,然後得到計算結果。其中你並不需要考慮多機通訊、狀態監測之類的問題,只需要寫好與本地單機運算沒什麼差別的簡單程序就好。
因此對統計、學習、數學運算(迭代),求最優解之類的問題,都可以適用於map reduce。謝邀。
在過去,處理大量數據或計算時,我們會依頼一部超級電腦,因為他有快速的計算器和大量的容量。但這不是一般人可以負擔,而且現在的數據量是超級電腦也無法處理的,故人們便要想一個系統出來讓人們可以很方便同時用多部電腦(無論是家用電腦或超級電腦與否)做計算和保存。另外,即使我們有一個高速的中央處理器,但在硬碟讀寫數據的速度卻是硬傷,所以如果有多部電腦同時做讀寫,那可省下不少時間。
MapReduce就是來解決這問題的。現在很多公司都用Hadoop或Spark,這些都是用MapReduce模式做計算的。當我們有很多數據,要建模時,Hadoop可行使分散式計算,如Google計算PageRank、廣告公司計算Bayes模型、數據搜索如在一千部電腦內的硬碟中尋找有史以來最高的氣溫??
Hadoop是用Java寫的。我相信很多有經驗數據科學家都很喜歡用R或Python建模,然後用Java或C++實現,這是無可厚非的,因為用Python一類的語言建模很有效率,當我們不知道要用什麼模型和演算法時,我們一定要快速驗證。但問題是,當我們知道什麼演算法可行,卻又要用另一工具實現時,那就有點費時失事。而且Python用Hadoop是很麻煩的,人們很少用Python做分散式計算,所以我們用Scala(一個JVM語言),而這跟Python一樣可以interactive programming,又是函數式編程(處理數據方便),卻又行在JVM上。而對應的MapReduce工具就是Spark。用Spark,數據科學家可即時測試不同的模型,而測試可在MapReduce的架構下進行,而且可以interactive programming,就像Python或MATLAB一樣。一台機器算不過來很好分布到多台機器吧我擦
怎麼搞啊?
我只會寫pi的計算程序啊怎麼讓幾台機器協同計算啊?!hadoopmr和spark就是這麼個框架你專心寫核心計算代碼其它的它來搞定mapreduce和spark都是分散式計算框架,相對於傳統分散式計算來說,兩者給程序員提供了方便的分散式計算環境,我們不需要考慮底層怎麼並行計算,怎麼協調同步,怎麼容錯,我們只需考慮我們的業務就可以完成分散式計算。而兩者的側重點也不同,mr適合批處理,對時效性要求不高的離線計算等等,因為它在計算的時候會將計算中間結果溢寫到磁碟上,io消耗比較大,而spark是基於內存的計算框架,直接在內存中完成計算,從這點來說它的計算速度是很好的,spark有很多模塊比如實時計算,圖計算,sparkSQL等等,從編程上來說如果用Scala會非常方便。上述說明並不意味著spark完全優於Mr,只是兩者側重點不同,在大數據生態中對於計算引擎的選擇要考慮多方面因素,比如資源消耗,計算性能,穩定性,計算場景等。
map reduce 解決的是並行的問題。。。hadoop spark storm 是幾個軟體幫我們把這個事情做得更方便、高效和robust。。。
個人認為這個問題的答案還是抽象點好。。。如果題主非想看栗子的話前些天我倒恰好在知乎上看到過一個。。。hadoop「去哪兒網」面試題,計算20140510這天去哪兒旅行App的訂單有多少來自單程搜索,有多少來自往返搜索? - Hadoop
從 MR 和 spark 解決的問題來說吧。
1. disk io 密集問題的分散式求解
2. 自動容錯,解放了人類生產力如果沒有這個系統,會很累很累的
spark 是對 MR 的升級,兩者本質上是一致的。推薦閱讀:
※Spark可以完全替代hadoop嗎?
※為什麼在中國搞不出 Spark 和 Hadoop 這種東西?
※想轉行做大數據技術相關的工作,需要學習語言還是學什麼?
※分散式資料庫下子查詢和join等複雜sql如何實現?
※如何評價小米團隊擁有4個hbase committer?