數分-理論-大資料7-Spark(大資料框架)
(資料分析系列)
文章目錄
- 數分-理論-大資料7-Spark(大資料框架)
- 1知識點
- 2具體內容
- 2.1概述
- 2.1.1起源
- 2.1.2誕生
- 2.1.3Spark與Hadoop、MapReduce、HDFS的關系
- 2.1.4生態體系
- 2.2編程模型-核心
- 2.2.1RDD概述
- 2.2.2RDD定義
- 2.2.3RDD五大特性
- 2.2.4RDD操作函式
- 2.3架構原理
- 2.3.1計算階段
- 2.3.2劃分計算階段
- 2.3.3作業管理
- 2.3.4執行程序
- 2.4實戰應用
- 3參考
1知識點
- 概述
- 編程模型
- 架構原理
- 實戰應用
2具體內容
2.1概述
2.1.1起源
-
記憶體(進出倉庫的通道):存盤正在使用的資源
-
磁盤(倉庫):存盤暫時用不到的資源
-
MapReduce:每一步在記憶體中,但產生的中間值(溢寫檔案)寫入磁盤,下一步將中間值merge到記憶體,回圈到最終完成計算

-
spark:每一步在記憶體中,產生的中間值直接寫入下一個步驟,至所有步驟完成后將最終結果保存進磁盤(適合計算步驟多)

2.1.2誕生

2.1.3Spark與Hadoop、MapReduce、HDFS的關系
1.hadoop:
- HDFS讀取輸入data
- Map使用用戶定義的mapper func,結果寫入磁盤
- Reduce從各Maping機器讀取Map計算的中間結果,使用reduce func,結果寫會HDFS
- 三次讀寫,高度依賴磁盤讀寫
2.Spark
- 基于性能更高的記憶體存盤來進行資料存盤和讀寫
- 缺乏對資料存盤的支持,沒有分布式檔案系統(HDFS),只能依賴外部資料源
3.異同
- 都是大資料框架
- hadoop
- 分布式資料基礎措施,將巨大的資料集分派到一個集群中的多個節點進行存盤
- 計算處理的功能
- spark
- 對分布式存盤的大資料進行處理的工具
- SparkCore看做是MapReduce的競品
- 不會分布式存盤

2.1.4生態體系
Spark是一個用來實作快速且通用的集群計算平臺
- 速度:在記憶體中進行計算,可以面向海量資料進行分析處理;
- 通用:針對任何業務型別分析進行處理
- SparkCore離線批處理
- SparkSQL互動式分析,支持SQL陳述句
- SparkStreaming,實時流資料處理
- MLlib,支持機器學習
- GraphX,支持圖計算
- StructuredStreamig流式處理

