分布式計算框架——Spark


產生的背景

1)MapReduce有較大的局限性
僅支持Map、Reduce兩種語義操作
執行效率低,時間開銷大
主要用於大規模離線批處理
不適合迭代計算、交互式計算、實時流處理等場景
2)計算框架種類多,選型難,學習成本高
批處理:MapReduce
流處理:Storm、Flink
交互式計算:Impala、Presto
機器學習:Mahout
3)統一計算框架,簡化技術選型
在一個統一框架下,實現批處理、流處理、交互式計算、機器學習

1 Spark概念

Spark 提供了一個全面、統一的框架用於管理各種有着不同性質(文本數據、圖表數據等)的數據集和數據源(批量數據或實時的流數據)的大數據處理的需求。
具有高吞吐、低延時、通用易擴展、高容錯等特點
采用Scala語言開發
提供多種運行模式

特點

1)計算高效
利用內存計算、Cache緩存機制,支持迭代計算和數據共享,減少數據讀取的IO開銷
利用DAG引擎,減少中間計算結果寫入HDFS的開銷
利用多線程池模型,減少任務啟動開銷,避免Shuffle中不必要的排序和磁盤IO操作
2)通用易用
適用於批處理、流處理、交互式計算、機器學習算法等場景
提供了豐富的開發API,支持Scala、Java、Python、R等

2 Spark核心架構

Spark Core

包含 Spark 的基本功能;尤其是定義 RDD 的 API、操作以及這兩者上的動作。其他 Spark 的庫都是構建在 RDD 和 Spark Core 之上的

Spark SQL

提供通過 Apache Hive 的 SQL 變體 Hive 查詢語言(HiveQL)與 Spark 進行交互的 API。每個數據庫表被當做一個 RDD,Spark SQL 查詢被轉換為 Spark 操作。

Spark Streaming

對實時數據流進行處理和控制。Spark Streaming 允許程序能夠像普通 RDD 一樣處理實時數據

Mllib

一個常用機器學習算法庫,算法被實現為對 RDD 的 Spark 操作。這個庫包含可擴展的學習算法,比如分類、回歸等需要對大量數據集進行迭代的操作。

GraphX

控制圖、並行圖操作和計算的一組算法和工具的集合。GraphX 擴展了 RDD API,包含控制圖、創建子圖、訪問路徑上所有頂點的操作

3 Spark核心組件

Cluster Manager-制整個集群,監控 worker

在 standalone 模式中即為 Master 主節點,控制整個集群,監控 worker。在 YARN 模式中為資源管理器

Worker 節點-負責控制計算節點

從節點,負責控制計算節點,啟動 Executor 或者 Driver。

Driver: 運行 Application 的 main()函數

一個Spark程序有一個Driver,一個Driver創建一個SparkContext,程序的main函數運行在Driver中
負責解析Spark程序、划分Stage、調度任務到Executor上執行

SparkContext

負責加載配置信息,初始化運行環境,創建DAGScheduler和TaskScheduler

Executor:執行器,是為某個 Application 運行在 worker node 上的一個進程

負責執行Driver分發的任務,一個節點可以啟動多個Executor,每個Executor通過多線程運行多個任務

Task

Spark運行的基本單位,一個Task負責處理若干RDD分區的計算邏輯

4 SPARK編程模型


Spark 應用程序從編寫到提交、執行、輸出的整個過程如圖所示,圖中描述的步驟如下:
1). 用戶使用 SparkContext 提供的 API(常用的有 textFile、sequenceFile、runJob、stop 等)編寫 Driver application 程序。此外 SQLContext、HiveContext 及 StreamingContext 對
SparkContext 進行封裝,並提供了 SQL、Hive 及流式計算相關的 API。
2). 使用SparkContext提交的用戶應用程序,首先會使用BlockManager和BroadcastManager將任務的 Hadoop 配置進行廣播。然后由 DAGScheduler 將任務轉換為 RDD 並組織成 DAG,DAG 還將被划分為不同的 Stage。最后由 TaskScheduler 借助 ActorSystem 將任務提交給集群管理器(Cluster Manager)。
3). 集群管理器(ClusterManager)給任務分配資源,即將具體任務分配到Worker上,Worker創建 Executor 來處理任務的運行。Standalone、YARN、Mesos、EC2 等都可以作為 Spark的集群管理器。

