Spark – RDD



彈性分散式資料集

彈性分散式資料集 (RDD) 是 Spark 的基本資料結構。它是一個不可變的分散式物件集合。RDD 中的每個資料集都分成邏輯分割槽,這些分割槽可以在叢集的不同節點上計算。RDD 可以包含任何型別的 Python、Java 或 Scala 物件,包括使用者定義的類。

正式地說,RDD 是一個只讀的、分割槽的記錄集合。RDD 可以透過對穩定儲存上的資料或其他 RDD 執行確定性操作來建立。RDD 是一個容錯的元素集合,可以並行操作。

建立 RDD 有兩種方法:**並行化**驅動程式程式中現有的集合,或**引用**外部儲存系統(如共享檔案系統、HDFS、HBase 或任何提供 Hadoop 輸入格式的資料來源)中的資料集。

Spark 利用 RDD 的概念來實現更快、更高效的 MapReduce 操作。讓我們首先討論 MapReduce 操作是如何發生的以及為什麼它們效率不高。

MapReduce 中的資料共享速度慢

MapReduce 被廣泛用於使用叢集上的並行分散式演算法處理和生成大型資料集。它允許使用者使用一組高階運算子編寫平行計算,而無需擔心工作分配和容錯。

不幸的是,在大多數當前框架中,在計算之間(例如,在兩個 MapReduce 作業之間)重用資料的唯一方法是將其寫入外部穩定儲存系統(例如,HDFS)。儘管此框架提供了許多用於訪問叢集計算資源的抽象,但使用者仍然希望獲得更多。

**迭代**和**互動**應用程式都需要在並行作業之間進行更快的共享資料。由於**複製**、**序列化**和**磁碟 I/O**,MapReduce 中的資料共享速度很慢。關於儲存系統,大多數 Hadoop 應用程式花費超過 90% 的時間執行 HDFS 讀寫操作。

MapReduce 上的迭代操作

在多階段應用程式中的多個計算中重用中間結果。下圖說明了當前框架在 MapReduce 上執行迭代操作時的工作原理。由於資料複製、磁碟 I/O 和序列化,這會導致大量開銷,從而使系統變慢。

Iterative Operations on MapReduce

MapReduce 上的互動操作

使用者對同一資料集的子集執行 ad-hoc 查詢。每個查詢都將在穩定儲存上執行磁碟 I/O,這可能會主導應用程式執行時間。

下圖說明了當前框架在 MapReduce 上執行互動式查詢時的工作原理。

Interactive Operations on MapReduce

使用 Spark RDD 共享資料

由於**複製**、**序列化**和**磁碟 I/O**,MapReduce 中的資料共享速度很慢。大多數 Hadoop 應用程式花費超過 90% 的時間執行 HDFS 讀寫操作。

認識到這個問題,研究人員開發了一個名為 Apache Spark 的專門框架。Spark 的核心思想是**彈性分散式資料集**(RDD);它支援記憶體中處理計算。這意味著它將記憶體狀態儲存為跨作業的物件,並且該物件可以在這些作業之間共享。記憶體中的資料共享速度比網路和磁碟快 10 到 100 倍。

現在讓我們嘗試找出 Spark RDD 中迭代和互動操作是如何發生的。

Spark RDD 上的迭代操作

下圖顯示了 Spark RDD 上的迭代操作。它將中間結果儲存在分散式記憶體中,而不是穩定儲存(磁碟),從而使系統更快。

**注意** - 如果分散式記憶體(RAM)不足以儲存中間結果(作業狀態),則它將把這些結果儲存在磁碟上。

Iterative Operations on Spark RDD

Spark RDD 上的互動操作

此圖顯示了 Spark RDD 上的互動操作。如果對同一組資料重複執行不同的查詢,則可以將此特定資料儲存在記憶體中以獲得更好的執行時間。

Interactive Operations on Spark RDD

預設情況下,每次對轉換後的 RDD 執行操作時,它都可能重新計算。但是,您也可以將 RDD **持久化**到記憶體中,在這種情況下,Spark 將在下次查詢它時將元素保留在叢集中以實現更快的訪問。還支援將 RDD 持久化到磁碟或跨多個節點複製。

廣告

© . All rights reserved.