摘要:原文基本概念解析寫在前面本系列是綜合了自己在學習過程中的理解記錄對參考文章中的一些理解個人實踐過程中的一些心得而來。是項目組設計用來表示數據集的一種數據結構。
原文:『 Spark 』2. spark 基本概念解析
寫在前面本系列是綜合了自己在學習spark過程中的理解記錄 + 對參考文章中的一些理解 + 個人實踐spark過程中的一些心得而來。寫這樣一個系列僅僅是為了梳理個人學習spark的筆記記錄,并非為了做什么教程,所以一切以個人理解梳理為主,沒有必要的細節就不會記錄了。若想深入了解,最好閱讀參考文章和官方文檔。
其次,本系列是基于目前最新的 spark 1.6.0 系列開始的,spark 目前的更新速度很快,記錄一下版本好還是必要的。
最后,如果各位覺得內容有誤,歡迎留言備注,所有留言 24 小時內必定回復,非常感謝。
Tips: 如果插圖看起來不明顯,可以:1. 放大網頁;2. 新標簽中打開圖片,查看原圖哦。
用戶在 spark 上構建的程序,包含了 driver 程序以及在集群上運行的程序代碼,物理機器上涉及了 driver,master,worker 三個節點.
2. Driver Program創建 sc ,定義 udf 函數,定義一個 spark 應用程序所需要的三大步驟的邏輯:加載數據集,處理數據,結果展示。
3. Cluster Manager集群的資源管理器,在集群上獲取資源的外部服務。
拿 Yarn 舉例,客戶端程序會向 Yarn 申請計算我這個任務需要多少的 memory,多少 CPU,etc。
然后 Cluster Manager 會通過調度告訴客戶端可以使用,然后客戶端就可以把程序送到每個 Worker Node 上面去執行了。
集群中任何一個可以運行spark應用代碼的節點。Worker Node就是物理節點,可以在上面啟動Executor進程。
5. Executor在每個 Worker Node 上為某應用啟動的一個進程,該進程負責運行任務,并且負責將數據存在內存或者磁盤上,每個任務都有各自獨立的 Executor。
Executor 是一個執行 Task 的容器。它的主要職責是:
初始化程序要執行的上下文 SparkEnv,解決應用程序需要運行時的 jar 包的依賴,加載類。
同時還有一個 ExecutorBackend 向 cluster manager 匯報當前的任務狀態,這一方面有點類似 hadoop的 tasktracker 和 task。
總結:Executor 是一個應用程序運行的監控和執行容器。
6. Jobs包含很多 task 的并行計算,可以認為是 Spark RDD 里面的 action,每個 action 的觸發會生成一個job。
用戶提交的 Job 會提交給 DAGScheduler,Job 會被分解成 Stage,Stage 會被細化成 Task,Task 簡單的說就是在一個數據 partition 上的單個數據處理流程。關于 job,stage,task,詳細可以參考這篇文章:『 Spark 』6. 深入研究 spark 運行原理之 job, stage, task
A job is triggered by an action, like count() or saveAsTextFile(), click on a job to see info about the stages of tasks inside it.
7. Stage一個 Job 會被拆分為多組 Task,每組任務被稱為一個 Stage 就像 Map Stage, Reduce Stage。
Stage 的劃分在 RDD 的論文中有詳細的介紹,簡單的說是以 shuffle 和 result 這兩種類型來劃分。
在 Spark 中有兩類 task:
shuffleMapTask
輸出是shuffle所需數據, stage的劃分也以此為依據,shuffle之前的所有變換是一個stage,shuffle之后的操作是另一個stage。
resultTask,
輸出是result,比如 rdd.parallize(1 to 10).foreach(println) 這個操作沒有shuffle,直接就輸出了,那么只有它的task是resultTask,stage也只有一個;如果是rdd.map(x => (x, 1)).reduceByKey(_ + _).foreach(println), 這個job因為有reduce,所以有一個shuffle過程,那么reduceByKey之前的是一個stage,執行shuffleMapTask,輸出shuffle所需的數據,reduceByKey到最后是一個stage,直接就輸出結果了。如果job中有多次shuffle,那么每個shuffle之前都是一個stage。8. Task
被送到 executor 上的工作單元。
9. PartitionPartition 類似 hadoop 的 Split,計算是以 partition 為單位進行的,當然 partition 的劃分依據有很多,這是可以自己定義的,像 HDFS 文件,劃分的方式就和 MapReduce 一樣,以文件的 block 來劃分不同的 partition。總而言之,Spark 的 partition 在概念上與 hadoop 中的 split 是相似的,提供了一種劃分數據的方式。
10. RDD先看看原文 [Resilient Distributed Datasets: A Fault-Tolerant Abstraction for
In-Memory Cluster Computing](http://litaotao.github.io/files/spark-rd... 是怎么介紹 RDD 的。
a distributed memory abstraction that lets programmers perform in-memory computations on large clusters in a fault-tolerant manner.
RDDs are motivated by two types of applications that current computing frameworks handle inefficiently:
iterative algorithms;
interactive data mining tools;
In both cases, keeping data in memory can improve performance by an order of magnitude.
To achieve fault tolerance efficiently, RDDs provide a restricted form of shared memory, based on coarsegrained transformations rather than fine-grained updates to shared state. However, we show that RDDs are expressive enough to capture a wide class of computations, including recent specialized programming models for iterative jobs, such as Pregel, and new applications that these models do not capture. We have implemented RDDs in a system called Spark, which we evaluate through a variety of user applications and benchmarks.
每個RDD有5個主要的屬性:
一組分片(partition),即數據集的基本組成單位
一個計算每個分片的函數
對parent RDD的依賴,這個依賴描述了RDD之間的lineage
對于key-value的RDD,一個Partitioner,這是可選擇的
一個列表,存儲存取每個partition的preferred位置。對于一個HDFS文件來說,存儲每個partition所在的塊的位置。這也是可選擇的
把上面這5個主要的屬性總結一下,可以得出RDD的大致概念。首先要知道,RDD大概是這樣一種表示數據集的東西,它具有以上列出的一些屬性。是spark項目組設計用來表示數據集的一種數據結構。而spark項目組為了讓RDD能handle更多的問題,又規定RDD應該是只讀的,分區記錄的一種數據集合中。可以通過兩種方式來創建RDD:一種是基于物理存儲中的數據,比如說磁盤上的文件;另一種,也是大多數創建RDD的方式,即通過其他RDD來創建【以后叫做轉換】而成。而正因為RDD滿足了這么多特性,所以spark把RDD叫做Resilient Distributed Datasets,中文叫做彈性分布式數據集。很多文章都是先講RDD的定義,概念,再來說RDD的特性。我覺得其實也可以倒過來,通過RDD的特性反過來理解RDD的定義和概念,通過這種由果溯因的方式來理解RDD也未嘗不可。反正對我個人而言這種方式是挺好的。
RDD是Spark的核心,也是整個Spark的架構基礎,可以總下出幾個它的特性來:
它是不變的數據結構存儲
它是支持跨集群的分布式數據結構
可以根據數據記錄的key對結構進行分區
提供了粗粒度的操作,且這些操作都支持分區
它將數據存儲在內存中,從而提供了低延遲性
關于 rdd 的更多詳情,可以參考這篇文章:『 Spark 』4. spark 之 RDD
11. sc.parallelize先看看 api 文檔里是怎么說的:parallelize
parallelize(c, numSlices=None)
Distribute a local Python collection to form an RDD. Using xrange is recommended if the input represents a range for performance.
簡單的說,parallelize 就是把 driver 端定義的一個數據集,或者一個獲取數據集的生成器,分發到 worker 上的 executor 中,以供后續分析。這種方式在測試代碼邏輯時經常用到,但在構建真正的 spark 應用程序時很少會用到,一般都是從 hdfs 或者數據庫去讀取數據。
12. code distribute提交 spark 應用時,spark 會把應用代碼分發到所有的 worker 上面,應用依賴的包需要在所有的worker上都存在,有兩種解決 worker 上相關包依賴的問題:
選用一些工具統一部署 spark cluster;
在提交 spark 應用的時候,指定應用依賴的相關包,把 應用代碼,應用依賴包 一起分發到 worker;
13. cache prioritycache 是否支持 priority,目前不支持,而且 spark 里面對 rdd 的 cache 和我們常見的緩存系統是不一樣的。細節可以找我討論。
14. coresThe number of cores to use on each executor. For YARN and standalone mode only. In standalone mode, setting this parameter allows an application to run multiple executors on the same worker, provided that there are enough cores on that worker. Otherwise, only one executor per application will run on each worker.
每一個 core,相當于一個 worker 上的進程,這些進程會同時執行分配到這個 worker 上的任務。簡單的說,就是 spark manager 把一個 job 切分幾個 task 分發到 worker 上同步執行,而每個 worker 把分配給自己的 task 再切分成幾個 subtask,分配給當前 worker 上的不同進程。
15. Memory分配給 spark 應用的內存是僅僅給 cache 數據用嗎?
不是,分配給 spark 應用的內存有三個方面的應用:
spark 本身
spark 應用
spark 應用過程中 runtime 使用,比如 UDF 函數
spark 應用中的 cache
16. RDD narrow/wide dependencesRDD 之間的依賴類別[ 或者,創建一個 RDD 的不同方法 ]
17. 本地內存與集群內存所謂本地內存,是指在 driver 端的程序所需要的內存,由 driver 機器提供,一般用來生成測試數據,接受運算結果等;
所謂集群內存,是指提交到集群的作業能夠向集群申請的最多內存使用量,一般用來存儲關鍵數據;
可以在啟動 spark 應用的時候申請;完全可控。
19. 當用戶申請總資源超過當前集群總資源FIFO 資源分配方式。
20. SparkContext [經常簡稱為 sc]spark app 的起點和入口,一般用來加載數據集,生成第一個 rdd。
21. 對一個 rdd 多次 cache 會有什么影響嗎?不會,只會cache一次。stackoverflow
4. Next下一篇,通過幾個簡單的例子來介紹 spark 的基本編程模式。
5. 打開微信,掃一掃,點一點,棒棒的 參考文章spark-rdd-paper : Resilient Distributed Datasets: A Fault-Tolerant Abstraction for In-Memory Cluster Computing
spark python API
本系列文章鏈接『 Spark 』1. spark 簡介
『 Spark 』2. spark 基本概念解析
『 Spark 』3. spark 編程模式
『 Spark 』4. spark 之 RDD
『 Spark 』5. 這些年,你不能錯過的 spark 學習資源
『 Spark 』6. 深入研究 spark 運行原理之 job, stage, task
『 Spark 』7. 使用 Spark DataFrame 進行大數據分析
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/37870.html
摘要:原文地址深入研究運行原理之寫在前面本系列是綜合了自己在學習過程中的理解記錄對參考文章中的一些理解個人實踐過程中的一些心得而來。值得深究的是,這個由兩個完成,這兩個一共有個。 原文地址:『 Spark 』6. 深入研究 spark 運行原理之 job, stage, task 寫在前面 本系列是綜合了自己在學習spark過程中的理解記錄 + 對參考文章中的一些理解 + 個人實踐spark...
摘要:基本編程模式里有兩個很重要的概念一般簡稱為和,在上一篇文章中基本概念解析有講到。可以說,和貫穿了的大部分生命周期,從的初始化,到數據的清洗,計算,到最后獲取,展示結果。 寫在前面 本系列是綜合了自己在學習spark過程中的理解記錄 + 對參考文章中的一些理解 + 個人實踐spark過程中的一些心得而來。寫這樣一個系列僅僅是為了梳理個人學習spark的筆記記錄,所以一切以能夠理解為主,沒...
閱讀 2878·2021-08-20 09:37
閱讀 1615·2019-08-30 12:47
閱讀 1097·2019-08-29 13:27
閱讀 1691·2019-08-28 18:02
閱讀 756·2019-08-23 18:15
閱讀 3091·2019-08-23 16:51
閱讀 937·2019-08-23 14:13
閱讀 2149·2019-08-23 13:05