Spark 基礎
Apache Spark? is a unified analytics engine for large-scale data processing.
ApacheSpark?是用于大規(guī)模數(shù)據(jù)處理的統(tǒng)一分析引擎。
ClusterManager:在Standalone模式中即為Master(主節(jié)點)抹竹,控制整個集群线罕,監(jiān)控Worker。在YARN模式中為資源管理器窃判。
Driver:運行Application的main()函數(shù)并創(chuàng)建SparkContext钞楼。
Worker:從節(jié)點,負責控制計算節(jié)點袄琳,啟動Executor或Driver询件。在YARN模式中為NodeManager燃乍,負責計算節(jié)點的控制
Executor:執(zhí)行器,在worker node上執(zhí)行任務的組件宛琅、用于啟動線程池運行任務刻蟹。每個Application擁有獨立的一組Executors。
SparkContext:整個應用的上下文嘿辟,控制應用的生命周期
在這個大規(guī)模數(shù)據(jù)處理 的基礎數(shù)據(jù)結(jié)構(gòu)座咆。
RDD:Spark的基本計算單元,一組RDD可形成執(zhí)行的有向無環(huán)圖RDD Graph
什么是 RDD
全稱叫做彈性分布式數(shù)據(jù)集(Resilient Distributed Datasets)仓洼,它是一種分布式的內(nèi)存抽象介陶,表示一個只讀的記錄分區(qū)的集合,它只能通過其他RDD轉(zhuǎn)換而創(chuàng)建色建。
特點:
-
分區(qū)
如上圖所示哺呜,RDD邏輯上是分區(qū)的,每個分區(qū)的數(shù)據(jù)是抽象存在的箕戳,計算的時候會通過一個compute函數(shù)得到每個分區(qū)的數(shù)據(jù)某残。
如果RDD是通過已有的文件系統(tǒng)構(gòu)建,則compute函數(shù)是讀取指定文件系統(tǒng)中的數(shù)據(jù)
如果RDD是通過其他RDD轉(zhuǎn)換而來陵吸,則compute函數(shù)是執(zhí)行轉(zhuǎn)換邏輯將其他RDD的數(shù)據(jù)進行轉(zhuǎn)換
-
只讀
如下圖所示玻墅,RDD是只讀的,要想改變RDD中的數(shù)據(jù)壮虫,只能在現(xiàn)有的RDD基礎上創(chuàng)建新的RDD澳厢。
RDD 表示只讀的分區(qū)的數(shù)據(jù)集炬丸,對RDD進行改動垫桂,只能通過RDD的轉(zhuǎn)換操作译株,由一個RDD得到一個新的RDD齐媒,新的RDD包含了從其他RDD衍生所必需的信息。
由一個RDD轉(zhuǎn)換到另一個RDD敏簿,可以通過豐富的操作算子實現(xiàn)锣吼,不再像MapReduce那樣只能寫map和reduce了女嘲,如下圖所示募狂。
RDD的操作算子包括兩類办素,一類叫做transformations,它是用來將RDD進行轉(zhuǎn)化祸穷,構(gòu)建RDD的血緣關(guān)系性穿;另一類叫做actions,它是用來觸發(fā)RDD的計算粱哼,得到RDD的相關(guān)計算結(jié)果或者將RDD保存的文件系統(tǒng)中季二。下圖是RDD所支持的操作算子列表檩咱。
Transformation返回值還是一個RDD揭措。它使用了鏈式調(diào)用的設計模式胯舷,對一個RDD進行計算后,變換成另外一個RDD绊含,然后這個RDD又可以進行另外一次轉(zhuǎn)換桑嘶。這個過程是分布式的
Action返回值不是一個RDD。它要么是一個Scala的普通集合躬充,要么是一個值逃顶,要么是空,最終或返回到Driver程序充甚,或把RDD寫入到文件系統(tǒng)中
Transformations轉(zhuǎn)換操作以政,返回值還是一個 RDD,如 map伴找、 filter盈蛮、 union;
Actions行動操作技矮,返回結(jié)果或把RDD持久化起來抖誉,如 count、 collect衰倦、 save袒炉。
-
依賴
RDDs之間存在依賴,RDD的執(zhí)行是按照血緣關(guān)系延時計算的樊零。如果血緣關(guān)系較長我磁,可以通過持久化(checkpoint)RDD來切斷血緣關(guān)系。
通過RDDs之間的這種依賴關(guān)系驻襟,一個任務流可以描述為DAG(有向無環(huán)圖)十性,如下圖所示,在實際執(zhí)行過程中寬依賴對應于Shuffle(圖中的reduceByKey和join)塑悼,窄依賴中的所有轉(zhuǎn)換操作可以通過類似于管道的方式一氣呵成執(zhí)行(圖中map和union可以一起執(zhí)行)劲适。
-
緩存
如果在應用程序中多次使用同一個RDD,可以將該RDD緩存起來厢蒜,該RDD只有在第一次計算的時候會根據(jù)血緣關(guān)系得到分區(qū)的數(shù)據(jù)霞势,在后續(xù)其他地方用到該RDD的時候,會直接從緩存處取而不用再根據(jù)血緣關(guān)系計算斑鸦,這樣就加速后期的重用愕贡。如下圖所示,RDD-1經(jīng)過一系列的轉(zhuǎn)換后得到RDD-n并保存到hdfs巷屿,RDD-1在這一過程中會有個中間結(jié)果固以,如果將其緩存到內(nèi)存,那么在隨后的RDD-1轉(zhuǎn)換到RDD-m這一過程中,就不會計算其之前的RDD-0了憨琳。
緩存方法: cache诫钓,persist
優(yōu)先位置(preferred location)
每個分片的優(yōu)先計算位置,Spark在進行任務調(diào)度的時候篙螟,會盡可能滴將計算任務分配到所需數(shù)據(jù)塊的存儲位置菌湃,滿足“移動計算優(yōu)先移動數(shù)據(jù)”的理念。
RDD 持久化(checkpoint)
雖然RDD的血緣關(guān)系天然地可以實現(xiàn)容錯遍略,當RDD的某個分區(qū)數(shù)據(jù)失敗或丟失惧所,可以通過血緣關(guān)系重建。但是對于長時間迭代型應用來說绪杏,隨著迭代的進行下愈,RDDs之間的血緣關(guān)系會越來越長,一旦在后續(xù)迭代過程中出錯蕾久,則需要通過非常長的血緣關(guān)系去重建驰唬,勢必影響性能。
為此腔彰,RDD支持checkpoint將數(shù)據(jù)保存到持久化的存儲中叫编,這樣就可以切斷之前的血緣關(guān)系,因為checkpoint后的RDD不需要知道它的父RDDs了霹抛,它可以從checkpoint處拿到數(shù)據(jù)搓逾。
小結(jié)
RDD 的屬性特征:分區(qū)、函數(shù)杯拐、依賴霞篡、優(yōu)先位置、分區(qū)策略端逼;
RDD 緩存:持久化等級朗兵、主動持久化、自動持久化顶滩;
RDD 的操作:Transformation余掖、Action;
RDD 依賴:窄依賴礁鲁、寬依賴盐欺。