原文連接html
本系列是綜合了本身在學習spark過程當中的理解記錄 + 對參考文章中的一些理解 + 我的實踐spark過程當中的一些心得而來。寫這樣一個系列僅僅是爲了梳理我的學習spark的筆記記錄,因此一切以可以理解爲主,沒有必要的細節就不會記錄了,並且文中有時候會出現英文原版文檔,只要不影響理解,都不翻譯了。若想深刻了解,最好閱讀參考文章和官方文檔。python
其次,本系列是基於目前最新的 spark 1.6.0 系列開始的,spark 目前的更新速度很快,記錄一下版本好仍是必要的。
最後,若是各位以爲內容有誤,歡迎留言備註,全部留言 24 小時內一定回覆,很是感謝。
Tips: 若是插圖看起來不明顯,能夠:1. 放大網頁;2. 新標籤中打開圖片,查看原圖哦。git
先看下源碼裏是怎麼描述RDD的。github
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,這是可選擇的less
一個列表,存儲存取每一個partition的preferred位置。對於一個HDFS文件來講,存儲每一個partition所在的塊的位置。這也是可選擇的分佈式
把上面這5個主要的屬性總結一下,能夠得出RDD的大體概念:
首先,RDD 大概是這樣一種表示數據集的東西,它具備以上列出的一些屬性。是設計用來表示數據集的一種數據結構。爲了讓 RDD 能 handle 更多的問題,規定 RDD 應該是隻讀的,分區記錄的一種數據集合。能夠經過兩種方式來建立 RDD:一種是基於物理存儲中的數據,好比說磁盤上的文件;另外一種,也是大多數建立 RDD 的方式,即經過其餘 RDD 來建立【之後叫作轉換】而成。而正由於 RDD 知足了這麼多特性,因此 spark 把 RDD 叫作 Resilient Distributed Datasets
,中文叫作彈性分佈式數據集。不少文章都是先講 RDD 的定義,概念,再來講 RDD 的特性。我以爲其實也能夠倒過來,經過 RDD 的特性反過來理解 RDD 的定義和概念,經過這種由果溯因的方式來理解 RDD 也何嘗不可,至少對我我的而言這種方式是挺好的。
原本我是想參考 RDD 的論文和本身的理解來整理這篇文章的,但是後來想一想這樣是否是有點過於細緻了。我想,認識一個新事物,在時間、資源有限的狀況下,沒必要錙銖必較,能夠先 focus on 幾個關鍵點,到後期應用的時候再步步深刻。
因此,按照我我的的理解,我認爲想用好 spark,必需要理解 RDD ,而爲了理解 RDD ,我認爲只要瞭解下面幾個 RDD 的幾個關鍵點就能 handle 不少狀況下的問題了。因此,下面全部列到的點,都是在我我的看來很重要的,但也許有所欠缺,你們若是想繼續深刻,能夠看第三部分列出的參考資料,或者直接聯繫我,互相交流。
RDD 的設計是爲了充分利用分佈式系統中的內存資源,使得提高一些特定的應用的效率。這裏所謂的特定的應用沒有明肯定義,但能夠理解爲一類應用到迭代算法,圖算法等須要重複利用數據的應用類型;除此以外,RDD 還能夠應用在交互式大數據處理方面。因此,咱們這裏須要明確一下:RDD並非萬能的,也不是什麼帶着紗巾的少女那樣神奇。簡單的理解,就是一羣大牛爲了解決一個問題而設計的一個特定的數據結構,that's all
。
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 操做的時候,就會引起一個死循環了。不過,仔細想過的話,就會知道,「無環」這個問題其實已經在「有向」這個概念中提現了,上面說的「有向」,其實更詳細的說是一個時間上的先來後到,即祖先與子孫的關係,是不可逆的。
這個問題就不重複造輪子了,直接引用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來類比一下的,可總以爲仍是小題大作了。這個概念就懶得解釋了,主要是以爲太簡單了,沒有必要把事情搞得這麼複雜,哈哈。
首先,先從原文看看寬依賴和窄依賴各自的定義。
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的全部分區數據從新計算一次,計算量明顯比窄依賴狀況下大不少;
還有一些基本概念上面沒有提到,一些是由於本身還沒怎麼弄清楚,一些是以爲重要可是容易理解的,因此就先不記錄下來了。好比說:粗粒度、細粒度;序列化和反序列化等。
基礎的概念和理論都講得差很少了,該小試牛刀了,哈哈。
下幾篇的安排:
列一些學習 spark 比較好的資源
詳細從 job,stage,task 的定義來談談 spark 的運行原理
準備幾個稍稍複雜一點的例子
, 例子個數根據時間安排發佈
spark 在金融領域的應用之 指數類似度計算
spark 在搜索領域的應用之 pagerank
spark 在社交領域的應用之 評分計算
開始講 dataframe 和 datasets