數(shù)據(jù)結(jié)構(gòu)
RDD
- 彈性分布式數(shù)據(jù)集。
Resilient Distributed Datasets,意為容錯(cuò)的、并行的數(shù)據(jù)結(jié)構(gòu),可以讓用戶顯式地將數(shù)據(jù)存儲(chǔ)到磁盤和內(nèi)存中,并能控制數(shù)據(jù)的分區(qū)。同時(shí),RDD還提供了一組豐富的操作來操作這些數(shù)據(jù)。
- RDD的特點(diǎn)
- 它是在集群節(jié)點(diǎn)上的不可變的、已分區(qū)的集合對(duì)象。
- 通過并行轉(zhuǎn)換的方式來創(chuàng)建如(map, filter, join, etc)。
- 失敗自動(dòng)重建。
- 可以控制存儲(chǔ)級(jí)別(內(nèi)存、磁盤等)來進(jìn)行重用。
- 必須是可序列化的。
- 是靜態(tài)類型的。
- RDD優(yōu)點(diǎn)
- 編譯時(shí)類型安全
- 面向?qū)ο蟮木幊田L(fēng)格 ,直接通過類名點(diǎn)的方式來操作數(shù)據(jù)
- RDD缺點(diǎn)
- 序列化和反序列化的性能開銷,因?yàn)镽DD只有數(shù)據(jù),沒有數(shù)據(jù)結(jié)構(gòu),無論是集群間的通信, 還是IO操作都需要對(duì)對(duì)象的結(jié)構(gòu)和數(shù)據(jù)進(jìn)行序列化和反序列化.
- GC的性能開銷,頻繁的創(chuàng)建和銷毀對(duì)象, 勢(shì)必會(huì)增加GC。
RDD曾是spark處理數(shù)據(jù)最核心的基本單元,而spark在1.6推出了新的數(shù)據(jù)處理對(duì)象DataFarme和DataSet。
DataFarme
它在RDD的基礎(chǔ)上增加了數(shù)據(jù)的類型。DataFrame是一種以RDD為基礎(chǔ)的分布式數(shù)據(jù)集,類似于傳統(tǒng)數(shù)據(jù)庫中的二維表格。
- 它針對(duì)RDD的弱點(diǎn)做了如下優(yōu)化
- 序列化與反序列化的性能開銷,這個(gè)不用說,因?yàn)橛辛藬?shù)據(jù)結(jié)構(gòu),所以節(jié)省了這一塊。具體上,DataFrame引入了schema : RDD每一行的數(shù)據(jù), 結(jié)構(gòu)都是一樣的. 這個(gè)結(jié)構(gòu)就存儲(chǔ)在schema中. spark通過schame就能夠讀懂?dāng)?shù)據(jù), 因此在通信和IO時(shí)就只需要序列化和反序列化數(shù)據(jù), 而結(jié)構(gòu)的部分就可以省略了.
- GC的性能開銷,DataFrame引入了off-heap: 意味著JVM堆以外的內(nèi)存, 這些內(nèi)存直接受操作系統(tǒng)管理(而不是JVM)。Spark能夠以二進(jìn)制的形式序列化數(shù)據(jù)(不包括結(jié)構(gòu))到off-heap中, 當(dāng)要操作數(shù)據(jù)時(shí), 就直接操作off-heap內(nèi)存. 由于Spark理解schema, 所以知道該如何操作.
缺點(diǎn):沒有了RDD類型安全和面向?qū)ο蟮膬?yōu)點(diǎn)。
Dataset
結(jié)合了RDD和DataFrame的優(yōu)點(diǎn)。它同時(shí)具備了RDD的類型安全和面向?qū)ο髢?yōu)點(diǎn),同時(shí)也具備了DataFrame的schema和off-heap。同時(shí),它引入了新的概念Encoder。能夠按需訪問,而無需訪問整個(gè)對(duì)象。
總結(jié)
- RDD類型安全,面向?qū)ο蟆?/li>
- RDD僅有數(shù)據(jù)沒有數(shù)據(jù)結(jié)構(gòu),序列化開銷大。DataFrame引入schema使其具備了數(shù)據(jù)結(jié)構(gòu)。同時(shí)其生命周期脫離了JVM和頻繁的GC回收。因此其不再是字節(jié)碼,而是二進(jìn)制,又因?yàn)閟chema,所以操作系統(tǒng)和spark能夠快速識(shí)別。但DataFrame失去了RDD類型安全面向?qū)ο蟮膬?yōu)點(diǎn)。
- DataSet具體RDD和DataFrame的共同優(yōu)點(diǎn)。同時(shí)能夠按字段訪問,無需操作整 個(gè)對(duì)象。
- 就優(yōu)點(diǎn)和性能來說 RDD<DataFrame<DataSet
組件

