跟蹤源碼
spark-shell -> spark-submit -> spark-class
SparkSubmit -> repl.Main -> ILoop ( SparkILoop ).process -> loadFiles ( initializeSpark ( createSparkSession ) ) -> printWelcome
Spark設計理念與基本架構
Hadoop MRv1
組成部分
1.運行環(huán)境:JobTracker 和 TaskTracker
2.編程模型:MapReduce
3.數(shù)據(jù)處理引擎:Map Task 和 Reduce Task
缺點
1.JobTracker 既負責 資源管理 又負責 任務調(diào)度,容易成為瓶頸。
2.單 Master,容易down饥脑。
3.TaskTracker 采用 slot 等量劃分本節(jié)點上的資源量( CPU、內(nèi)存 )鳍徽。slot 分為 Map slot 和 Reduce slot 曲伊, MapTask 只能用 Map slot髓梅,ReduceTask 只能用 Reduce slot织阅。有時會 MapTask 較多時壳繁,而 Reduce Task 還沒有被調(diào)度,這時 Reduce slot 會被閑置。
Hadoop MRv2
改進
1.JobTracker被拆分成了通用的資源調(diào)度平臺(ResourceManager RM)和負責各個計算框架的任務調(diào)度模塊(ApplicationMaster AM)闹炉。
2.MRv2 中核心不再是 MapReduce蒿赢,而是Yarn,MapReduce 框架時可插拔的渣触,可以用 Spark羡棵、Storm 替代。
缺點
對HDFS的頻繁操作(包括計算結果持久化昵观、數(shù)據(jù)備份以及 shuffle )導致磁盤 I/O 成為系統(tǒng)性能的瓶頸晾腔。只適合離線的數(shù)據(jù)處理舌稀,不具備實時處理的能力啊犬。
Spark
基本概念
RDD:彈性分布式數(shù)據(jù)集
Task:具體執(zhí)行的任務。分為 ShuffleMapTask 和 ResultTask兩種壁查,兩者分別對應與 Hadoop 中的 Map 和 Reduce觉至。
Job:用戶提交的作業(yè)。
Stage:Job分成的階段睡腿。根據(jù)依賴劃分 Stage 语御。
Partition:數(shù)據(jù)分區(qū)。一個RDD數(shù)據(jù)可以被劃分成多個 Partition席怪。
NarrowDependency:窄依賴应闯,即子 RDD 依賴于 RDD 中固定的 Partition。分為OneToOneDependency 和 RangeDependency 兩種挂捻。
ShuffleDependency:shuffle依賴碉纺,寬依賴。子 RDD 對父 RDD 中的所有 Partition 都有依賴刻撒。
DAG:有向無環(huán)圖骨田。反映各 RDD 之間的依賴關系。
核心功能
SparkContext
Driver Application 的執(zhí)行與輸出都是通過 SparkContext 來完成的声怔。
①內(nèi)置的 DAGScheduler 負責創(chuàng)建 Job态贤,將 DAG 中的 RDD 劃分到不同的 Stage,提交 Stage 等功能醋火。
②內(nèi)置的 TaskScheduler 負責資源的申請悠汽、任務的提交以及請求集群對任務的調(diào)度等工作。
存儲體系
優(yōu)先考慮使用各個節(jié)點的內(nèi)存作為存儲芥驳。Spark 還提供了以內(nèi)存為中心的高容錯的分布式文件系統(tǒng) Tachyon 供用戶進行選擇介粘。Tachyon 能夠為 Spark 提供可靠的內(nèi)存級的文件共享服務。
計算引擎
由 SparkContext 中的 DAGScheduler晚树、RDD以及具體節(jié)點上的 Executor 負責執(zhí)行的 Map 和 Reduce 任務組成姻采。DAGScheduler 和 RDD 雖然位于 SparkContext 內(nèi)部,但是在任務正式提交與執(zhí)行之前會將 Job 中的 RDD 組成DAG,決定了執(zhí)行階段任務的數(shù)量慨亲、迭代計算婚瓜、shuffle 等過程。
部署模式
SparkContext 的 TaskScheduler 組件中提供了對 Standalone 部署模式的實現(xiàn)和 Yarn刑棵、Mesos 等分布式資源管理系統(tǒng)的支持巴刻。除此之外,還提供了 Local 模式便于開發(fā)和調(diào)試蛉签。
編程模型
1.使用 SparkContext 提供的API 編寫 Driver application程序胡陪。
2.使用 SparkContext 提交用戶編寫的 Driver application程序。具體:
①使用 BlockManager 和 BroadcastManager 將任務的 Hadoop 配置進行廣播碍舍。
② DAGSchduler 將任務轉換為 RDD 并組織成 DAG柠座,DAG還將被劃分為不同的Stage。
③ TaskSchduler 通過 ActorSystem將任務提交給集群管理器(Cluster Manager)片橡。
3.集群管理器(Cluster Manager)給任務分配資源妈经,即將具體任務分配到 Worker上,Worker 創(chuàng)建 Executor 來處理任務的運行捧书。Standalone吹泡、YARN、Mesos经瓷、EC2 等都可以作為 Spark 的集群管理器爆哑。
RDD計算模型
每個分區(qū)的數(shù)據(jù)只會在一個Task中計算。
基本架構
1.Cluster Manager
Spark 的集群管理器舆吮,主要負責資源的分配與管理揭朝。集群管理器分配的資源屬于一級分配,它將各個 Worker 上的內(nèi)存歪泳、CPU 等資源分配給應用程序(Driver application)萝勤,但是并不負責對 Executor 的資源分配。Standalone呐伞、YARN敌卓、Mesos、EC2 等都可以作為 Spark 的集群管理器伶氢。
2.Worker
Spark的工作節(jié)點趟径。其獲得由集群資源(Cluster Manager)分配的資源,負責創(chuàng)建 Executor癣防,將資源和任務進一步分配給 Executor蜗巧,同步資源信息給 Cluster Manager。
3.Executor
執(zhí)行計算任務的單元(線程 or 進程蕾盯?)幕屹,主要負責任務的執(zhí)行以及與 Worker、Driver App的信息同步。
4.Driver App
客戶端應用程序望拖。用于將任務程序轉換為 RDD 和 DAG渺尘,并與 Cluster Manager 進行通信與調(diào)度。