一娄昆、Spark包括什么
spark的核心是Spark Core翅溺,其中上面的Spark Sql對(duì)接的是Hive等結(jié)構(gòu)化查詢吐葱,Spark Streaming是對(duì)接的流式計(jì)算耐量,后面的那兩個(gè)也是主要用在科學(xué)任務(wù)中,但是他們的基礎(chǔ)都是spark core缩擂,而Spark core的核心就是RDD操作鼠冕,RDD的操作重要的就是算子,也就是說(shuō)胯盯,掌握了算子基本上就掌握了spark的基礎(chǔ)懈费。
二、RDD
1博脑、是什么憎乙?
? 簡(jiǎn)單的一句話就是,為用戶封裝了底層對(duì)數(shù)據(jù)的復(fù)雜抽象和處理趋厉,給用戶提供了對(duì)數(shù)據(jù)轉(zhuǎn)換寨闹,求值等操作。
RDD的全稱是君账,Resilient Distributed Dataset,彈性分布式數(shù)據(jù)集沈善,彈性體現(xiàn)在哪乡数?本人認(rèn)為,彈性最主要的是體現(xiàn)在RDD能夠通過(guò)依賴形成DGA闻牡,DGA就確定了RDD的一系列操作的集合净赴,就相當(dāng)于一套模板,而分布式就體現(xiàn)在可以將數(shù)據(jù)分布在各個(gè)分區(qū)上罩润,能提高并行度玖翅,當(dāng)然這可以動(dòng)態(tài)調(diào)整,那么割以,在每個(gè)分區(qū)上執(zhí)行一系列DGA的操作金度,如果是每個(gè)RDD都是窄依賴,那么就不用做聚合严沥,那么這個(gè)速度是非巢录快的,所以說(shuō)消玄,RDD的彈性和分布式特點(diǎn)很顯而易見(jiàn)跟伏。
2丢胚、做了什么?主要通過(guò)算子實(shí)現(xiàn)
? ? ?
3受扳、特性:
? ? ? ? 不可變(只讀)携龟,RDD一旦創(chuàng)建,內(nèi)容是不可以變的勘高,如果想修改內(nèi)容就會(huì)創(chuàng)建一個(gè)新的RDD骨宠,其實(shí)和java中的String很像、
? ? ? ? 可分區(qū)相满,RDD的數(shù)據(jù)存儲(chǔ)在Executor中层亿,一個(gè)Exeutor有多個(gè)分區(qū),RDD的分區(qū)數(shù)可以根據(jù)需求動(dòng)態(tài)改變立美,在Spark中匿又,分區(qū)的多少就是并行度是多少。
? ? ? ? RDD的彈性建蹄,? 表現(xiàn)在存儲(chǔ)碌更、分區(qū)、計(jì)算以及容錯(cuò)洞慎,? 彈性指的是什么呢痛单?其實(shí)是伸縮性和容錯(cuò)性的體現(xiàn)
? ? ? ? 依賴,也就是劲腿,多個(gè)RDD之間可以構(gòu)成先后順序旭绒,形成DGA圖,從而形成一系列操作
? ? ? ? 緩存焦人,因?yàn)镽DD是只讀的挥吵,所以如果是多個(gè)程序使用同一個(gè)RDD,則可以將RDD先緩存下來(lái)花椭,待日后重用
? ? ? ? 檢查點(diǎn)忽匈,checkpoint,RDD支持checkpoint將數(shù)據(jù)保存到持久化的存儲(chǔ)中矿辽,這樣就可以切斷之前的血緣關(guān)系丹允,因?yàn)閏heckpoint后的RDD不需要知道它的父RDDs了,它可以從checkpoint處拿到數(shù)據(jù)袋倔。
? 下面是RDD特性詳解
4雕蔽、特性之 彈性
? 1)? 存儲(chǔ)彈性:? 自動(dòng)進(jìn)行內(nèi)存和磁盤數(shù)據(jù)存儲(chǔ)的切換
? ? ? ? ? Spark優(yōu)先把數(shù)據(jù)放到內(nèi)存中,如果內(nèi)存放不下奕污,就會(huì)放到磁盤里面萎羔,程序進(jìn)行自動(dòng)的存儲(chǔ)切換
? ? 2)? 容錯(cuò)彈性:基于血統(tǒng)的高效容錯(cuò)機(jī)制---很重要
? ? 在RDD進(jìn)行轉(zhuǎn)換和動(dòng)作的時(shí)候,會(huì)形成RDD的Lineage依賴鏈碳默,當(dāng)某一個(gè)RDD失效的時(shí)候贾陷,可以通過(guò)重新計(jì)算上游的RDD來(lái)重新生成丟失的RDD數(shù)據(jù)缘眶。
? ? 3)數(shù)據(jù)分片的高度彈性
? ? 可以根據(jù)業(yè)務(wù)的特征,動(dòng)態(tài)調(diào)整數(shù)據(jù)分片的個(gè)數(shù)髓废,提升整體的應(yīng)用執(zhí)行效率巷懈。
? ? RDD全稱叫做彈性分布式數(shù)據(jù)集(Resilient Distributed Datasets),它是一種分布式的內(nèi)存抽象慌洪,表示一個(gè)只讀的記錄分區(qū)的集合顶燕,它只能通過(guò)其他RDD轉(zhuǎn)換而創(chuàng)建,為此冈爹,RDD支持豐富的轉(zhuǎn)換操作(如map, join, filter, groupBy等)涌攻,通過(guò)這種轉(zhuǎn)換操作,新的RDD則包含了如何從其他RDDs衍生所必需的信息频伤,所以說(shuō)RDDs之間是有依賴關(guān)系的恳谎。基于RDDs之間的依賴憋肖,RDDs會(huì)形成一個(gè)有向無(wú)環(huán)圖DAG因痛,該DAG描述了整個(gè)流式計(jì)算的流程,實(shí)際執(zhí)行的時(shí)候岸更,RDD是通過(guò)血緣關(guān)系(Lineage)一氣呵成的鸵膏,即使出現(xiàn)數(shù)據(jù)分區(qū)丟失,也可以通過(guò)血緣關(guān)系重建分區(qū)怎炊,總結(jié)起來(lái)谭企,基于RDD的流式計(jì)算任務(wù)可描述為:從穩(wěn)定的物理存儲(chǔ)(如分布式文件系統(tǒng))中加載記錄,記錄被傳入由一組確定性操作構(gòu)成的DAG结胀,然后寫回穩(wěn)定存儲(chǔ)赞咙。另外RDD還可以將數(shù)據(jù)集緩存到內(nèi)存中,使得在多個(gè)操作之間可以重用數(shù)據(jù)集糟港,基于這個(gè)特點(diǎn)可以很方便地構(gòu)建迭代型應(yīng)用(圖計(jì)算、機(jī)器學(xué)習(xí)等)或者交互式數(shù)據(jù)分析應(yīng)用院仿〗崭В可以說(shuō)Spark最初也就是實(shí)現(xiàn)RDD的一個(gè)分布式系統(tǒng),后面通過(guò)不斷發(fā)展壯大成為現(xiàn)在較為完善的大數(shù)據(jù)生態(tài)系統(tǒng)歹垫,簡(jiǎn)單來(lái)講剥汤,Spark-RDD的關(guān)系類似于Hadoop-MapReduce關(guān)系。
? ? 4)計(jì)算彈性
? ? Task如果失敗會(huì)自動(dòng)進(jìn)行特定次數(shù)的重試? 和MR很像
? ? ? RDD的計(jì)算任務(wù)如果運(yùn)行失敗排惨,會(huì)自動(dòng)進(jìn)行任務(wù)的重新計(jì)算吭敢,默認(rèn)次數(shù)是4次。
? ? Stage如果失敗會(huì)自動(dòng)進(jìn)行特定次數(shù)的重試
? ? ? 如果Job的某個(gè)Stage階段計(jì)算失敗暮芭,框架也會(huì)自動(dòng)進(jìn)行任務(wù)的重新計(jì)算鹿驼,默認(rèn)次數(shù)也是4次欲低。
? Checkpoint和Persist可主動(dòng)或被動(dòng)觸發(fā)
? ? RDD可以通過(guò)Persist持久化將RDD緩存到內(nèi)存或者磁盤,當(dāng)再次用到該RDD時(shí)直接讀取就行畜晰。也可以將RDD進(jìn)行檢查點(diǎn)砾莱,檢查點(diǎn)會(huì)將數(shù)據(jù)存儲(chǔ)在HDFS中,該RDD的所有父RDD依賴都會(huì)被移除凄鼻。
? ? 數(shù)據(jù)調(diào)度彈性
? ? Spark把這個(gè)JOB執(zhí)行模型抽象為通用的有向無(wú)環(huán)圖DAG腊瑟,可以將多Stage的任務(wù)串聯(lián)或并行執(zhí)行,調(diào)度引擎自動(dòng)處理Stage的失敗以及Task的失敗块蚌。
5闰非、特性之 分區(qū)
? ? ? 分區(qū)是RDD內(nèi)部并行計(jì)算的一個(gè)計(jì)算單元,RDD的數(shù)據(jù)集在邏輯上被劃分為多個(gè)分片峭范,每一個(gè)分片稱為分區(qū)财松,分區(qū)的格式?jīng)Q定了并行計(jì)算的粒度,而每個(gè)分區(qū)的數(shù)值計(jì)算都是在一個(gè)任務(wù)中進(jìn)行的虎敦,因此任務(wù)的個(gè)數(shù)游岳,也是由RDD(準(zhǔn)確來(lái)說(shuō)是作業(yè)最后一個(gè)RDD)的分區(qū)數(shù)決定。? ?
RDD分區(qū)的一個(gè)分區(qū)原則:盡可能是得分區(qū)的個(gè)數(shù)等于集群核心數(shù)目
下面我們僅討論Spark默認(rèn)的分區(qū)個(gè)數(shù)其徙,這里分別就parallelize和textFile具體分析其默認(rèn)的分區(qū)數(shù)
無(wú)論是本地模式胚迫、Standalone模式、YARN模式或Mesos模式唾那,我們都可以通過(guò)spark.default.parallelism來(lái)配置其默認(rèn)分區(qū)個(gè)數(shù)访锻,若沒(méi)有設(shè)置該值,則根據(jù)不同的集群環(huán)境確定該值
本地模式:默認(rèn)為本地機(jī)器的CPU數(shù)目闹获,若設(shè)置了local[N],則默認(rèn)為N
Apache Mesos:默認(rèn)的分區(qū)數(shù)為8
Standalone或YARN:默認(rèn)取集群中所有核心數(shù)目的總和期犬,或者2,取二者的較大值
結(jié)論:
對(duì)于parallelize來(lái)說(shuō)避诽,沒(méi)有在方法中的指定分區(qū)數(shù)龟虎,則默認(rèn)為spark.default.parallelism
對(duì)于textFile來(lái)說(shuō),沒(méi)有在方法中的指定分區(qū)數(shù)沙庐,則默認(rèn)為min(defaultParallelism,2)鲤妥,而defaultParallelism對(duì)應(yīng)的就是spark.default.parallelism。如果是從hdfs上面讀取文件拱雏,其分區(qū)數(shù)為文件分片數(shù)(128MB/片)
分區(qū)數(shù)就一個(gè)原則棉安,默認(rèn)盡可能的使用能用到的CPU等計(jì)算資源
? ? KV型自定義分區(qū)器需要繼承 Partitioner
class CustomerPar(par:Int) extends org.apache.spark.Partitioner {
? override def numPartitions:Int = par
? override def getPartition(key: Any):Int = {
? ? ? key.toString.toInt%par
? }
6、RDD特性之 依賴
RDDs通過(guò)操作算子進(jìn)行轉(zhuǎn)換铸抑,轉(zhuǎn)換得到的新RDD包含了從其他RDDs衍生所必需的信息贡耽,RDDs之間維護(hù)著這種血緣關(guān)系,也稱之為依賴。如下圖所示蒲赂,依賴包括兩種阱冶,一種是窄依賴,RDDs之間分區(qū)是一一對(duì)應(yīng)的凳宙,另一種是寬依賴熙揍,下游RDD的每個(gè)分區(qū)與上游RDD(也稱之為父RDD)的每個(gè)分區(qū)都有關(guān),是多對(duì)多的關(guān)系氏涩。
? ? 通過(guò)RDDs之間的這種依賴關(guān)系届囚,一個(gè)任務(wù)流可以描述為DAG(有向無(wú)環(huán)圖),如下圖所示是尖,在實(shí)際執(zhí)行過(guò)程中寬依賴對(duì)應(yīng)于Shuffle(圖中的reduceByKey和join)意系,窄依賴中的所有轉(zhuǎn)換操作可以通過(guò)類似于管道的方式一氣呵成執(zhí)行(圖中map和union可以一起執(zhí)行)。
7饺汹、特性之? 緩存
? 如果在應(yīng)用程序中多次使用同一個(gè)RDD蛔添,可以將該RDD緩存起來(lái),該RDD只有在第一次計(jì)算的時(shí)候會(huì)根據(jù)血緣關(guān)系得到分區(qū)的數(shù)據(jù)兜辞,在后續(xù)其他地方用到該RDD的時(shí)候迎瞧,會(huì)直接從緩存處取而不用再根據(jù)血緣關(guān)系計(jì)算,這樣就加速后期的重用逸吵。如下圖所示凶硅,RDD-1經(jīng)過(guò)一系列的轉(zhuǎn)換后得到RDD-n并保存到hdfs,RDD-1在這一過(guò)程中會(huì)有個(gè)中間結(jié)果扫皱,如果將其緩存到內(nèi)存足绅,那么在隨后的RDD-1轉(zhuǎn)換到RDD-m這一過(guò)程中,就不會(huì)計(jì)算其之前的RDD-0了韩脑。
8氢妈、特性之 checkpoint
雖然RDD的血緣關(guān)系天然地可以實(shí)現(xiàn)容錯(cuò),當(dāng)RDD的某個(gè)分區(qū)數(shù)據(jù)失敗或丟失段多,可以通過(guò)血緣關(guān)系重建首量。但是對(duì)于長(zhǎng)時(shí)間迭代型應(yīng)用來(lái)說(shuō),隨著迭代的進(jìn)行进苍,RDDs之間的血緣關(guān)系會(huì)越來(lái)越長(zhǎng)蕾总,一旦在后續(xù)迭代過(guò)程中出錯(cuò),則需要通過(guò)非常長(zhǎng)的血緣關(guān)系去重建琅捏,勢(shì)必影響性能。為此递雀,RDD支持checkpoint將數(shù)據(jù)保存到持久化的存儲(chǔ)中柄延,這樣就可以切斷之前的血緣關(guān)系,因?yàn)閏heckpoint后的RDD不需要知道它的父RDDs了,它可以從checkpoint處拿到數(shù)據(jù)搜吧。
? ? ? ? 也就說(shuō)市俊,checkpoint能夠?qū)?shù)據(jù)進(jìn)行持久化,而且最關(guān)鍵的滤奈,也就是和緩存最大的區(qū)別就是摆昧,checkpoint可以不用關(guān)心之前的RDD的依賴連,用到數(shù)據(jù)的時(shí)候蜒程,直接拿數(shù)據(jù)绅你,而上面介紹的緩存,必須存在這個(gè) 依賴連昭躺,一般某個(gè)executor宕機(jī)忌锯,那之前的RDD鏈就找不到,同時(shí)在cache中的數(shù)據(jù)也會(huì)請(qǐng)清除领炫,也就是偶垮,checkpoint具有更高的容錯(cuò)性。
怎么設(shè)置帝洪?
? 1似舵、通過(guò)sc設(shè)定檢查點(diǎn)的地址, jar包內(nèi)有效
? ? ? sc.setCheckpointDir("hdfs://master01:9000/checkpoint")
? 2葱峡、rdd調(diào)用checkpoint? ? ? rdd.checkpoint
持久機(jī)制策略
另外解析:https://blog.csdn.net/imbetter/article/details/80023338
9砚哗、rdd的任務(wù)切分和Stage
? ? ? ? ? 1、一個(gè)jar包就是一個(gè)應(yīng)用程序
? ? ? ? ? 2族沃、一個(gè)行動(dòng)操作就會(huì)觸發(fā)一個(gè)job
? ? ? ? ? 3频祝、一個(gè)job包含多個(gè)stage,這些stage的運(yùn)行通過(guò)有向無(wú)環(huán)圖來(lái)運(yùn)行
? ? ? ? ? 4脆淹、一個(gè)stage中包含多個(gè)task常空,一個(gè)task處理一個(gè)分區(qū)的數(shù)據(jù),所以分區(qū)數(shù)又叫并行度盖溺,
? ? ? ? ? ? spark中有兩類task漓糙,一類是shuffleMapTask,一類是resultTask烘嘱,詳見(jiàn)https://blog.csdn.net/a1043498776/article/details/54889922
為什么要有stage這個(gè)概念呢昆禽? 其實(shí)這也是spark的高明之處,spark怎么才能實(shí)現(xiàn)MR中的map和reduce蝇庭,怎么控制呢醉鳖?通過(guò)使用stage
執(zhí)行代碼從前往后執(zhí)行,劃分stage是從后往前劃分哮内,從最后往前掃描代碼盗棵,當(dāng)遇到寬依賴時(shí),將寬依賴前面的所有代碼劃分為一個(gè)stage。
總結(jié):
1纹因、給定一個(gè)RDD可以獲得什么信息喷屋?
? ? ? ? 1、分區(qū)數(shù)以及分區(qū)方式瞭恰;2屯曹、由父RDDs衍生而來(lái)的相關(guān)依賴信息;3惊畏、計(jì)算每個(gè)分區(qū)的數(shù)據(jù)恶耽,計(jì)算步驟為:1)如果被緩存,則從緩存中取的分區(qū)的數(shù)據(jù)陕截;2)如果被checkpoint驳棱,則從checkpoint處恢復(fù)數(shù)據(jù);3)根據(jù)血緣關(guān)系計(jì)算分區(qū)的數(shù)據(jù)农曲。
2社搅、本文主要是圍繞著RDD進(jìn)行講述, 主要是講述了RDD的特性乳规,總的來(lái)說(shuō)形葬,rdd基本特性就是彈性和分區(qū),一個(gè)是提供了高容錯(cuò)性的DGA暮的, 一個(gè)是提供了rdd的并行度笙以,而緩存和checkpoint是從性能和安全上提升rdd,兩者是相結(jié)合使用的冻辩,既有區(qū)別又要共同使用猖腕,要記住兩個(gè)的區(qū)別是什么,以及持久化的策略是什么恨闪。
其次本文還簡(jiǎn)述了一個(gè)rdd的執(zhí)行倘感,其中先從spark任務(wù)中說(shuō)明了任務(wù)的切分和執(zhí)行的顆粒度以及順序,當(dāng)然咙咽,整個(gè)任務(wù)的執(zhí)行的最小單元就是rdd老玛,執(zhí)行的結(jié)果無(wú)非就是從一個(gè)rdd變成新的rdd,然后從一個(gè)任務(wù)task變成另個(gè)task钧敞,在從一個(gè)stage轉(zhuǎn)變成另一個(gè)stage蜡豹,這才是一個(gè)job的結(jié)果,
當(dāng)然溉苛,從stage的劃分到rdd形成的DGA都離不開(kāi)依賴镜廉,兩種依賴的概念要理解。