rdd, 全稱為resilient distributed datasets
, 是乙個容錯的, 並行的資料結構, 可以讓使用者顯式地將資料儲存到磁碟和記憶體中, 並能控制資料的分割槽。同時, rdd 還提供了一組豐富的操作來操作這些資料。 在這些操作中, 諸如map
,flatmap
,filter
等轉換操作實現了monad
模式, 很好地契合了 scala 的集合操作. 除此之外, rdd 還提供了諸如join
,groupby
,reducebykey
等更為方便的操作, 以支援常見的資料運算。
通常來講, 針對資料處理有幾種常見模型, 包括:iterative algorithms
,relational queries
,mapreduce
,stream processing
。例如 hadoop mapreduce 採用了mapreduce
模型, storm 則採用了stream processing
模型. rdd 混合了這四種模型, 使得 spark 可以應用於各種大資料處理場景。
在 rdd 出現之前, 當時 mapreduce 是比較主流的, 而 mapreduce 如何執行迭代計算的任務呢?
多個 mapreduce 任務之間沒有基於記憶體的資料共享方式, 只能通過磁碟來進行共享,這種方式明顯比較低效。rdd 如何解決迭代計算非常低效的問題呢?
在 spark 中, 其實最終 job3 從邏輯上的計算過程是:job3 = (job1.map).filter
, 整個過程是共享記憶體的, 而不需要將中間結果存放在可靠的分布式檔案系統中
// 線性回歸
val points = sc.
textfile(.
..).
map(..
.).persist(.
..)val w = randomvalue
for(i <
-1 to 10000
)
在這個例子中, 進行了大致 10000 次迭代, 如果在 mapreduce 中實現, 可能需要執行很多 job, 每個 job 之間都要通過 hdfs 共享結果, 熟快熟慢一窺便知
rdd 允許使用者顯式的指定資料存放在記憶體或者磁碟
rdd 是分布式的, 使用者可以控制 rdd 的分割槽
rdd 提供了豐富的操作
rdd 提供了 map, flatmap, filter 等操作符, 用以實現 monad 模式
rdd 提供了 reducebykey, groupbykey 等操作符, 用以操作 key-value 型資料
rdd 提供了 max, min, mean 等操作符, 用以運算元字型的資料
rdd 是乙個分布式計算框架, 所以, 一定是要能夠進行分割槽計算的, 只有分割槽了, 才能利用集群的平行計算能力
同時, rdd 不需要始終被具體化, 也就是說: rdd 中可以沒有資料, 只要有足夠的資訊知道自己是從誰計算得來的就可以, 這是一種非常高效的容錯方式
rdd 是唯讀的, 不允許任何形式的修改. 雖說不能因為 rdd 和 hdfs 是唯讀的, 就認為分布式儲存系統必須設計為唯讀的. 但是設計為唯讀的, 會顯著降低問題的複雜度, 因為 rdd 需要可以容錯, 可以惰性求值, 可以移動計算, 所以很難支援修改。
簡略的說, rdd 有三種建立方式
spark RDD程式設計
rdd就是乙個不可變的分布式物件集合。建立rdd 1 讀取乙個外部資料集 sparkcontext.textfile 2 在驅動器程式中對乙個集合進行並行化。rdd 操 作 1 轉 化 操 作 transformation 會由乙個 rdd 生成乙個新的 rdd。2 行 動 操 作 action 會...
Const 深度解析
物件導向是c 的重要特性.但是c 在c的基礎上新增加的幾點優化也是很耀眼的 就const直接可以取代c中的 define 以下幾點很重要,學不好後果也也很嚴重 1.const常量,如const int max 100 優點 const常量有資料型別,而巨集常量沒有資料型別。編譯器可以對前者進行型別安...
extern深度解析
c語言中extern用法 對於全域性變數來說,extern關鍵字可以在乙個模組中使用在另乙個模組中定義的全域性變數.只要extern宣告一下就好,但是變數只能定義一次,不然鏈結的時候會報錯.現代 編譯器一般採用按檔案編譯的方式,因此在編譯時,各個檔案中定義的 全域性變數 是互相不透明的。也就是說,在...