彈性分布式數(shù)據(jù)集(RDD)是Spark的基本數(shù)據(jù)結(jié)構(gòu)。它是一個不可變的分布式對象集合。 RDD中的每個數(shù)據(jù)集劃分為邏輯分區(qū),可以在集群的不同節(jié)點上計算。 RDD可以包含任何類型的Python,Java或Scala對象,包括用戶定義的類。
形式上,RDD是只讀的,分區(qū)的記錄集合。 RDD可以通過對穩(wěn)定存儲器或其他RDD上的數(shù)據(jù)的確定性操作來創(chuàng)建。 RDD是可以并行操作的元件的容錯集合。
有兩種方法來創(chuàng)建RDD - 并行化驅(qū)動程序中的現(xiàn)有集合,或引用外部存儲系統(tǒng)中的數(shù)據(jù)集,例如共享文件系統(tǒng),HDFS,HBase或提供Hadoop輸入格式的任何數(shù)據(jù)源。
Spark使用RDD的概念來實現(xiàn)更快和更高效的MapReduce操作。讓我們首先討論MapReduce操作是如何發(fā)生的,以及為什么它們不那么高效。
MapReduce被廣泛應用于在集群上使用并行的分布式算法來處理和生成大型數(shù)據(jù)集。它允許用戶使用一組高級操作符來編寫并行計算,而不必擔心工作分布和容錯。
不幸的是,在大多數(shù)當前框架中,在計算之間重復使用數(shù)據(jù)(例如:兩個MapReduce作業(yè)之間)的唯一方法是將其寫入外部穩(wěn)定存儲系統(tǒng)(例如:HDFS)。雖然這個框架提供了訪問集群的計算資源的許多抽象,用戶仍然想要更多。
迭代和交互應用程序都需要跨并行作業(yè)更快的數(shù)據(jù)共享。由于復制,序列化和磁盤IO,MapReduce中的數(shù)據(jù)共享速度很慢。關(guān)于存儲系統(tǒng),大多數(shù)Hadoop應用程序,他們花費90%以上的時間做HDFS讀寫操作。
在多階段應用程序中跨多個計算重用中間結(jié)果。下圖說明了當前框架如何工作,同時對MapReduce執(zhí)行迭代操作。這會由于數(shù)據(jù)復制,磁盤I / O和序列化而招致大量開銷,這使得系統(tǒng)變慢。
此圖顯示星火RDD交互式操作。如果不同的查詢在同一組數(shù)據(jù)的反復運行,該特定數(shù)據(jù)可被保存在內(nèi)存中獲得更好的執(zhí)行時間。
默認情況下,每次對其執(zhí)行操作時,都可以重新計算每個已轉(zhuǎn)換的RDD。 但是,您還可以在內(nèi)存中保留RDD,在這種情況下,Spark將保持集群上的元素更快的訪問,下次查詢它。 還支持在磁盤上持久存儲RDD,或者跨多個節(jié)點進行復制。
更多建議: