一、核心架構圖
二、角色分析
- 在Driver端,通過Py4j實現在Python調用Java的方法,即將用户寫得PySpark程序“映射”到JVM中,例如,用户在PySpark中實例化一個Python的SparkContext對象,最終會在JVM中實例化Scala的SparkContext對象
- 在Executor端,則不需要藉助Py4j,因為Executor端運行的Task邏輯是由Driver發過來的,那是序列化後的字節碼,雖然裏面可能包含有用户定義的Python函數或Lambda表達式,Py4j並不能實現在Java裏調用Python的方法,為了能在Executor端運行用户定義的Python函數或Lambda表達式,則需要為每個Task單獨起一個Python進程,通過socket通信方式將Python函數或Lambda表達式發給Python進程執行。
- master:主節點進程,在整個集羣中,最多隻有一個Master處於Active狀態。在使用spark-shell等交互式運行或者使用官方提供的run-example實例時,Driver運行在Master節點中;若是使用spark-submit工具進行任務的提交或者IDEA等工具開發運行任務時,Driver是運行在本地客户端的
- worker:從節點進程,類似於yarn中的NodeManager,在整個集羣中,可以有多個Worker(>0)。負責當前WorkerNode上的資源彙報、監督當前節點運行的Executor。並通過心跳機制來保持和Master的存活性連接。Executor受到Worker掌控,一個Worker啓動Executor的個數受限於機器中的CPU核數。每個Worker節點存在一個多個CoarseGrainedExecutorBackend進程,每個進程包含一個Executor對象,該對象持有一個線程池,每個線程池執行一個Task
三、核心概念
- Application:指的是用户編寫的Spark應用程序,包含了含有一個Driver功能的代碼和分佈在集羣中多個節點上運行的Executor
- Driver:運行Application的main函數,並創建SparkContext,SparkContext的目的是為了準備Spark應用程序的運行環境
- Job:一個Application可以產生多個Job,其中Job由Spark Action觸發產生。每個Job包含多個Task組成的並行計算
- Stage:每個Job會拆分為多個Task,作為一個TaskSet,成為Stage;Stage的劃分和調度是由DAGScheduler負責的。Stage分為Result Stage和Shuffle Map Stage;
- Task:Application的運行基本單位,Executor上的工作單元。其調度和管理由TaskScheduler負責
- RDD:Spark基本計算單元,是Spark最核心的東西。表示已被分區、被序列化、不可變的、有容錯機制的、能唄並行操作的數據集合
- DAGScheduler:根據Job構建基於Stage的DAG,劃分Stage依據是RDD之間的依賴關係
- TaskScheduler:將TaskSet提交給Worker運行,每個Worker運行了什麼Task於此處分配。同時還負責監控、彙報任務運行情況等
本文章為轉載內容,我們尊重原作者對文章享有的著作權。如有內容錯誤或侵權問題,歡迎原作者聯繫我們進行內容更正或刪除文章。