跟蹤源碼
spark-shell -> spark-submit -> spark-class



SparkSubmit -> repl.Main -> ILoop ( SparkILoop ).process -> loadFiles ( initializeSpark ( createSparkSession ) ) -> printWelcome




Spark設(shè)計(jì)理念與基本架構(gòu)
Hadoop MRv1

組成部分
1.運(yùn)行環(huán)境:JobTracker 和 TaskTracker
2.編程模型:MapReduce
3.數(shù)據(jù)處理引擎:Map Task 和 Reduce Task
缺點(diǎn)
1.JobTracker 既負(fù)責(zé) 資源管理 又負(fù)責(zé) 任務(wù)調(diào)度,容易成為瓶頸。
2.單 Master,容易down。
3.TaskTracker 采用 slot 等量劃分本節(jié)點(diǎn)上的資源量( CPU、內(nèi)存 )。slot 分為 Map slot 和 Reduce slot , MapTask 只能用 Map slot,ReduceTask 只能用 Reduce slot。有時(shí)會(huì) MapTask 較多時(shí),而 Reduce Task 還沒有被調(diào)度,這時(shí) Reduce slot 會(huì)被閑置。
Hadoop MRv2

改進(jìn)
1.JobTracker被拆分成了通用的資源調(diào)度平臺(tái)(ResourceManager RM)和負(fù)責(zé)各個(gè)計(jì)算框架的任務(wù)調(diào)度模塊(ApplicationMaster AM)。
2.MRv2 中核心不再是 MapReduce,而是Yarn,MapReduce 框架時(shí)可插拔的,可以用 Spark、Storm 替代。
缺點(diǎn)
對(duì)HDFS的頻繁操作(包括計(jì)算結(jié)果持久化、數(shù)據(jù)備份以及 shuffle )導(dǎo)致磁盤 I/O 成為系統(tǒng)性能的瓶頸。只適合離線的數(shù)據(jù)處理,不具備實(shí)時(shí)處理的能力。
Spark
基本概念
RDD:彈性分布式數(shù)據(jù)集
Task:具體執(zhí)行的任務(wù)。分為 ShuffleMapTask 和 ResultTask兩種,兩者分別對(duì)應(yīng)與 Hadoop 中的 Map 和 Reduce。
Job:用戶提交的作業(yè)。
Stage:Job分成的階段。根據(jù)依賴劃分 Stage 。
Partition:數(shù)據(jù)分區(qū)。一個(gè)RDD數(shù)據(jù)可以被劃分成多個(gè) Partition。
NarrowDependency:窄依賴,即子 RDD 依賴于 RDD 中固定的 Partition。分為OneToOneDependency 和 RangeDependency 兩種。
ShuffleDependency:shuffle依賴,寬依賴。子 RDD 對(duì)父 RDD 中的所有 Partition 都有依賴。
DAG:有向無環(huán)圖。反映各 RDD 之間的依賴關(guān)系。
核心功能
SparkContext
Driver Application 的執(zhí)行與輸出都是通過 SparkContext 來完成的。
①內(nèi)置的 DAGScheduler 負(fù)責(zé)創(chuàng)建 Job,將 DAG 中的 RDD 劃分到不同的 Stage,提交 Stage 等功能。
②內(nèi)置的 TaskScheduler 負(fù)責(zé)資源的申請(qǐng)、任務(wù)的提交以及請(qǐng)求集群對(duì)任務(wù)的調(diào)度等工作。
存儲(chǔ)體系
優(yōu)先考慮使用各個(gè)節(jié)點(diǎn)的內(nèi)存作為存儲(chǔ)。Spark 還提供了以內(nèi)存為中心的高容錯(cuò)的分布式文件系統(tǒng) Tachyon 供用戶進(jìn)行選擇。Tachyon 能夠?yàn)?Spark 提供可靠的內(nèi)存級(jí)的文件共享服務(wù)。
計(jì)算引擎
由 SparkContext 中的 DAGScheduler、RDD以及具體節(jié)點(diǎn)上的 Executor 負(fù)責(zé)執(zhí)行的 Map 和 Reduce 任務(wù)組成。DAGScheduler 和 RDD 雖然位于 SparkContext 內(nèi)部,但是在任務(wù)正式提交與執(zhí)行之前會(huì)將 Job 中的 RDD 組成DAG,決定了執(zhí)行階段任務(wù)的數(shù)量、迭代計(jì)算、shuffle 等過程。
部署模式
SparkContext 的 TaskScheduler 組件中提供了對(duì) Standalone 部署模式的實(shí)現(xiàn)和 Yarn、Mesos 等分布式資源管理系統(tǒng)的支持。除此之外,還提供了 Local 模式便于開發(fā)和調(diào)試。
編程模型

1.使用 SparkContext 提供的API 編寫 Driver application程序。
2.使用 SparkContext 提交用戶編寫的 Driver application程序。具體:
①使用 BlockManager 和 BroadcastManager 將任務(wù)的 Hadoop 配置進(jìn)行廣播。
② DAGSchduler 將任務(wù)轉(zhuǎn)換為 RDD 并組織成 DAG,DAG還將被劃分為不同的Stage。
③ TaskSchduler 通過 ActorSystem將任務(wù)提交給集群管理器(Cluster Manager)。
3.集群管理器(Cluster Manager)給任務(wù)分配資源,即將具體任務(wù)分配到 Worker上,Worker 創(chuàng)建 Executor 來處理任務(wù)的運(yùn)行。Standalone、YARN、Mesos、EC2 等都可以作為 Spark 的集群管理器。
RDD計(jì)算模型
每個(gè)分區(qū)的數(shù)據(jù)只會(huì)在一個(gè)Task中計(jì)算。
基本架構(gòu)

1.Cluster Manager
Spark 的集群管理器,主要負(fù)責(zé)資源的分配與管理。集群管理器分配的資源屬于一級(jí)分配,它將各個(gè) Worker 上的內(nèi)存、CPU 等資源分配給應(yīng)用程序(Driver application),但是并不負(fù)責(zé)對(duì) Executor 的資源分配。Standalone、YARN、Mesos、EC2 等都可以作為 Spark 的集群管理器。
2.Worker
Spark的工作節(jié)點(diǎn)。其獲得由集群資源(Cluster Manager)分配的資源,負(fù)責(zé)創(chuàng)建 Executor,將資源和任務(wù)進(jìn)一步分配給 Executor,同步資源信息給 Cluster Manager。
3.Executor
執(zhí)行計(jì)算任務(wù)的單元(線程 or 進(jìn)程?),主要負(fù)責(zé)任務(wù)的執(zhí)行以及與 Worker、Driver App的信息同步。
4.Driver App
客戶端應(yīng)用程序。用于將任務(wù)程序轉(zhuǎn)換為 RDD 和 DAG,并與 Cluster Manager 進(jìn)行通信與調(diào)度。