RDD

彈性分布式數據集(Resilient Distributed Datesets)
分布在集群中的只讀對象集合
由多個Partition組成
通過轉換操作構造
失效后自動重構(彈性)
存儲在內存或磁盤中

Spark基於RDD進行計算


RDD操作(Operator)
1)Transformation(轉換)
將Scala集合或Hadoop輸入數據構造成一個新RDD
通過已有的RDD產生新RDD
惰性執行:只記錄轉換關系,不觸發計算
例如:map、filter、flatmap、union、distinct、sortbykey
2)Action(動作)
通過RDD計算得到一個值或一組值
真正觸發計算
例如:first、count、collect、foreach、saveAsTextFile

3)示例:RDD的兩種操作
rdd1.map(,+1).saveAsTextFile(“hdfs://node01:9000”)
4)RDD依賴(Dependency)
窄依賴(Narrow Dependency)
父RDD中的分區最多只能被一個子RDD的一個分區使用
子RDD如果有部分分區數據丟失或損壞,只需從對應的父RDD重新計算恢復
例如:map、filter、union
寬依賴(Shuffle/Wide Dependency )
子RDD分區依賴父RDD的所有分區
子RDD如果部分或全部分區數據丟失或損壞,必須從所有父RDD分區重新計算
相對於窄依賴,寬依賴付出的代價要高很多,盡量避免使用
例如:groupByKey、reduceByKey、sortByKey

5)示例:WordCount
val rdd1 = sc.textFile(“hdfs://node01:9000/data/wc/in”)
val rdd2 = rdd1.flatMap(
.split(“\t”))
val rdd3 = rdd2.map((,1))
val rdd4 = rdd3.reduceByKey((
+_))
rdd4.saveAsTextFile(“hdfs://node01:9000/data/wc/out”)

5 SPARK 計算模型

RDD 可以看做是對各種數據計算模型的統一抽象,Spark 的計算過程主要是 RDD 的迭代計算過程。RDD 的迭代計算過程非常類似於管道。分區數量取決於 partition 數量的設定,每個分區的數
據只會在一個 Task 中計算。所有分區可以在多個機器節點的 Executor 上並行執行。

6 Spark運行流程


1). 構建 Spark Application 的運行環境,啟動 SparkContext
2). SparkContext 向資源管理器(可以是 Standalone,Mesos,Yarn)申請運行 Executor 資源,
並啟動 StandaloneExecutorbackend,
3). Executor 向 SparkContext 申請 Task
4). SparkContext 將應用程序分發給 Executor
5). SparkContext 構建成 DAG 圖,將 DAG 圖分解成 Stage、將 Taskset 發送給 Task Scheduler,
最后由 Task Scheduler 將 Task 發送給 Executor 運行
6). Task 在 Executor 上運行,運行完釋放所有資源

7 SPARK RDD 流程


1). 創建 RDD 對象
2). DAGScheduler 模塊介入運算,計算 RDD 之間的依賴關系,RDD 之間的依賴關系就形成了
DAG
3). 每一個 Job 被分為多個 Stage。划分 Stage 的一個主要依據是當前計算因子的輸入是否是確
定的,如果是則將其分在同一個 Stage,避免多個 Stage 之間的消息傳遞開銷

8 SPARK RDD

RDD 的創建方式

1)從 Hadoop 文件系統(或與Hadoop兼容的其他持久化存儲系統,如Hive、Cassandra、HBase)輸入(例如 HDFS)創建。
2)從父 RDD 轉換得到新 RDD。
3)通過 parallelize 或 makeRDD 將單機數據創建為分布式 RDD。

RDD 的兩種操作算子(轉換(Transformation)與行動(Action))

1)轉換(Transformation):Transformation操作是延遲計算的,也就是說從一個RDD轉換生成另一個 RDD 的轉換操作不是馬上執行,需要等到有 Action 操作的時候才會真正觸發運算。

2)行動(Action):Action 算子會觸發 Spark 提交作業(Job),並將數據輸出 Spark 系統。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM