圖解大資料 | 基於Spark RDD的大資料處理分析
作者:韓信子@ShowMeAI
教程地址:http://www.showmeai.tech/tutorials/84
本文地址:http://www.showmeai.tech/article-detail/174
宣告:版權所有,轉載請聯絡平臺與作者並註明出處
1.RDD介紹
要掌握基於Spark的大資料處理操作,大家首先要了解Spark中的一個核心資料概念:RDD。
1)RDD介紹
RDD,全稱為Resilient Distributed Datasets(彈性分散式資料集合),是一個容錯的、並行的資料結構,可以讓使用者顯式地將資料儲存到磁碟和記憶體中,並能控制資料的分割槽。同時,RDD還提供了一組豐富的操作來操作這些資料。
RDD(彈性分散式資料集合)是Spark的基本資料結構,Spark中的所有資料都是通過RDD的形式進行組織。
- RDD是不可變的資料集合,每個分割槽資料是隻讀的。
- RDD資料集要做邏輯分割槽(類似hadoop中的邏輯切片split),每個分割槽可以單獨在叢集節點進行計算。
- RDD資料集中的資料型別可以包含任何java型別、scala型別、python型別或者自定義的型別。
- RDD擅長的領域:迭代式的資料處理,比如機器學習。
2)RDD的5個屬性
每個RDD有5個主要的屬性:
- 一組分片(partition),資料集的基本組成單位。
- 一個函式,計算每個分片。
- 對parent RDD的依賴,描述RDD之間的lineage。
- 一個Partitioner,對於key-value的RDD。
- 一個列表,儲存存取每個partition的preferred位置。例如對於一個HDFS檔案來說,儲存每個partition所在的塊的位置。
3)RDD與Spark任務
在Spark分散式資料處理任務中,RDD提供資料,供任務處理。很多時候hadoop和Spark結合使用:hadoop提供hdfs的分散式儲存,Spark處理hdfs中的資料。
我們以 sc.textFile("hdfs://path/to/file")
形式生成RDD時,Spark就已經算好了資料的各個切片(也叫分割槽),並把分割槽資訊放在了一個列表(名單)裡,這個名單就屬於RDD自帶的其中一個屬性。
-
RDD不包含實際要處理的資料,而是在RDD中的分割槽名單中載明切片的資訊。
-
資料已經在Hadoop的資料節點上了,只要在RDD中標明分割槽對應的資料所在位置、偏移量、資料長度即可,就類似元資料。
RDD在被分發到每個執行計算的任務節點後,每個任務節點會根據元資料資訊獲取自身節點負責計算的分割槽資料,並把資料放到本節點的記憶體當中,然後對資料進行計算。
- 每個分割槽由一個節點來計算,換句話說就是每個任務只計算RDD的其中一個分割槽。
一般我們會把資料所在的節點和Spark的計算節點配成同一個主機,這樣就實現了資料本地化。
- 在worker節點將要執行Spark的計算任務時,只需要從本地載入資料,再對資料運用Spark的計算函式,就不需要從別處(例如遠端主機)通過網路傳輸把需要計算的資料拿過來,從而避免了昂貴的網路傳輸成本。“寧可移動函式,也不要移動資料”。
2.RDD建立方式
1)建立RDD的3種方式
RDD的3種建立方式如下圖所示(以pyspark程式碼為例):
2)從外部資料建立RDD
spark也支援從多種外部資料來源讀取資料,包括HDFS、S3、Hbase、MongoDB等,如下圖所示:
3.RDD廣播與累加器
1)共享變數
在Spark程式中,當一個傳遞給Spark操作(例如map和reduce)的函式在遠端節點上面執行時,Spark操作實際上操作的是這個函式所用變數的一個獨立副本。
這些變數會被複制到每臺機器上,並且這些變數在遠端機器上的所有更新都不會傳遞迴驅動程式。
通常跨任務的讀寫變數是低效的,但是,Spark還是為兩種常見的使用模式提供了兩種有限的共享變數:
- 廣播變數(broadcast variable)
- 累加器(accumulator)
2)廣播變數
為什麼要將變數定義成廣播變數?
在分散式計算中,由Driver端分發大物件(如字典、集合、黑白名單等),一般,如果這個變數不是廣播變數,那麼每個task就會分發一份。在task數目十分多的情況下,Driver的頻寬會成為系統的瓶頸,而且會大量消耗task伺服器上的資源。
如果將這個變數宣告為廣播變數,那麼知識每個executor擁有一份,這個executor啟動的task會共享這個變數,節省了通訊的成本和伺服器的資源
3)累加器
為什麼要將變數定義為累加器?
在Spark應用程式中,異常監控、除錯、記錄符合某特性的資料數目,這些需求都需要用到計數器。
如果變數不被宣告為累加器,那麼被改變時不在Driver端進行全域性彙總。即在分散式執行時每個task執行的只是原始變數的一個副本,並不能改變原始變數的值。
但是,當這個變數被宣告為累加器後,該變數就會有分散式計數的功能。
4.RDD transformation與action
要對大資料進行處理,我們需要使用到一系列Spark RDD上可以變換與操作的運算元,我們來重點理解一下spark的RDD transformation和action。
1)transformation與action
transformation操作針對已有的RDD建立一個新的RDD。
- 例如,map就是一種transformation操作。它用於將已有RDD的每個元素傳入一個自定義的函式,並獲取一個新的元素,然後將所有新元素組成一個新的RDD。
action主要是對RDD進行最後的操作(如遍歷、reduce、儲存到檔案等),並可以返回結果給Driver程式。
- 例如,reduce就是一種action操作。它用於對RDD中的所有元素進行聚合操作,並獲取一個最終的結果,然後返回給Driver程式。
2)高頻RDD運算元圖解
map與flatMap
filter與distinct
sort與sortBy
sample與takeSample
union與intersection
groupby與cartesian
join與glom
collect與reduce
top與count
takeOrdered與take
reduceByKey與collectAsMap
5.參考資料
- 資料科學工具速查 | Spark使用指南(RDD版) http://www.showmeai.tech/article-detail/106
- 資料科學工具速查 | Spark使用指南(SQL版) http://www.showmeai.tech/article-detail/107
- 耿嘉安,Spark核心設計的藝術:架構設計與實現, 機械工業出版社,2018
- 郭景瞻,圖解Spark:核心技術與案例實戰,電子工業出版社
- Spark的基本資料結構RDD介紹: https://blog.csdn.net/qq_31598113/article/details/70832701
- Spark RDD(Resilient Distributed Datasets)論文:http://spark.apachecn.org/paper/zh/spark-rdd.html
ShowMeAI相關文章推薦
- 圖解大資料 | 導論:大資料生態與應用
- 圖解大資料 | 分散式平臺:Hadoop與Map-reduce詳解
- 圖解大資料 | 實操案例:Hadoop系統搭建與環境配置
- 圖解大資料 | 實操案例:應用map-reduce進行大資料統計
- 圖解大資料 | 實操案例:Hive搭建與應用案例
- 圖解大資料 | 海量資料庫與查詢:Hive與HBase詳解
- 圖解大資料 | 大資料分析挖掘框架:Spark初步
- 圖解大資料 | Spark操作:基於RDD的大資料處理分析
- 圖解大資料 | Spark操作:基於Dataframe與SQL的大資料處理分析
- 圖解大資料 | 綜合案例:使用spark分析美國新冠肺炎疫情資料
- 圖解大資料 | 綜合案例:使用Spark分析挖掘零售交易資料
- 圖解大資料 | 綜合案例:使用Spark分析挖掘音樂專輯資料
- 圖解大資料 | 流式資料處理:Spark Streaming
- 圖解大資料 | Spark機器學習(上)-工作流與特徵工程
- 圖解大資料 | Spark機器學習(下)-建模與超參調優
- 圖解大資料 | Spark GraphFrames:基於圖的資料分析挖掘