您好,登錄后才能下訂單哦!
本篇內容主要講解“Spark 和 MR 的區別是什么”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“Spark 和 MR 的區別是什么”吧!
先說結論:Hadoop MapReduce采用了多進程模型,而Spark采用了多線程模型
接下來,來一起分析,這兩種模式的區別以及優缺點:
Apache Spark的高性能一定程度上取決于它采用的異步并發模型(這里指server/driver 端采用的模型),這與Hadoop 2.X(包括YARN和MapReduce)是一致的。
Hadoop 2.X自己實現了類似Actor的異步并發模型,實現方式是epoll+狀態機,而Apache Spark則直接采用了開源軟件Akka,該軟件實現了Actor模型,性能非常高。
盡管二者在 server 端采用了一致的并發模型,但在任務級別(特指 Spark任務和MapReduce任務)上卻采用了不同的并行機制:Hadoop MapReduce采用了多進程模型,而Spark采用了多線程模型。
注意,本文的多進程和多線程,指的是同一個節點上多個任務的運行模式。無論是MapReduce和Spark,整體上看,都是多進程:MapReduce應用程序是由多個獨立的Task進程組成的;Spark應用程序的 運行環境是由多個獨立的Executor進程構建的臨時資源池構成的。
多進程模型便于細粒度控制每個任務占用的資源,但會消耗較多的啟動時間,不適合運行低延遲類型的作業,這是MapReduce廣為詬病的原因之一。而多線程模型則相反,該模型使得Spark很適合運行低延遲類型的作業。總之,Spark同節點上的任務以多線程的方式運行在一個JVM進程中,可帶來以下好處:
1)任務啟動速度快,與之相反的是MapReduce Task進程的慢啟動速度,通常需要1s左右;
2)同節點上所有任務運行在一個進程中,有利于共享內存。這非常適合內存密集型任務,尤其對于那些需要加載大量詞典的應用程序,可大大節省內存。
3) 同節點上所有任務可運行在一個JVM進程(Executor)中,且Executor所占資源可連續被多批任務使用,不會在運行部分任務后釋放掉,這避免了每個任務重復申請資源帶來的時間開銷,對于任務數目非常多的應用,可大大降低運行時間。與之對比的是MapReduce中的Task:每個Task單獨申請資源,用完后馬上釋放,不能被其他任務重用,但是可以通過設置 mapred.job.reuse.jvm.num.tasks = 大于 0 的值,來開啟 JVM 重用。(開啟 JVM 重用:這個功能的缺點是,開啟JVM重用將一直占用使用到的task插槽,以便進行重用,直到任務完成后才能釋放。如果某個“不平衡的”job中有某幾個reduce task執行的時間要比其他Reduce task消耗的時間多的多的話,那么保留的插槽就會一直空閑著卻無法被其他的job使用,直到所有的task都結束了才會釋放)
盡管Spark的過線程模型帶來了很多好處,但同樣存在不足,主要有:
1)由于同節點上所有任務運行在一個進程中,因此,會出現嚴重的資源爭用,難以細粒度控制每個任務占用資源。與之相 反的是MapReduce,它允許用戶單獨為Map Task和Reduce Task設置不同的資源,進而細粒度控制任務占用資源量,有利于大作業的正常平穩運行。
到此,相信大家對“Spark 和 MR 的區別是什么”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。