摘要:是設計用來表示數據集的一種數據結構。而正因為滿足了這么多特性,所以把叫做,中文叫做彈性分布式數據集。按照這篇論文中文譯文的解釋,窄依賴是指子的每個分區依賴于常數個父分區即與數據規模無關寬依賴指子的每個分區依賴于所有父分區。
原文鏈接
寫在前面本系列是綜合了自己在學習spark過程中的理解記錄 + 對參考文章中的一些理解 + 個人實踐spark過程中的一些心得而來。寫這樣一個系列僅僅是為了梳理個人學習spark的筆記記錄,所以一切以能夠理解為主,沒有必要的細節就不會記錄了,而且文中有時候會出現英文原版文檔,只要不影響理解,都不翻譯了。若想深入了解,最好閱讀參考文章和官方文檔。
其次,本系列是基于目前最新的 spark 1.6.0 系列開始的,spark 目前的更新速度很快,記錄一下版本好還是必要的。
最后,如果各位覺得內容有誤,歡迎留言備注,所有留言 24 小時內必定回復,非常感謝。
Tips: 如果插圖看起來不明顯,可以:1. 放大網頁;2. 新標簽中打開圖片,查看原圖哦。
先看下源碼里是怎么描述RDD的。
Internally, each RDD is characterized by five main properties: A list of partitions A function for computing each split A list of dependencies on other RDDs Optionally, a Partitioner for key-value RDDs (e.g. to say that the RDD is hash-partitioned) Optionally, a list of preferred locations to compute each split on (e.g. block locations for an HDFS file)
可以知道,每個 RDD 有以下5個主要的屬性:
一組分片(partition),即數據集的基本組成單位
一個計算每個分片的函數
對parent RDD的依賴,這個依賴描述了RDD之間的 lineage
對于key-value的RDD,一個Partitioner,這是可選擇的
一個列表,存儲存取每個partition的preferred位置。對于一個HDFS文件來說,存儲每個partition所在的塊的位置。這也是可選擇的
把上面這5個主要的屬性總結一下,可以得出RDD的大致概念:
首先,RDD 大概是這樣一種表示數據集的東西,它具有以上列出的一些屬性。是設計用來表示數據集的一種數據結構。為了讓 RDD 能 handle 更多的問題,規定 RDD 應該是只讀的,分區記錄的一種數據集合。可以通過兩種方式來創建 RDD:一種是基于物理存儲中的數據,比如說磁盤上的文件;另一種,也是大多數創建 RDD 的方式,即通過其他 RDD 來創建【以后叫做轉換】而成。而正因為 RDD 滿足了這么多特性,所以 spark 把 RDD 叫做 Resilient Distributed Datasets,中文叫做彈性分布式數據集。很多文章都是先講 RDD 的定義,概念,再來說 RDD 的特性。我覺得其實也可以倒過來,通過 RDD 的特性反過來理解 RDD 的定義和概念,通過這種由果溯因的方式來理解 RDD 也未嘗不可,至少對我個人而言這種方式是挺好的。
2. 理解RDD的幾個關鍵概念本來我是想參考 RDD 的論文和自己的理解來整理這篇文章的,可是后來想想這樣是不是有點過于細致了。我想,認識一個新事物,在時間、資源有限的情況下,不必錙銖必較,可以先 focus on 幾個關鍵點,到后期應用的時候再步步深入。
所以,按照我個人的理解,我認為想用好 spark,必須要理解 RDD ,而為了理解 RDD ,我認為只要了解下面幾個 RDD 的幾個關鍵點就能 handle 很多情況下的問題了。所以,下面所有列到的點,都是在我個人看來很重要的,但也許有所欠缺,大家如果想繼續深入,可以看第三部分列出的參考資料,或者直接聯系我,互相交流。
2.1 RDD的背景及解決的痛點問題RDD 的設計是為了充分利用分布式系統中的內存資源,使得提升一些特定的應用的效率。這里所謂的特定的應用沒有明確定義,但可以理解為一類應用到迭代算法,圖算法等需要重復利用數據的應用類型;除此之外,RDD 還可以應用在交互式大數據處理方面。所以,我們這里需要明確一下:RDD并不是萬能的,也不是什么帶著紗巾的少女那樣神奇。簡單的理解,就是一群大牛為了解決一個問題而設計的一個特定的數據結構,that"s all。
2.2 What is DAG - 趣說有向無環圖DAG - Direct Acyclic Graph,有向無環圖,好久沒看圖片了,先發個圖片來理解理解吧。
要理解DAG,只需弄明白三個概念就可以畢業了,首先,我們假設上圖圖二中的A,B,C,D,E都代表spark里不同的RDD:
圖:圖是表達RDD Lineage信息的一個結構,在 spark 中,大部分 RDD 都是通過其他 RDD 進行轉換而來的,比如說上圖圖二中,B和D都是通過A轉換而來的,而C是通過B轉換而來,E的話是通過B和D一起轉換來的。
有向:有向就更容易理解了,簡單來說就是 linage 是一個 top-down 的結構,而且是時間序列上的 top-down 結構,這里如果沒有理解的話,我們在下面講“無環”這個概念時一起說明。
無環:這里就是重點要理解的地方了,spark 的優化器在這里也發揮了很大的作用。首先,我們先理解一下無環的概念,假設有圖三中左下 B,D,E 這樣一個 RDD 轉換圖,那當我們的需要執行 D.collect 操作的時候,就會引發一個死循環了。不過,仔細想過的話,就會知道,“無環”這個問題其實已經在“有向”這個概念中提現了,上面說的“有向”,其實更詳細的說是一個時間上的先來后到,即祖先與子孫的關系,是不可逆的。
2.3 What is Data Locality - RDD的位置可見性這個問題就不重復造輪子了,直接引用Quora上的一個問答了:
RDD is a dataset which is distributed, that is, it is divided into "partitions". Each of these partitions can be present in the memory or disk of different machines. If you want Spark to process the RDD, then Spark needs to launch one task per partition of the RDD. It"s best that each task be sent to the machine have the partition that task is supposed to process. In that case, the task will be able to read the data of the partition from the local machine. Otherwise, the task would have to pull the partition data over the network from a different machine, which is less efficient. This scheduling of tasks (that is, allocation of tasks to machines) such that the tasks can read data "locally" is known as "locality aware scheduling".
本來不想叫“惰性求值”的,看到“惰”這個字實在是各種不爽,實際上,我覺得應該叫"后續求值","按需計算","晚點搞"這類似的,哈哈。這幾天一直在想應該怎么簡單易懂地來表達Lazy Evaluation這個概念,本來打算引用MongoDB的Cursor來類比一下的,可總覺得還是小題大做了。這個概念就懶得解釋了,主要是覺得太簡單了,沒有必要把事情搞得這么復雜,哈哈。
2.5 What is Narrow/Wide Dependency - RDD的寬依賴和窄依賴首先,先從原文看看寬依賴和窄依賴各自的定義。
narrow dependencies: where each partition of the parent RDD is used by at most one partition of the child RDD, wide dependencis, where multiple child partitions may depend on it.
按照這篇RDD論文中文譯文的解釋,窄依賴是指子RDD的每個分區依賴于常數個父分區(即與數據規模無關);寬依賴指子RDD的每個分區依賴于所有父RDD分區。暫且不說這樣理解是否有偏差,我們先來從兩個方面了解下計算一個窄依賴的子RDD和一個寬依賴的RDD時具體都有什么區別,然后再回顧這個定義。
計算方面:
計算窄依賴的子RDD:可以在某一個計算節點上直接通過父RDD的某幾塊數據(通常是一塊)計算得到子RDD某一塊的數據;
計算寬依賴的子RDD:子RDD某一塊數據的計算必須等到它的父RDD所有數據都計算完成之后才可以進行,而且需要對父RDD的計算結果進行hash并傳遞到對應的節點之上;
容錯恢復方面:
窄依賴:當父RDD的某分片丟失時,只有丟失的那一塊數據需要被重新計算;
寬依賴:當父RDD的某分片丟失時,需要把父RDD的所有分區數據重新計算一次,計算量明顯比窄依賴情況下大很多;
3. 尚未提到的一些重要概念還有一些基本概念上面沒有提到,一些是因為自己還沒怎么弄清楚,一些是覺得重要但是容易理解的,所以就先不記錄下來了。比如說:粗粒度、細粒度;序列化和反序列化等。
4. Next基礎的概念和理論都講得差不多了,該小試牛刀了,哈哈。
下幾篇的安排:
列一些學習 spark 比較好的資源
詳細從 job,stage,task 的定義來談談 spark 的運行原理
準備幾個稍稍復雜一點的例子, 例子個數根據時間安排發布
spark 在金融領域的應用之 指數相似度計算
spark 在搜索領域的應用之 pagerank
spark 在社交領域的應用之 評分計算
開始講 dataframe 和 datasets
5. 打開微信,掃一掃,點一點,棒棒的,^_^ 參考文章Spark技術內幕:究竟什么是RDD
Resilient Distributed Datasets: A Fault-Tolerant Abstraction for In-Memory Cluster Computing
RDD 論文中文版
本系列文章鏈接『 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 進行大數據分析
『 Spark 』8. 實戰案例 | Spark 在金融領域的應用 | 日內走勢預測
『 Spark 』9. 搭建 IPython + Notebook + Spark 開發環境
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/37889.html
摘要:原文基本概念解析寫在前面本系列是綜合了自己在學習過程中的理解記錄對參考文章中的一些理解個人實踐過程中的一些心得而來。是項目組設計用來表示數據集的一種數據結構。 原文:『 Spark 』2. spark 基本概念解析 寫在前面 本系列是綜合了自己在學習spark過程中的理解記錄 + 對參考文章中的一些理解 + 個人實踐spark過程中的一些心得而來。寫這樣一個系列僅僅是為了梳理個人學習...
摘要:基本編程模式里有兩個很重要的概念一般簡稱為和,在上一篇文章中基本概念解析有講到。可以說,和貫穿了的大部分生命周期,從的初始化,到數據的清洗,計算,到最后獲取,展示結果。 寫在前面 本系列是綜合了自己在學習spark過程中的理解記錄 + 對參考文章中的一些理解 + 個人實踐spark過程中的一些心得而來。寫這樣一個系列僅僅是為了梳理個人學習spark的筆記記錄,所以一切以能夠理解為主,沒...
閱讀 2113·2021-11-16 11:45
閱讀 1184·2021-10-22 09:53
閱讀 4002·2021-09-07 10:26
閱讀 1209·2021-09-06 15:00
閱讀 2073·2019-08-28 18:09
閱讀 2795·2019-08-26 14:06
閱讀 3934·2019-08-26 13:48
閱讀 1295·2019-08-26 12:11