官术网_书友最值得收藏!

第4章

編程模型

不自見,故明;不自是,故彰;不自伐,故有功;不自矜,故能長。

——《道德經》第二十二章

在面對自我的問題上,不自我表揚,反能顯明;不自以為是,反能彰顯;不自我夸耀,反能見功;不自我矜恃,反能長久。

與許多專有的大數據處理平臺不同,基于Spark的大數據處理平臺,建立在統一抽象的RDD之上,這是Spark這朵小火花讓人著迷的地方,也是學習Spark編程模型的瓶頸所在,充滿了很深的理論和工程背景。

本章重點講解Spark編程模型的最主要抽象,第一個抽象是RDD(Resilient Distributed Dataset,彈性分布式數據集),它是一種特殊集合,支持多種來源,有容錯機制,可以被緩存,支持并行操作;Spark的第二個抽象是兩種共享變量,即支持并行計算的廣播變量和累加器。

要理解Spark,就必須理解RDD。在學習過程中,希望能時刻警醒自己,做到不自見、不自是、不自伐、不自矜。

4.1 RDD介紹

基于Spark的大數據處理平臺,建立在統一抽象的RDD之上,RDD是Spark圍繞的核心概念,也是最主要的抽象之一。對于RDD和Spark,RDD是一種具有容錯性基于內存的集群計算抽象方法,Spark則是這個抽象方法的實現。

4.1.1 RDD特征

簡單來說,Spark一切都是基于RDD的,RDD就是Spark輸入的數據,作為輸入數據的每個RDD有五個特征,其中分區、一系列的依賴關系和函數是三個基本特征,優先位置和分區策略是可選特征。

1)分區(partition):有一個數據分片列表,能夠將數據進行切分,切分后的數據能夠進行并行計算,是數據集的原子組成部分。

2)函數(compute):計算每個分片,得出一個可遍歷的結果,用于說明在父RDD上執行何種計算。

3)依賴(dependency):計算每個RDD對父RDD的依賴列表,源RDD沒有依賴,通過依賴關系描述血統(lineage)。

4)優先位置(可選):每一個分片的優先計算位置(preferred locations),比如HDFS的Block的所在位置應該是優先計算的位置。

5)分區策略(可選):描述分區模式和數據存放的位置,鍵-值對(key-value)的RDD根據哈希值進行分區,類似于MapReduce中的Paritioner接口,根據key來決定分配位置。

常用的RDD有很多種,可以說,每個Transformation操作都會產生一種RDD,這里我們以HadoopRDD、MappedRDD、FilteredRDD、JoinedRDD為例對特征進行說明,如表4-1所示。

表4-1 常用RDD特征說明

4.1.2 RDD依賴

Spark中RDD的數據結構里很重要的一個域是對父RDD的依賴,Spark中的依賴關系主要體現為兩種形式,窄依賴(narrow dependency)和寬依賴(wide dependency)。

圖4-1對窄依賴和寬依賴進行了說明。

圖4-1 窄依賴和寬依賴

1. 窄依賴

窄依賴是指父RDD的每一個分區最多被一個子RDD的分區所用,表現為一個父RDD的分區對應于一個子RDD的分區(第一類),或多個父RDD的分區對應于一個子RDD的分區(第二類),也就是說一個父RDD的一個分區不可能對應一個子RDD的多個分區。

圖4-1中,Map/Filter和Union屬于第一類,對輸入進行協同劃分(co-partitioned)的Join屬于第二類(協同劃分,可以理解為指多個父RDD的某一分區的所有key,落在子RDD的同一分區的象限,不會產生同一父RDD的某一分區,落在子RDD的兩個分區的情況)。

進一步說,子RDD的每個分區依賴于常數個父分區,與數據規模無關,輸入輸出是一對一的算子。當子RDD的每個分區依賴單個父分區時,分區結構不會發生變化,如Map、f latMap;當子RDD依賴多個父分區時,分區結構發生變化,如Union。

2.寬依賴

寬依賴是指子RDD的每個分區都依賴于所有父RDD的所有分區或多個分區,也就是說存在一個父RDD的一個分區對應一個子RDD的多個分區。

圖4-1中的groupByKey和未經過協同劃分的Join屬于寬依賴。

3.依賴關系說明

對兩種依賴關系進行如下說明:

窄依賴的RDD可以通過相同的鍵進行聯合分區,整個操作都可以在一個集群節點上進行,以流水線(pipeline)的方式計算所有父分區,不會造成網絡之間的數據混合。

寬依賴RDD會涉及數據混合,寬依賴需要首先計算好所有父分區數據,然后在節點之間進行Shuffle。

窄依賴能夠更有效地進行失效節點的恢復,重新計算丟失RDD分區的父分區,不同節點之間可以并行計算;而對于一個寬依賴關系的血統(lineage)圖,單個節點失效可能導致

這個RDD的所有祖先丟失部分分區,因而需要整體重新計算。

注意

Shuffle執行時固化操作,以及采取Persist緩存策略,可以在固化點,或者緩存點重新計算。

執行時,調度程序會檢查依賴性的類型,將窄依賴的RDD劃到一組處理當中,即Stage。寬依賴在一個執行中會跨越連續的Stage,同時需要顯式指定多個子RDD的分區。

主站蜘蛛池模板: 咸阳市| 湖南省| 普兰店市| 双江| 册亨县| 左云县| 龙南县| 于田县| 中西区| 鄂托克旗| 龙里县| 德惠市| 樟树市| 海安县| 莲花县| 沈丘县| 永仁县| 五家渠市| 浑源县| 雅江县| 宁津县| 霍邱县| 博爱县| 建宁县| 金坛市| 河池市| 铜山县| 祁连县| 孝感市| 长武县| 溧水县| 玉溪市| 平度市| 大安市| 元江| 太仓市| 宁远县| 溧水县| 阳朔县| 河北区| 高碑店市|