彈性分佈式數據集
彈性分佈式數據集(RDD)是Spark的基本數據結構。它是一個不可變的分佈式對象集合。 RDD中的每個數據集劃分為邏輯分區,可以在集群的不同節點上計算。 RDD可以包含任何類型的Python,Java或Scala對象,包括用戶定義的類。
形式上,RDD是隻讀的,分區的記錄集合。 RDD可以通過對穩定存儲器或其他RDD上的數據的確定性操作來創建。 RDD是可以並行操作的元件的容錯集合。
有兩種方法來創建RDD - 並行化驅動程序中的現有集合,或引用外部存儲系統中的數據集,例如共享文件系統,HDFS,HBase或提供Hadoop輸入格式的任何數據源。
Spark使用RDD的概念來實現更快和更高效的MapReduce操作。讓我們首先討論MapReduce操作是如何發生的,以及為什麼它們不那麼高效。
MapReduce中的數據共享緩慢
MapReduce被廣泛應用於在集群上使用並行的分佈式算法來處理和生成大型數據集。它允許用戶使用一組高級操作符來編寫並行計算,而不必擔心工作分佈和容錯。
不幸的是,在大多數當前框架中,在計算之間重複使用數據(例如:兩個MapReduce作業之間)的唯一方法是將其寫入外部穩定存儲系統(例如:HDFS)。雖然這個框架提供了訪問集群的計算資源的許多抽象,用戶仍然想要更多。
迭代和交互應用程序都需要跨並行作業更快的數據共享。由於複製,序列化和磁盤IO,MapReduce中的數據共享速度很慢。關於存儲系統,大多數Hadoop應用程序,他們花費90%以上的時間做HDFS讀寫操作。
MapReduce迭代運算
在多階段應用程序中跨多個計算重用中間結果。下圖說明了當前框架如何工作,同時對MapReduce執行迭代操作。這會由於數據複製,磁盤I / O和序列化而招致大量開銷,這使得系統變慢。
MapReduce上的交互操作
用戶對同一數據子集運行即席查詢。 每個查詢將對穩定存儲執行磁盤I / O,這可以支配應用程序執行時間。下圖說明了當在MapReduce上執行交互式查詢時當前框架如何工作。
使用Spark RDD進行數據共享
由於複製,序列化和磁盤IO,MapReduce中的數據共享速度很慢。大多數Hadoop應用程序,他們花費90%以上的時間做HDFS讀寫操作。認識到這個問題,研究人員開發了一個名為Apache Spark的專門框架。 spark的關鍵思想是彈性分佈式數據集(RDD);它支持內存中處理計算。這意味著,它將存儲器的狀態存儲為作業中的對象,並且對象可以在這些作業之間共享。內存中的數據共享比網絡和磁盤快10到100倍。讓我們現在嘗試找出Spark RDD中如何進行迭代和交互操作。
Spark RDD的迭代操作
下圖給出了Spark RDD的迭代操作。它將中間結果存儲在分佈式存儲器中,而不是穩定存儲(磁盤),並使系統更快。注意 - 如果分佈式內存(RAM)不足以存儲中間結果(JOB的狀態),則它將這些結果存儲在磁盤上
在星火RDD交互式操作
此圖顯示星火RDD交互式操作。如果不同的查詢在同一組數據的反覆運行,該特定數據可被保存在內存中獲得更好的執行時間。
默認情況下,每次對其執行操作時,都可以重新計算每個已轉換的RDD。 但是,您還可以在內存中保留RDD,在這種情況下,Spark將保持集群上的元素更快的訪問,下次查詢它。 還支持在磁盤上持久存儲RDD,或者跨多個節點進行復制。
閱讀更多 會飛的魚go 的文章