Spark RDD

2018-12-20 10:08 更新

彈性分布式數(shù)據(jù)集

彈性分布式數(shù)據(jù)集(RDD)是Spark的基本數(shù)據(jù)結(jié)構(gòu)。它是一個(gè)不可變的分布式對(duì)象集合。 RDD中的每個(gè)數(shù)據(jù)集劃分為邏輯分區(qū),可以在集群的不同節(jié)點(diǎn)上計(jì)算。 RDD可以包含任何類型的Python,Java或Scala對(duì)象,包括用戶定義的類。

形式上,RDD是只讀的,分區(qū)的記錄集合。 RDD可以通過(guò)對(duì)穩(wěn)定存儲(chǔ)器或其他RDD上的數(shù)據(jù)的確定性操作來(lái)創(chuàng)建。 RDD是可以并行操作的元件的容錯(cuò)集合。

有兩種方法來(lái)創(chuàng)建RDD - 并行化驅(qū)動(dòng)程序中的現(xiàn)有集合,或引用外部存儲(chǔ)系統(tǒng)中的數(shù)據(jù)集,例如共享文件系統(tǒng),HDFS,HBase或提供Hadoop輸入格式的任何數(shù)據(jù)源。

Spark使用RDD的概念來(lái)實(shí)現(xiàn)更快和更高效的MapReduce操作。讓我們首先討論MapReduce操作是如何發(fā)生的,以及為什么它們不那么高效。

MapReduce中的數(shù)據(jù)共享緩慢

MapReduce被廣泛應(yīng)用于在集群上使用并行的分布式算法來(lái)處理和生成大型數(shù)據(jù)集。它允許用戶使用一組高級(jí)操作符來(lái)編寫(xiě)并行計(jì)算,而不必?fù)?dān)心工作分布和容錯(cuò)。

不幸的是,在大多數(shù)當(dāng)前框架中,在計(jì)算之間重復(fù)使用數(shù)據(jù)(例如:兩個(gè)MapReduce作業(yè)之間)的唯一方法是將其寫(xiě)入外部穩(wěn)定存儲(chǔ)系統(tǒng)(例如:HDFS)。雖然這個(gè)框架提供了訪問(wèn)集群的計(jì)算資源的許多抽象,用戶仍然想要更多。

迭代和交互應(yīng)用程序都需要跨并行作業(yè)更快的數(shù)據(jù)共享。由于復(fù)制,序列化和磁盤IO,MapReduce中的數(shù)據(jù)共享速度很慢。關(guān)于存儲(chǔ)系統(tǒng),大多數(shù)Hadoop應(yīng)用程序,他們花費(fèi)90%以上的時(shí)間做HDFS讀寫(xiě)操作。

MapReduce迭代運(yùn)算

在多階段應(yīng)用程序中跨多個(gè)計(jì)算重用中間結(jié)果。下圖說(shuō)明了當(dāng)前框架如何工作,同時(shí)對(duì)MapReduce執(zhí)行迭代操作。這會(huì)由于數(shù)據(jù)復(fù)制,磁盤I / O和序列化而招致大量開(kāi)銷,這使得系統(tǒng)變慢。

MapReduce的迭代操作

MapReduce上的交互操作

用戶對(duì)同一數(shù)據(jù)子集運(yùn)行即席查詢。 每個(gè)查詢將對(duì)穩(wěn)定存儲(chǔ)執(zhí)行磁盤I / O,這可以支配應(yīng)用程序執(zhí)行時(shí)間。
下圖說(shuō)明了當(dāng)在MapReduce上執(zhí)行交互式查詢時(shí)當(dāng)前框架如何工作。

MapReduce的交互式操作

使用Spark RDD進(jìn)行數(shù)據(jù)共享

由于復(fù)制序列化磁盤IO,MapReduce中的數(shù)據(jù)共享速度很慢。大多數(shù)Hadoop應(yīng)用程序,他們花費(fèi)90%以上的時(shí)間做HDFS讀寫(xiě)操作。
認(rèn)識(shí)到這個(gè)問(wèn)題,研究人員開(kāi)發(fā)了一個(gè)名為Apache Spark的專門框架。 spark的關(guān)鍵思想是彈性分布式數(shù)據(jù)集(RDD);它支持內(nèi)存中處理計(jì)算。這意味著,它將存儲(chǔ)器的狀態(tài)存儲(chǔ)為作業(yè)中的對(duì)象,并且對(duì)象可以在這些作業(yè)之間共享。內(nèi)存中的數(shù)據(jù)共享比網(wǎng)絡(luò)和磁盤快10到100倍。
讓我們現(xiàn)在嘗試找出Spark RDD中如何進(jìn)行迭代和交互操作。

Spark RDD的迭代操作

下圖給出了Spark RDD的迭代操作。它將中間結(jié)果存儲(chǔ)在分布式存儲(chǔ)器中,而不是穩(wěn)定存儲(chǔ)(磁盤),并使系統(tǒng)更快。
注意 - 如果分布式內(nèi)存(RAM)不足以存儲(chǔ)中間結(jié)果(JOB的狀態(tài)),則它將這些結(jié)果存儲(chǔ)在磁盤上

在星火RDD迭代操作

在星火RDD交互式操作

此圖顯示星火RDD交互式操作。如果不同的查詢?cè)谕唤M數(shù)據(jù)的反復(fù)運(yùn)行,該特定數(shù)據(jù)可被保存在內(nèi)存中獲得更好的執(zhí)行時(shí)間。

在星火RDD交互式操作

默認(rèn)情況下,每次對(duì)其執(zhí)行操作時(shí),都可以重新計(jì)算每個(gè)已轉(zhuǎn)換的RDD。 但是,您還可以在內(nèi)存中保留RDD,在這種情況下,Spark將保持集群上的元素更快的訪問(wèn),下次查詢它。 還支持在磁盤上持久存儲(chǔ)RDD,或者跨多個(gè)節(jié)點(diǎn)進(jìn)行復(fù)制。

以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)