彈性分布式數(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被廣泛應(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ě)操作。
在多階段應(yīng)用程序中跨多個(gè)計(jì)算重用中間結(jié)果。下圖說(shuō)明了當(dāng)前框架如何工作,同時(shí)對(duì)MapReduce執(zhí)行迭代操作。這會(huì)由于數(shù)據(jù)復(fù)制,磁盤I / O和序列化而招致大量開(kāi)銷,這使得系統(tǒng)變慢。
此圖顯示星火RDD交互式操作。如果不同的查詢?cè)谕唤M數(shù)據(jù)的反復(fù)運(yùn)行,該特定數(shù)據(jù)可被保存在內(nèi)存中獲得更好的執(zhí)行時(shí)間。
默認(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ù)制。
更多建議: