Spark 編程模型(上)
從Hadoop MR到Spark
回顧hadoop—mapreduce計(jì)算過(guò)程
MR VS Spark
Spark編程模型
核心概念
注意:對(duì)比mr里的概念來(lái)學(xué)習(xí)
Spark Application的組成
Spark應(yīng)用程序的組成
● Driver
● Executor
注意:對(duì)照helloworld來(lái)思考
Spark Application基本概念
Spark Application編程模型
Spark 應(yīng)用程序編程模型
– Driver Program ( SparkContext )
– Executor ( RDD 操作)
● 輸入Base-> RDD
● Transformation RDD->RDD
● Action RDD->driver or Base
● 緩存 Persist or cache()
– 共享變量
● broadcast variables(廣播變量)
● accumulators(累加器)
回顧Spark Hello World
初識(shí)RDD
什么是RDD
定義:Resilient distributed datasets (RDD), an efficient, general-purpose and fault-tolerant abstraction for sharing data in cluster applications.
RDD 是只讀的。
RDD 是分區(qū)記錄的集合。
RDD 是容錯(cuò)的。--- lineage
RDD 是高效的。
RDD 不需要物化。---物化:進(jìn)行實(shí)際的變換并最終寫(xiě)入穩(wěn)定的存儲(chǔ)器上
RDD 可以緩存的。---課指定緩存級(jí)別
RDD是spark的核心,也是整個(gè)spark的架構(gòu)基礎(chǔ),RDD是彈性分布式集合(Resilient Distributed Datasets)的簡(jiǎn)稱,是分布式只讀且已分區(qū)集合對(duì)象。這些集合是彈性的,如果數(shù)據(jù)集一部分丟失,則可以對(duì)它們進(jìn)行重建。
RDD接口
RDD的本質(zhì)特征
RDD--partitions
Spark中將1~100的數(shù)組轉(zhuǎn)換為rdd
通過(guò)第15行的size獲得rdd的partition的個(gè)數(shù),此處創(chuàng)建rdd顯式指定定分區(qū)個(gè)數(shù)2,默認(rèn)數(shù)值是這個(gè)程序所分配到的資源的cpu核的個(gè)數(shù)
RDD-preferredLocations
返回此RDD的一個(gè)partition的數(shù)據(jù)塊信息,如果一個(gè)數(shù)據(jù)塊(block)有多個(gè)備份在返回所有備份的location地址信息
主機(jī)ip或域名
作用:spark在進(jìn)行任務(wù)調(diào)度室盡可能根據(jù)block的地址做到本地計(jì)算
RDD-dependencies
RDD之間的依賴關(guān)系分為兩類:
● 窄依賴
每個(gè)父RDD的分區(qū)都至多被一個(gè)子RDD的分區(qū)使用,即為OneToOneDependecies;
● 寬依賴
多個(gè)子RDD的分區(qū)依賴一個(gè)父RDD的分區(qū),即為ShuffleDependency 。例如,map操作是一種窄依賴,而join操作是一種寬依賴(除非父RDD已經(jīng)基于Hash策略被劃分過(guò)了,co-partitioned)
窄依賴相比寬依賴更高效資源消耗更少
允許在單個(gè)集群節(jié)點(diǎn)上流水線式執(zhí)行,這個(gè)節(jié)點(diǎn)可以計(jì)算所有父級(jí)分區(qū)。例如,可以逐個(gè)元素地依次執(zhí)行filter操作和map操作。
相反,寬依賴需要所有的父RDD數(shù)據(jù)可用并且數(shù)據(jù)已經(jīng)通過(guò)類MapReduce的操作shuffle完成。
在窄依賴中,節(jié)點(diǎn)失敗后的恢復(fù)更加高效。
因?yàn)橹挥衼G失的父級(jí)分區(qū)需要重新計(jì)算,并且這些丟失的父級(jí)分區(qū)可以并行地在不同節(jié)點(diǎn)上重新計(jì)算。
與此相反,在寬依賴的繼承關(guān)系中,單個(gè)失敗的節(jié)點(diǎn)可能導(dǎo)致一個(gè)RDD的所有先祖RDD中的一些分區(qū)丟失,導(dǎo)致計(jì)算的重新執(zhí)行。
RDD-compute
分區(qū)計(jì)算
Spark對(duì)RDD的計(jì)算是以partition為最小單位的,并且都是對(duì)迭代器進(jìn)行復(fù)合,不需要保存每次的計(jì)算結(jié)果
RDD- partitioner
分區(qū)函數(shù):目前spark中提供兩種分區(qū)函數(shù):
HashPatitioner(哈希分區(qū))
RangePatitioner(區(qū)域分區(qū))
且partitioner只存在于(K,V)類型的RDD中,rdd本身決定了分區(qū)的數(shù)量。
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經(jīng)過(guò)trans或action后產(chǎn)生一個(gè)新的RDD,RDD之間的通過(guò)lineage來(lái)表達(dá)依賴關(guān)系,lineage是rdd容錯(cuò)的重要機(jī)制,rdd轉(zhuǎn)換后的分區(qū)可能在轉(zhuǎn)換前分區(qū)的節(jié)點(diǎn)內(nèi)存中
典型RDD的特征
不同角度看RDD
Scheduler Optimizations
分布式 spark 緩存 大數(shù)據(jù)
版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實(shí)的內(nèi)容,請(qǐng)聯(lián)系我們jiasou666@gmail.com 處理,核實(shí)后本網(wǎng)站將在24小時(shí)內(nèi)刪除侵權(quán)內(nèi)容。