Spark是當今大數據領域最活躍、最熱門、最高效的大數據通用計算平臺。node
第1章 Spark編程模型
在任何規模的數據計算中,Spark在性能和擴展性上都更具優點,Spark正在加速成爲一體化、多元化的大數據處理中心的首選和惟一的計算平臺。編程
1.1 Spark:一體化、多元化的高速大數據通用計算平臺和庫
RDD(Resilient Distributed Datasets) ,彈性分佈式數據集, 是分佈式內存的一個抽象概念,RDD提供了一種高度受限的共享內存模型,即RDD是隻讀的記錄分區的集合,只能經過在其餘RDD執行肯定的轉換操做(如map、join和group by)而建立,然而這些限制使得實現容錯的開銷很低。對開發者而言,RDD能夠看做是Spark的一個對象,它自己運行於內存中,如讀文件是一個RDD,對文件計算是一個RDD,結果集也是一個RDD ,不一樣的分片、 數據之間的依賴 、key-value類型的map數據均可以看作RDD。網絡
基於RDD,Spark的四大子系統Spark SQL、Spark Streaming、MLlib、GraphX四大子框架和庫之間能夠共享數據和操做。多線程
1.1.1 爲何須要使用Spark
一、Hadoop衰落,Spark稱霸
Hadoop的MapReduce具備高延遲的致命特色,致使Hadoop無力處理不少對時間有要求的場景。即Hadoop自己的計算模型決定了Hadoop上全部的工做都要轉化成Map、Shuffle和Reduce等核心階段,因爲每次計算都須要從磁盤讀或寫數據,同事整個計算模型須要網絡傳輸,就致使了延遲性。並且任務運行是串行的,致使了無力支持交互式應用。併發
二、爲何須要Spark
快速:Spark有一個Directed Acyclic Graph(DAG 有向無環圖)執行引擎,支持循環數據流和內存計算。框架
易用:提供多語言(包括Scala、Java、Python) API,可以快速實現應用。機器學習
通用:提供了一個強大的技術棧,包括查詢語言 Spark SQL、機器學習工具 MLlib、圖計算工具 GraphX、實時流處理工具 Spark Streaming,在同一個應用程序中能夠無縫地鏈接使用這些框架。分佈式
集成Hadoop:能夠運行在第二代Hadoop集羣管理Yarn上。函數
三、Spark術語
表1-1 Spark的集中運行模式工具
local | 本地模式 | 經常使用於本地開發測試,本地還分爲local和local-cluster,local-cluster實際上是多線程,可以在單機上處理必定的併發 |
standalone | 集羣模式 | 典型的Master/Slave模式,不過Master是有單點故障的;Spark支持ZooKeeper來實現HA |
on yarn | 集羣模式 | 運行在Yarn資源管理器框架之上,由Yarn負責資源管理,Spark負責任務調度和計算 |
on mesos | 集羣模式 | 運行在mesos資源管理器框架之上,由Mesos負責資源管理,Spark負責任務調度和計算 |
on cloud | 集羣模式 | 好比AWS的EC2,使用這個模式能很方便地訪問Amazon的S3 Spark支持多種分佈式存儲系統:HDFS和S3. |
每一個Spark程序都包含一個驅動程序,而這個驅動程序的任務就是直行用戶的main函數,而且將各類算子分不到整個Spark集羣中並行運行。
表1-2 常見術語
Application | Spark的應用程序,包含一個Driver program和若干個Executor |
Driver Program | 運行Application的main()函數,而且建立SparkContext |
SparkContext | Spark應用程序的入口,負責調度每一個運算資源,協調各個Worker Node上的Executor |
Executor | 是Application運行在Worker node上的一個進程,該進程負責運行Task,而且負責將數據存在內存或磁盤上。每一個Application都會申請各自的Executors來處理任務。 |
Worker Node | 集羣中任何能夠運行Applicaiton代碼的節點,運行一個或多個Executor進程。 |
Cluster Manager | 在集羣上獲取資源的外部服務(例如:Standalone、Mesos、Yarn) |
Task | 運行在Executor上的工做單元 |
Job | SparkContext提交的具體Action操做,常和Action對應。 |
Stage | 每一個Job會被拆分稱不少組任務(task),每組任務被稱爲Stage,也稱TaskSet |
RDD | resilient distributed datasets 彈性分佈式數據集,是Spark最核心的模塊和類 |
DAGScheduler | 根據Job構建基於Stage的DAG,並提交Stage給TaskScheduler |
TaskScheduler | 將Stage(TaskSet)提交給Worker Node集羣運行,並返回結果 |
Transformations/Action | Transformations的返回值仍是一個RDD。 Action的返回值是一個Scala集合,不是一個RDD。 全部的Transformation都是採用的懶策略,只將Transformation提交併不會執行計算,只有Action被提交時纔會直行計算。 |