落地方式不同
mapreduce任務每一次處理完成之后所產生的結果數據只能夠保存在磁盤,后續有其他的job需要依賴於前面job的輸出結果,這里就只能夠進行大量的io操作獲取得到,性能就比較低。
spark任務每一次處理的完成之后所產生的結果數據可以保存在內存中,后續有其他的job需要依賴於前面job的輸出結果,這里就可以直接從內存中獲取得到,大大減少磁盤io操作,性能非常高。
處理方式不同
mapreduce的任務是以進程的方式運行在yarn集群中,比如有100個MapTask要運行,這里就需要開啟100個進程。
spark的任務是以線程的方式運行在worker節點的executor進程中,比如有100個MapTask要運行,這里需要開啟100線程就可以了,這里還可以這樣極端一點:可以只開啟一個進程,在這個進程中運行100個線程就ok了。開啟一個進程與一個線程的代價(資源調度和時間)是不一樣。開啟一個進程是遠遠大於線程所需要的時間。
shuffle操作不同
消除了冗余的MapReduce階段Hadoop的shuffle操作一定連着完整的MapReduce操作,冗余繁瑣。而Spark基於RDD提供了豐富的算子操作,且reduce操作產生shuffle數據,可以緩存在內存中。