Spark算子
Transformation變換/轉(zhuǎn)換算子
這種變換并不觸發(fā)提交作業(yè),完成作業(yè)中間過程處理。
Transformation 操作是延遲計(jì)算的,也就是說從一個(gè)RDD 轉(zhuǎn)換生成另一個(gè) RDD 的轉(zhuǎn)換操作不是馬上執(zhí)行,需要等到有 Action 操作的時(shí)候才會(huì)真正觸發(fā)運(yùn)算。
Action行動(dòng)算子
這類算子會(huì)觸發(fā) SparkContext 提交 Job 作業(yè)。
Action 算子會(huì)觸發(fā) Spark 提交作業(yè)(Job),并將數(shù)據(jù)輸出 Spark系統(tǒng)。
輸入分區(qū)與輸出分區(qū)一對(duì)一型
- map算子
- flatMap算子
- mapPartitions算子
- glom算子
輸入分區(qū)與輸出分區(qū)多對(duì)一型
- union算子
- cartesian算子(笛卡爾積函數(shù))
輸入分區(qū)與輸出分區(qū)多對(duì)多型
- grouBy算子
輸出分區(qū)為輸入分區(qū)子集型
- filter算子
- distinct算子
- subtract算子(去掉交集,不去重)
- sample算子
- takeSample算子
- intersection算子(取子集并去重)
Cache型
- cache算子
- persist算子
cache只有一個(gè)默認(rèn)的緩存級(jí)別MEMORY_ONLY ,而persist可以根據(jù)情況設(shè)置其它的緩存級(jí)別。
常用算子總覽
| 操作類型 | 函數(shù)名 | 作用 | 輸入與輸出關(guān)系 | |
|---|---|---|---|---|
| 轉(zhuǎn)化操作 | map | 參數(shù)是函數(shù),函數(shù)應(yīng)用于RDD每一個(gè)元素,返回值是新的RDD | 分區(qū)一對(duì)一 | |
| 轉(zhuǎn)化操作 | flatMap | 參數(shù)是函數(shù),函數(shù)應(yīng)用于RDD每一個(gè)元素,將元素?cái)?shù)據(jù)進(jìn)行拆分,變成迭代器,返回值是新的RDD | 分區(qū)一對(duì)一 | |
| 轉(zhuǎn)化操作 | filter | 參數(shù)是函數(shù),函數(shù)會(huì)過濾掉不符合條件的元素,返回值是新的RDD | 分區(qū)一對(duì)一 | |
| 轉(zhuǎn)化操作 | distinct | 沒有參數(shù),將RDD里的元素進(jìn)行去重操作 | 輸出分區(qū)為輸入分區(qū)子集 | |
| 轉(zhuǎn)化操作 | union | 參數(shù)是RDD,生成包含兩個(gè)RDD所有元素的新RDD | 輸入分區(qū)與輸出分區(qū)多對(duì)一 | |
| 轉(zhuǎn)化操作 | intersection | 參數(shù)是RDD,求出兩個(gè)RDD的共同元素 | 輸出分區(qū)為輸入分區(qū)子集 | |
| 轉(zhuǎn)化操作 | subtract | 參數(shù)是RDD,將原RDD里和參數(shù)RDD里相同的元素去掉 | 輸出分區(qū)為輸入分區(qū)子集 | |
| 轉(zhuǎn)化操作 | cartesian | 參數(shù)是RDD,求兩個(gè)RDD的笛卡兒積 | 輸入分區(qū)與輸出分區(qū)多對(duì)一 | |
| 行動(dòng)操作 | collect | 返回RDD所有元素 | 返回RDD所有元素 | |
| 行動(dòng)操作 | count | RDD里元素個(gè)數(shù) | ||
| 行動(dòng)操作 | countByValue | 各元素在RDD中出現(xiàn)次數(shù) | ||
| 行動(dòng)操作 | reduce | 并行整合所有RDD數(shù)據(jù),例如求和操作 | ||
| 行動(dòng)操作 | fold(0)(func) | 和reduce功能一樣,不過fold帶有初始值 | ||
| 行動(dòng)操作 | aggregate(0)(seqOp,combop) | 和reduce功能一樣,但是返回的RDD數(shù)據(jù)類型和原RDD不一樣 | ||
| 行動(dòng)操作 | foreach(func) | 對(duì)RDD每個(gè)元素都是使用特定函數(shù) |