spark系列5 深入了解RDD

2021-10-22 07:08:04 字數 3661 閱讀 9505

目標

深入理解 rdd 的內在邏輯, 以及 rdd 的內部屬性(rdd 由什麼組成)

需求val sc = new sparkcontext(config)

val result = sc.textfile("dataset/access_log_sample.txt")

.map(item => (item.split(" ")(0), 1))

.filter(item => stringutils.isnotblank(item._1))

.reducebykey((curr, agg) => curr + agg)

.sortby(item => item._2, false)

.take(10)

result.foreach(item => println(item))

針對這個小案例, 我們問出互相關聯但是又方向不同的五個問題

假設要針對整個**的歷史資料進行處理, 量有 1t, 如何處理?

放在集群中, 利用集群多台計算機來並行處理

如何放在集群中執行?

簡單來講, 平行計算就是同時使用多個計算資源解決乙個問題, 有如下四個要點

如果放在集群中的話, 可能要對整個計算任務進行分解, 如何分解?

概述擴充套件

移動資料不如移動計算是乙個基礎的優化, 如何做到?

每乙個計算單元需要記錄其儲存單元的位置, 盡量排程過去

在集群中執行, 需要很多節點之間配合, 出錯的概率也更高, 出錯了怎麼辦?

rdd1 → rdd2 → rdd3 這個過程中, rdd2 出錯了, 有兩種辦法可以解決

快取 rdd2 的資料, 直接恢復 rdd2, 類似 hdfs 的備份機制

記錄 rdd2 的依賴關係, 通過其父級的 rdd 來恢復 rdd2, 這種方式會少很多資料的互動和儲存

如何通過父級 rdd 來恢復?

記錄 rdd2 的父親是 rdd1

記錄 rdd2 的計算函式, 例如記錄rdd2 = rdd1.map(…​),map(…​)就是計算函式

當 rdd2 計算出錯的時候, 可以通過父級 rdd 和計算函式來恢復 rdd2

假如任務特別複雜, 流程特別長, 有很多 rdd 之間有依賴關係, 如何優化?

上面提到了可以使用依賴關係來進行容錯, 但是如果依賴關係特別長的時候, 這種方式其實也比較低效, 這個時候就應該使用另外一種方式, 也就是記錄資料集的狀態

在 spark 中有兩個手段可以做到

快取checkpoint

目標理解 rdd 為什麼會出現

理解 rdd 的主要特點

理解 rdd 的五大屬性

1.2.1. rdd 為什麼會出現?

在 rdd 出現之前, 當時 mapreduce 是比較主流的, 而 mapreduce 如何執行迭代計算的任務呢?

多個 mapreduce 任務之間沒有基於記憶體的資料共享方式, 只能通過磁碟來進行共享

這種方式明顯比較低效

rdd 如何解決迭代計算非常低效的問題呢?

在 spark 中, 其實最終 job3 從邏輯上的計算過程是:job3 = (job1.map).filter, 整個過程是共享記憶體的, 而不需要將中間結果存放在可靠的分布式檔案系統中

這種方式可以在保證容錯的前提下, 提供更多的靈活, 更快的執行速度, rdd 在執行迭代型任務時候的表現可以通過下面**體現

// 線性回歸

val points = sc.textfile(...)

.map(...)

.persist(...)

val w = randomvalue

for (i

在這個例子中, 進行了大致 10000 次迭代, 如果在 mapreduce 中實現, 可能需要執行很多 job, 每個 job 之間都要通過 hdfs 共享結果, 熟快熟慢一窺便知

1.2.2. rdd 的特點

rdd 不僅是資料集, 也是程式設計模型

rdd 即是一種資料結構, 同時也提供了上層 api, 同時 rdd 的 api 和 scala 中對集合運算的 api 非常類似, 同樣也都是各種運算元

rdd 的運算元大致分為兩類:

執行 rdd 的時候, 在執行到轉換操作的時候, 並不會立刻執行, 直到遇見了 action 操作, 才會觸發真正的執行, 這個特點叫做惰性求值

rdd 可以分割槽

rdd 是乙個分布式計算框架, 所以, 一定是要能夠進行分割槽計算的, 只有分割槽了, 才能利用集群的平行計算能力

同時, rdd 不需要始終被具體化, 也就是說: rdd 中可以沒有資料, 只要有足夠的資訊知道自己是從誰計算得來的就可以, 這是一種非常高效的容錯方式

rdd 是唯讀的

rdd 是唯讀的, 不允許任何形式的修改. 雖說不能因為 rdd 和 hdfs 是唯讀的, 就認為分布式儲存系統必須設計為唯讀的. 但是設計為唯讀的, 會顯著降低問題的複雜度, 因為 rdd 需要可以容錯, 可以惰性求值, 可以移動計算, 所以很難支援修改.

rdd 是可以容錯的

rdd 的容錯有兩種方式

1.2.3. 什麼叫做彈性分布式資料集

分布式rdd 支援分割槽, 可以執行在集群中

彈性資料集

總結: rdd 的五大屬性

首先整理一下上面所提到的 rdd 所要實現的功能:

rdd 有分割槽

rdd 要可以通過依賴關係和計算函式進行容錯

rdd 要針對資料本地性進行優化

rdd 支援 mapreduce 形式的計算, 所以要能夠對資料進行 shuffled

對於 rdd 來說, 其中應該有什麼內容呢? 如果站在 rdd 設計者的角度上, 這個類中, 至少需要什麼屬性?

深入了解 HTML 5

comsharp cms 寫道 雖然 html 5 仍遙遙無期,然而最近有關 html 5 的文章和資料卻越來越多起來,這個 world wide web 核心語言的第5個版本包含了太多的期待。這是 cameronmoll.com 蒐集的12個非常有用的 html5 資源,這些資料的目的並不是簡單地...

深入了解 HTML 5

雖然 html 5 仍遙遙無期,然而最近有關 html 5 的文章和資料卻越來越多起來,這個 world wide web 核心語言的第5個版本包含了太多的期待。這是 cameronmoll.com 蒐集的12個非常有用的 html5 資源,這些資料的目的並不是簡單地介紹 html5,因為它還未完成...

深入了解 HTML 5

comsharp cms 寫道 雖然 html 5 仍遙遙無期,然而最近有關 html 5 的文章和資料卻越來越多起來,這個 world wide web 核心語言的第5個版本包含了太多的期待。這是 cameronmoll.com 蒐集的12個非常有用的 html5 資源,這些資料的目的並不是簡單地...