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
, 整個過程是共享記憶體的, 而不需要將中間結果存放在可靠的分布式檔案系統中
在這個例子中, 進行了大致 10000 次迭代, 如果在 mapreduce 中實現, 可能需要執行很多 job, 每個 job 之間都要通過 hdfs 共享結果, 熟快熟慢一窺便知// 線性回歸
val points = sc.
textfile(.
..).
map(..
.).persist(.
..)val w = randomvalue
for(i <
-1 to 10000
)
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宣告一下就好,但是變數只能定義一次,不然鏈結的時候會報錯.現代 編譯器一般採用按檔案編譯的方式,因此在編譯時,各個檔案中定義的 全域性變數 是互相不透明的。也就是說,在...