2.2編程模型-核心
2.2.1RDD概述
彈性資料集(Resilient Distributed Datasets)的縮寫
- mr,面向程序的大資料計算,如何將計算邏輯用Map和Reduce實作,輸入輸出是什么
- spark,面向物件(大資料抽象為一個RDD物件)編程,在RDD上計算至最后的結果
2.2.2RDD定義
- 分布式記憶體
- 只讀的記錄磁區集合
- 橫跨集群所有節點進行并行計算
- spark建立在抽象RDD上,統一算子進行運算
2.2.3RDD五大特性
1.磁區
- 計算以磁區為單位,分配到多個機器并行計算
- 從HDFS取數,spark使用位置資訊,將計算作業就近發機器減少跨網路傳輸資料量
2.可并行計算
- 一個磁區一個計算任務Task
- 每個磁區有計算函式(計算算子)
- 以分片為基本單位并行計算
- RDD的磁區數決定著并行計算的數量
3.依賴關系
- 依賴關系串列構建RDD
- 容錯機制,出錯可重建RDD
4.k-v資料的RDD磁區器
- Partitioner磁區器決定磁區策略
- Hash磁區
- Range磁區
- 自定義磁區
- 針對k-v形式,從0到 numPartitions-1區間內映射每一個key到partition ID上
5.每個磁區有一個優先位置串列
- 磁區位置串列會存盤每個Partition的優先位置,如果讀取的是HDFS檔案,這個串列保存的就是每個磁區所在的block塊的位置
- 盡可能將任務分配到處理資料的資料塊位置
2.2.4RDD操作函式
-
轉換transformation,回傳值是RDD
- map(func)計算
- filter(func)過濾
- union(otherDataset)合并
- reduceByKey(func, [numPartitions])根據key聚合
- join(otherDataset, [numPartitions])連接資料集
- groupByKey([numPartitions])分組
-
執行action,不回傳RDD
-
spark以RDD為單位,對大資料分片計算,每個RDD分片分到一個執行行程處理
-
轉換操作
- 轉換操作產生的RDD不會出現新的分片情況:
- RDD資料分片,經過map或者filter轉換操作后,其結果還在當前的分片中
- 物理上,Spark只有在產生新的RDD分片時候,才會真的生成一個RDD,Spark的這種特性也被稱作惰性計算;
- 轉換操作產生的RDD會產生新的分片情況:
- reduceByKey,來自不同分片的相同key 必須聚合在一起進行操作,這樣就會產生新的RDD分片
- 是否會產生新的RDD分片,并不是根據轉換函式名就能判斷出來的
- 轉換操作產生的RDD不會出現新的分片情況:
2.3架構原理
- 移動計算而非移動資料
- 通過DAG來實作計算
2.3.1計算階段
-
根據應用的復雜程度,將程序分割成更多的計算階段(stage),這些計算階段組成一個有向無環圖(DAG),Spark任務調度器根據DAG的依賴關系執行計算階段(stage)
-
Spark快:大量的迭代計算,產生數萬個計算階段,這些計算階段在一個應用中處理完成
-
有向無環圖,即是說不同階段的依賴關系是有向的
- 計算程序沿著依賴關系方向
- 依賴關系不是環形依賴,否則死回圈
- 執行階段1和階段2后,再執行階段3
-
Spark大資料應用的計算程序:
- 根據程式初始化DAG
- 由DAG再建立依賴關系
- 根據依賴關系順序執行各個計算階段
-
Spark 作業調度執行核心是DAG
- DAG可以得出 整個應用就被切分成哪些階段以及每個階段的依賴關系
- 每個階段要處理的資料量生成相應的任務集合(TaskSet)
- 每個任務都分配一個任務行程去處理
-
DAGScheduler組件負責應用DAG的生成和管理
- 根據程式代碼生成DAG
- 將程式分發到分布式計算集群
- 按計算階段的先后關系調度執行
2.3.2劃分計算階段
#上圖DAG
rddB = rddA.groupBy(key)
rddD = rddC.map(func)
rddF = rddD.union(rddE)
rddG = rddB.join(rddF)
#4個函式,三個階段
- RDD之間的轉換連接線呈現多對多交叉連接的時候,就會產生新的階段
- 一個RDD表示一個資料集,一個資料集中的多個資料分片需要進行磁區傳輸,寫入到另一個資料集的不同分片中
- Spark中計算階段劃分的依據是Shuffle
- 從資料集跨越,由多個磁區傳輸的程序,叫做Shuffle
- Shuffle將資料進行重新組合,把相同key的資料放一起,因為新的聚合、關聯,產生新的計算階段
- 不需要Shuffle的依賴,稱為窄依賴,需要Shuffle的依賴,稱為寬依賴,
MR與Spark效率比較:
- 本質:
- MapReduce根據Shuffle將大資料計算分為Map和Reduce兩個階段
- Spark將前一個的Reduce和后一個的Map進行連接,當作一個階段進行計算,從而形成了一個更高效流暢的計算模型
- 本質是Map和Reduce,但多個計算階段依賴執行的方案可以有效減少對HDFS的訪問(落盤),減少作業的調度執行次數
- 存盤方式:
- 使用磁盤存盤Shuffle程序的資料
- Spark優先使用記憶體進行資料存盤(RDD也優先存于記憶體)
2.3.3作業管理
- DAGScheduler遇到Shuffle時,會生成一個計算階段
- 遇到action函式時,會生成一個作業(Job)
- RDD里的每個資料分片,Spark都會創建一個計算任務進行處理,一個計算階段會包含多個計算任務(Task)
- 一個作業至少包含一個計算階段
- 每個計算階段由多個任務組成
- 這些任務(Task)組成一個任務集合
- DAGScheduler根據代碼生成DAG圖,Spark的任務調度以任務為單位進行分配,將任務分配到分布式集群的不同機器上執行,
2.3.4執行程序
- spark支持多種部署方案(Standalone、Yarn、Mesos等)
- 不同的部署方案核心功能和運行流程基本一樣,只是不同組件角色命名不同,

-
JVM啟動應用程式(Driver行程)
- Driver呼叫SparkContext初始化執行配置和輸入資料
- SparkContext啟動DAGScheduler構造執行的DAG圖,切分成計算任務這樣的最小執行單位
-
Driver向Cluster Manager請求計算資源,用于DAG的分布式計算
- ClusterManager收到請求以后,將Driver的主機地址等資訊通知給集群的所有計算節點Worker Node
-
Worker收到資訊
- 根據Driver的主機地址,向Driver通信并注冊,然后根據自己的空閑資源向Driver通報可以領用的任務數
- Driver根據DAG圖向注冊的Worker分配任務
2.4實戰應用
- spark local模式安裝
- WordCount為例,查看SparkRDD執行流程
3參考
- https://github.com/shenhao-stu/Big-Data/
- Spark SQL的基本使用
- Spark的Scala API介紹
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/421700.html
標籤:其他
