這篇文章的目的是 讓想理解Spark 這高速運算核心概念的人看得
我會試著用自己的話讓大家理解
讓大家可以淺顯易懂的理解核心技術 RDD(Resilient Distributed Datasets)
---------------------------------------前言-----------------------------------------------------------------
首先先來看MapReduce 為我們做了什麼
MapReduce 成功的在大資料(Big Data)的分散式環境下分析運算資料
然而在某些運算或演算法執行下 MapReduce 就顯得不夠力
舉凡最著名的兩個場景
1.迭代式運算(Iterative Jobs) : 如:機器學習演算法, 分類演算法 (這類演算法要不斷執行同個步驟 且每個步驟以上個結果為輸入)
2.交互式分析(Iterative Analyst) : 如:馬克霍夫矩陣 (求長遠時間之後的平衡狀態為何)
為什麼MapReduce不適合執行上述之場景呢?由下圖解釋
上圖敘述一般預設的狀態下 MapReduce 執行過程中 必須將工作的結果存回HDFS中
但是在需要不斷運算的場景下 (像是要重複算上萬次得到結果) 這一來一往的I/O將十分龐大
原因其實是 MapReduce一開始就不是為了這些場景而去設計的 自然會有這些問題
其實是我們的需求增加而產生這樣的問題
上述問題讓我發現MapReduce缺少一個重要的要素
有效的資料共享(efficient data sharing)
而Spark即提出一個能解決的問題的效果
In-Memory Data Processing and Sharing
若是能將中間運算結果直間存於Memory 中 那自然就會快速許多
而要如何設計一個 高容錯(tolerant) 高效能(efficient)的結構?
這是RDD的設計概念由來Resilient Distribute Datasets
---------------------------------------RDD介紹----------------------------------------------------
首先先看一下RDD長什麼樣子
Partition是資料分片 可能會在不同的機器上
而RDD則是指一個資料分片的集合 大多數情況都存於Memory中 (即一個RDD裡會有多個在不同機器上的partition)
照官方文件說法 實際上一個RDD會有以上五樣東西
1.每個partition位置
2.與父RDD的依賴關西
3.父RDD經過何種運算得到此RDD的 (function)
以上三樣在RDD概念裡主要是為了實現 血統關係(lineage) 主要是為了容錯而設計的 在稍後的RDD容錯機制會詳細敘述
先來看看RDD是如何被使用來運算的
RDD有兩種運算方式
1.Transformations: 懶惰(lazy)運算 會製造出新的RDD
2.Action: 執行一個運算並return結果或是存到Storage裡
以上列了相關運算是怎麼分的
以上是一個詳細的圖解運算過程中 其實會不斷的產生新的RDD 最後在生成結果
所以整個RDD執行不外乎此圖
-----------------------------RDD容錯機制---------------------------------------------
清楚了RDD運算過程後
必須提到他是如何容錯的
場景如下
當有RDD遺失時
會根據前面提到的血統關係(lineage)來重新計算所需RDD
所以實際上Spark是沒有replication機制
但明顯的要是 失去的RDD剛好是要計算出結果的1萬次運算的9999次怎麼辦?
那不是等於要重算嗎?
所以Spark還提供一個客製化的機制CheckPoint
由使用者自己設計儲存點 在這點的RDD會存於Storage 以免遺失
所以實際上Spark經由lineage 與 CheckPoint來執行容錯
-------------------------------------------結論-------------------------------------------
Spark的核心技術是RDD
所以要了解Spark 要先理解RDD是如何設計的 跟 優勢為何
整個Spark的工作流程如下
如果以上有錯誤的理解或謬誤 請指證 感激不盡
留言列表