https://www.iteblog.com/archives/1126.html?from=like
以下的話是由Apache Spark committer的Reynold Xin闡述。(就是著名的辛湜,Spark核心成員,中國博士生)
從很多方面來講,Spark都是MapReduce 模式的最好實現(xiàn)。比如
從程序抽象的角度來看:
1、他抽象出Map/Reduce兩個階段來支持tasks的任意DAG。大多數(shù)計算通過依賴將maps和reduces映射到一起(Most computation maps (no pun intended) into many maps and reduces with dependencies among them. )。而在Spark的RDD編程模型中,將這些依賴弄成DAG 。通過這種方法,更自然地表達出計算邏輯。
2、通過更好的語言來集成到模型中的數(shù)據(jù)流,他拋棄了Hadoop MapReduce中要求的大量樣板代碼。通常情況下,當(dāng)你看一個的Hadoop MapReduce的程序,你很難抽取出這個程序需要做的事情,因為 the huge amount of boiler plates,而你閱讀Spark 程序的時候你會感覺到很自然。(這段翻譯起來很別扭,請參見下面原文)
Through better language integration to model data flow, it does away with the huge amount of boilerplate code required in Hadoop MapReduce. Typically when you look at a Hadoop MapReduce program, it is difficult to extract what it attempts to do because of the huge amount of boilerplates, whereas it is much more natural to read a Spark program.
3. 由于Spark的靈活編程模型,Hadoop MapReduce 中必須和嵌入的操作現(xiàn)在直接在應(yīng)用程序的環(huán)境中。也就是應(yīng)用程序可以重寫shuffle 或者aggregation 函數(shù)的實現(xiàn)方式。而這在MapReduce是不可能的!雖然不是絕大部分的應(yīng)用程序會重寫這些方法,但是這種機制可以使得某些人基于特定的場景來重寫相關(guān)的函數(shù),從而使得計算得到最優(yōu)。
4. 最后,應(yīng)用程序可以將數(shù)據(jù)集緩存到集群的內(nèi)存中。這種內(nèi)置的機制其實是很多應(yīng)用程序的基礎(chǔ),這些應(yīng)用程序在短時間內(nèi)需要多次方法訪問這些數(shù)據(jù)集,比如在機器學(xué)習(xí)算法中。
### 從系統(tǒng)的高層次來看:
1、Spark通過快速的RPCs 方式來調(diào)度作業(yè)
2、Spark在線程池中來運行task,而不是一系列的JVM進程。上面兩個計算結(jié)合起來,使得Spark可以在毫秒級別的時間內(nèi)調(diào)度task。然而在MP調(diào)度模型中,需要花費數(shù)秒甚至是數(shù)分鐘(繁忙的集群)來調(diào)度task。
3、Spark不僅支持基于checkpointing(checkpointing-based)的容錯(這種方式也是Hadoop MP采用的),也支持基于血統(tǒng)( lineage-based )的容錯機制。錯誤是很常見的,基于血統(tǒng)( lineage-based )的容錯機制可以快速地從失敗中恢復(fù)!
4、部分也是由于學(xué)術(shù)方面的原因,Spark社區(qū)常常有新的思維,其中一個例子就是,在Spark中采用BT協(xié)議來廣播數(shù)據(jù)。