spark rdd介紹

RDD介紹

RDD(Resilient Distributed Dataset,彈性分佈式數據集),是Spark最爲核心的概念。官方說法是RDD是隻讀的,分區記錄的集合。

RDD具體包含了一些什麼東西

rdd是一個類,它包含了數據應該在哪算,具體該怎麼算,算完了放在哪個地方。它是能被序列化,也能被反序列化。
在開發的時候,rdd給人的感覺就是一個只讀的數據。但是不是,rdd存儲的不是數據,而是數據的位置,數據的類型,獲取數據的方法,分區的方法等等。

通白的講下RDD的五大特性

A list of partitions

RDD是一個由多個partition(某個節點裏的某一片連續的數據)組成的list,將數據加載爲RDD時,一般會遵守數據的本地性(一般來說一個hdfs裏的block會加載爲一個partition)

A function for computing each split

一個函數應用在一個RDD上,可以理解爲一個函數對集合(RDD)中的每一個元素(split)進行操作。

A list of dependencies on other RDDs

一個RDD依賴於一組RDD。

Optionally, a Partitioner for key-value RDDs

可以對每一個partitioner進行再次分區。但是這個特性的先決條件是RDD必須是鍵值對格式的。

Optionally, a list of preferred locations to compute each split on

最佳位置。數據在哪臺機器上,任務就啓在哪個機器上,數據在本地,就不用走網絡。但是數據最後彙總的時候還是要走網絡的。

RDD可以從哪來

1.通過序列化集合的方式
2.通過讀取文件的方式
3.通過其他的RDD進行transformation轉換而來

RDD的緩存和容錯

RDD緩存的幾個應用場景

1.獲取了大量數據之後,例如:從日誌文件獲取了數據後,因爲重新獲取文件成本較高
2.經過了較長的鏈條計算後,因爲重新計算成本比較高
3.單個步驟非常消耗資源,可以在這個步驟後進行緩存

一般緩存應用準則

1.窄依賴想要設置緩存的時候,用cache
2.遇到寬依賴設置用checkpoint

persist()與checkpoint()對比

persist()只存在本機上,所以不用設置路徑
checkpoint()備份到指定目錄

cache()與checkpoint()對比

cache()只是緩存數據,不改變RDD的依賴關係
checkpoint()是已經生成了一個新的RDD,後面的RDD依賴關係已經改變,前面計算的結果已經彙總到一個RDD中
正常來說,當某一步失敗以後,往前找的順序爲 checkpoint -> cache ->重算

RDD的依賴關係

RDD的依賴分爲寬依賴和窄依賴,最主要的目的是劃分Stage和設置緩存

寬依賴

依賴的RDD產生的數據不只是給我用的(父RDD的partition不只是對應一個子RDD的partition),不會有shuffle的產生

窄依賴

依賴的RDD產生的數據只給我自己,會有shuffle的產生

RDD的常見操作

RDD的常見操作分爲 轉換算子,執行算子等

常用的轉換算子

map

對rdd中的每一個元素進行操作

mapPartition

對rdd中的每一個分區進行操作
可以在這裏面創建鏈接器

flatMap

類似於map。1對多,可以理解成將原來的數據集拍扁了。RDD中每個元素可生成一個或多個元素構成的新RDD
例如將數組、列表拆分成單個值或字符串拆分成單個字符

flatMapValues

類似於flatMap,只不過flatMapValues是針對[K,V]中的V值進行flatMap操作。

filter

過濾,根據裏面的規則返回(true的)一個過濾過後的rdd

distinct

去除RDD重複的元素,返回所有元素不重複的RDD

cache()

Cache()是persis的一種特殊情況,將RDD持久化到內存中

常用的執行算子

aggregate

根據初始化值進行對rdd種的元素進行聚合,結束之後每個分區會有一個結果,後面會根據這個分區結果再進行一次聚合

Collect

一個RDD轉換成數組。

Count

返回RDD中的元素數量

First

返回RDD中的第一個元素,不排序

foreach

遍歷RDD,將函數f應用於每一個元素。
需要注意如果RDD執行foreach,只會在Executor端有效,並且不是Driver端。

foreachPartition

與foreach類似,只不過是對每一個分區使用

Lookup

與foreach類似,只不過是對每一個分區使用
用於(K,V)類型的RDD,指定K值,
返回RDD中該K對應的所有V值。

persist()

persis(level:StorageLevel)可以傳入緩存級別,默認是MEMORY_ONLY,此時同cache()操作

saveAsHadoopFile

將RDD存儲在HDFS上的文件中

saveAsNewAPIHadoopFile

用於將RDD數據保存到HDFS上,使用新版本的Hadoop API,用法基本同saveAsHadoopFile

saveAsNewAPIHadoopDataset

可以用於將RDD保存到除了HDFS的其他存儲中,比如HBase。

saveAsObjectFile

將RDD中的元素序列化成對象,存儲到文件中(hdfs默認使用SequenceFile)。

saveAsSequenceFile

將RDD以SequenceFile的文件格式保存到HDFS上.

saveAsTextFile

將RDD以文本文件的格式存儲到文件系統中。

saveAsHadoopDataset

可以用於將RDD保存到除了HDFS的其他存儲中,比如HBase。

還有就是爲什麼說RDD是彈性的呢?

大概有這麼幾個點:

1.它可以自動進行內存和磁盤切換
2.基於lineage(血統)的高效容錯,在中間某個點出錯的時候,可以從它前面的某個的進行恢復
3.Task如果失敗會進行特定次數的重試
4.Stage如果失敗也會自動進行特定次數的重試,只計算失敗的部分
5.checkpoint和persist(這個在後面會具體講到)
6.數據調度彈性:DAG,Task和資源管理無關
7.數據分片的高度彈性

因爲sparkcore是整個spark體系中的核心,而rdd又是比較核心的一塊,所以先把RDD相關的東西總結了一下,後期會圍繞spark core,spark sql,sparkstreaming 的一些原理進行分析

歡迎大家關注我的公衆號,我會持續更新相關的知識,遇到什麼問題大家可以一起交流

在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章