Spark 編程模型(上)
初識RDD
什麽是RDD?
定義:Resilient distributed datasets (RDD), an efficient, general-purpose and fault-tolerant abstraction for sharing data in cluster applications.
RDD 是只讀的。
RDD 是分區記錄的集合。
RDD 是容錯的。--- lineage RDD 是高效的。
RDD 不需要物化。---物化:進行實際的變換並最終寫入穩定的存儲器上
RDD 可以緩存的。---可指定緩存級別
RDD是spark的核心,也是整個spark的架構基礎,RDD是彈性分布式集合(Resilient Distributed Datasets)的簡稱,是分布式只讀且已分區集合對象。這些集合是彈性的,如果數據集一部分丟失,則可以對它們進行重建。
RDD接口
RDD的本質特征
RDD--partitions
Spark中將1~100的數組轉換為rdd。
通過第15行的size獲得rdd的partition的個數,此處創建rdd顯式指定定分區個數2,默認數值是這個程序所分配到的資源的cpu核的個數。
RDD-preferredLocations
返回此RDD的一個partition的數據塊信息,如果一個數據塊(block)有多個備份在返回所有備份的location地址信息:主機ip或域名。
作用:spark在進行任務調度室盡可能根據block的地址做到本地計算。
RDD-dependencies
RDD之間的依賴關系分為兩類:
● 窄依賴
每個父RDD的分區都至多被一個子RDD的分區使用,即為OneToOneDependecies。
● 寬依賴
多個子RDD的分區依賴一個父RDD的分區,即為ShuffleDependency 。例如,map操作是一種窄依賴,而join操作是一種寬依賴(除非父RDD已經基於Hash策略被劃分過了,co-partitioned)。
窄依賴相比寬依賴更高效資源消耗更少
- 允許在單個集群節點上流水線式執行,這個節點可以計算所有父級分區。例如,可以逐個元素地依次執行filter操作和map操作。
- 相反,寬依賴需要所有的父RDD數據可用並且數據已經通過類MapReduce的操作shuffle完成。
在窄依賴中,節點失敗後的恢復更加高效。
- 因為只有丟失的父級分區需要重新計算,並且這些丟失的父級分區可以並行地在不同節點上重新計算。
- 與此相反,在寬依賴的繼承關系中,單個失敗的節點可能導致一個RDD的所有先祖RDD中的一些分區丟失,導致計算的重新執行。
RDD-compute
分區計算:Spark對RDD的計算是以partition為最小單位的,並且都是對叠代器進行復合,不需要保存每次的計算結果。
RDD- partitioner
分區函數:目前spark中提供兩種分區函數:
- HashPatitioner(哈希分區)
- RangePatitioner(區域分區)
且partitioner只存在於(K,V)類型的RDD中,rdd本身決定了分區的數量。
RDD- lineage
val lines = sc.textFile("hdfs://...") // transformed RDDs val errors = lines.filter(_.startsWith("ERROR")) val messages = errors.map(_.split("\t")).map(r => r(1)) messages.cache() // action 1 messages.filter(_.contains("mysql")).count() // action 2 messages.filter(_.contains("php")).count()
RDD經過trans或action後產生一個新的RDD,RDD之間的通過lineage來表達依賴關系,lineage是rdd容錯的重要機制,rdd轉換後的分區可能在轉換前分區的節點內存中。
典型RDD的特征
不同角度看RDD
Scheduler Optimizations
以上就是博主為大家介紹的這一板塊的主要內容,這都是博主自己的學習過程,希望能給大家帶來一定的指導作用,有用的還望大家點個支持,如果對你沒用也望包涵,有錯誤煩請指出。如有期待可關註博主以第一時間獲取更新哦,謝謝!
Spark 編程模型(上)