Spark Core是什么
Spark之一行寫WordCount: sc.textFile("/home/data.txt").flatMap(_.split("/t")).map((_,1)).reduceBykey(_+_).collect
spark共有5大組件:Spark Core、Spark Streaming、SparkSQL、Spark MLlib和Spark GraphX。
spark core是spark的核心,是一個提供內存計算的框架,其他的四大框架都是基于spark core上進行計算的,所以沒有spark core,其他的框架是浮云.
Spark Core工作機制
Spark的具體流程:
1.Driver進程啟動,會有一些初始化操作,并發送請求到Master上,告知Master有一個新的Spark應用程序要執行--->
2.Master收到Spark的請求之后,會發送給Worker,進行資源的調度和分配,其實就是Executor的分配--->
3.Worker負責內存存儲RDD某個或某些partition,啟動其他進程和線程,對RDD上的partition進行版型的處理和計算--->
4.Worker啟動的進程就叫Executor,Executor開啟之后,然后Executor會向最開始的Driver進行發送請求,Driver就知道哪些Executor是為它進行服務的了--->
5.Driver會根據我們對RDD定義的操作,提交一大堆task到Executor上--->
6.Executor接到后Driver返回的task信息后,會按照task信息來啟動task的數量--->
7.task就負責執行RDD的partition進行并行的計算,也就是我們在RDD中定義的map.flatMap.reduce等,task對RDD的partition數據指定的算子操作,執行后會產生新的RDD的partition--->
8.然后新的RDD的partition就會又輪回剛剛的步驟,計算新的算子,內存迭代!
Spark Core之RDD
Spark Core的組件叫RDD;
RDD: RDD被稱為Spark的基石,它是一個彈性分布式數據集. 彈性:當內存不夠用了,可臨時放在磁盤上,內存與磁盤可以自動切換;? 分布式:分區計算;? 容錯性:發現數據丟失后,會從元數據里拿那里拿到丟失的數據,這些對于用戶都是透明的,也不會損失數據.
Spark Core其實就是在操作RDD: RDD的創建 ->RDD的轉換 ->RDD的緩存 ->RDD的行動 ->RDD的輸出.....
RDD的創建
RDD的創建分為三種: 從集合創建RDD? /? 從外部存儲創建RDD? /? 從其他創建RDD
從集合創建: Spark提供了兩種函數:parallelize和makeRDD
parallelize: 函數的源碼如下
def parallelize[T:ClassTag](seq:Seq[T],numSlices:Int?=defaultParallelism):RDD[T]
makeRDD: 函數的源碼如下
def makeRDD[T:ClassTag](seq:Seq[T],numSlices:Int?=defaultParallelism):RDD[T]
從外部存儲創建RDD: 顧名思義,外部存儲,外部存儲包括本地的文件系統,還有Hadoop支持的數據集,比如HDFS 、Hbase等
從其他創建RDD: 就是RDD通過算子轉換而來得到新的RDD;
RDD處理數據的函數
RDD為什么說是Spark的基石呢?
答:因為它的底層封裝了大量的易用,強大的處理數據的函數庫
下面只是大量函數其中的冰山一角.......
sollect: 將RDD轉換成函數數組輸出
map:將函數應用于RDD中的每一元素,并返回一個新的RDD
filter: 通過提供的產生boolean條件的表達式來返回符合結果為True的新RDD
flatMap: 將函數應用于RDD中的每一項,并每一項都成了集合,,再將所有集合壓成一個大集合
union: 將兩個RDD中的元素進行合并,返回一個新的RDD
intersection: 求兩個RDD元素的交集,當作一個新的RDD返回
distinct: 對RDD中的元素去重
reduceByKey: 對鍵相同的value進行合并,這個用的特別多
aggregateByKey: 建了三個分區,找出最大的,相加操作,看起來很多很長,其實是一個侮辱智商的題目..下面那張圖解釋這個的過程...
下次再加...
Spark Core中的一些名詞
Caching: 把RDD緩存到內存,提高處理計算效率,用于重復讀寫的數據
Cluster Manager:在集群上獲取資源的外部服務,分別有Standalone, Spark原生的資源管理,Apache Mesos, 和Hadoop Mapreduce兼容性良好的資源調度框架。
Application:用戶編寫的應用應用程序。
Driver:Application中運行main函數并創建的SparkContext, 創建SparkContext的目的是和集群的ClusterManager通訊,進行資源的申請、任務的分配和監控等。所以,可以用SparkContext代表Driver。
Worker:集群中可以運行Application代碼的節點。
Executor:某個Application在Worker上面的一個進程,該進程負責執行某些Task,并負責把數據存在內存或者磁盤上。每個Application都各自有一批屬于自己的Executor。
Task:被送到Executor執行的工作單元,和Hadoop MapReduce中的MapTask和ReduceTask一樣,是運行Application的基本單位。多個Task組成一個Stage,而Task的調度和管理由TaskScheduler負責。
Job:包含多個Task組成的并行計算,往往由Spark Action觸發產生。一個Application可以產生多個Job。
Stage:每個Job的Task被拆分成很多組Task, 作為一個TaskSet,命名為Stage。Stage的調度和劃分由DAGScheduler負責。Stage又分為Shuffle Map Stage和Result Stage兩種。Stage的邊界就在發生Shuffle的地方。
RDD:Spark的基本數據操作抽象,可以通過一系列算子進行操作。RDD是Spark最核心的東西,可以被分區、被序列化、不可變、有容錯機制,并且能并行操作的數據集合。存儲級別可以是內存,也可以是磁盤。
DAGScheduler:根據Job構建基于Stage的DAG(有向無環任務圖),并提交Stage給TaskScheduler。
TaskScheduler:將Stage提交給Worker(集群)運行,每個Executor運行什么在此分配。
共享變量:Spark Application在整個運行過程中,可能需要一些變量在每個Task中都使用,共享變量用于實現該目的。Spark有兩種共享變量:一種緩存到各個節點的廣播變量;一種只支持加法操作,實現求和的累加變量。
寬依賴:或稱為ShuffleDependency, 寬依賴需要計算好所有父RDD對應分區的數據,然后在節點之間進行Shuffle。
窄依賴:或稱為NarrowDependency,指某個RDD,其分區partition x最多被其子RDD的一個分區partion y依賴。窄依賴都是Map任務,不需要發生shuffle。因此,窄依賴的Task一般都會被合成在一起,構成一個Stage。