- 比較重要的2個原因
– 1、基於內存
mapreduce任務每次都會把結果數據落地到磁盤,后續有其他的job需要依賴於前面job的輸出結果,這里就需要進行大量的磁盤io操作,獲取前面job的輸出結果。性能非常低
例如:select name,age from ( select * from user where address = 'beijing')
------------job2-------- ------------------job1-----------------------
spark任務的輸出結果可以保存在內存中,后續有其他的job需要依賴於前面job的輸出結果,這里就只需要直接從內存中獲取得到,大大減少磁盤io操作。
spark框架適合於迭代計算
job1----->job2----->job3----->job4----->job5----->jobN......
– 2、進程和線程
mapreduce任務它是以進程的方式運行在yarn集群中,比如說一個mapreduce任務有100個MapTask,后期需要運行這100個task,就需要啟動100個進程。
spark任務它是以線程的方式運行在worker節點的executor進程中,比如說一個spark任務有100個MapTask,這里后期需要運行100個線程就可以了。
可以這樣極端一點:只需要啟動一個進程,在一個進程中運行100個線程就可以了.開啟一個進程比開啟一個線程需要的時間和資源調度肯定是不一樣,開啟一個進程需要的時間遠遠大於線程.
