1.Spark的集羣模式node
1.1 集羣中的組件apache
1.1.1 driver 後端
一個Spark應用自己在集羣中是做爲一個獨立進程運行的.它在main程序中經過SparkContext來進行協調.這個獨立進程就是driver端瀏覽器
1.1.2 executor緩存
爲了運行在集羣上.driver端的SparkContext能夠鏈接至幾種集羣調度器(Cluster Manager)(StandAlone,Mesos,YARN等).安全
這些集羣調度器會分配資源.一旦分配成功,Spark就會獲取集羣中的用於執行的資源(Executor 進程).這些Executor進程能夠運行計算和存儲數據.服務器
接下來,SparkContext會將應用程序代碼(jar,或者Python文件)發送給Executor用以執行網絡
1.2 一些Spark架構上的重要點多線程
i).每一個應用獲取到的executor進程,會一直持續到整個應用的生命週期結束.而且在executor的內部,會以多線程的形式運行多個任務(Task)架構
優點是每一個應用之間相互隔離,在每一個應用的driver調度它本身的Task,而不一樣應用的task運行在不一樣的executor(也表明不一樣的JVM)上
劣勢是除非將數據寫在一個第三方中,不然不一樣的Spark應用是不能實現數據共享的
ii).Spark應用自己不知道其集羣調度器是什麼只要Spark能拿到executor並最終創建鏈接.它不關心這個executor是Mesos或者YARN調度的
iii).由於driver的中心地位,在Spark應用的整個生命週期中.driver必須保持對全部的executor的網絡尋址.以監聽和接收來自executor的鏈接請求
iv).由於driver負責調度集羣上的任務(Task),更好的方式應該是在相同的局域網中靠近 worker 的節點上運行。
若是您不喜歡發送請求到遠程的集羣,倒不如打開一個 RPC 至 driver 並讓它就近提交操做而不是從很遠的 worker 節點上運行一個 driver
1.3 Spark集羣的術語
Application | 用戶構建在 Spark 上的程序。由集羣上的一個 driver 程序和多個 executor 組成 |
Application jar | 一個包含用戶 Spark 應用的 Jar.(用戶的 Jar 應該沒有包括 Hadoop 或者 Spark 庫,由於它們將在運行時添加) |
Driver program | 該進程運行應用的 main() 方法而且建立了 SparkContext |
Cluster manager | 一個外部的用於獲取集羣上資源的服務。(例如,Standlone Manager,Mesos,YARN) |
Deploy mode | 根據 driver 程序運行的地方區別.Cluster模式:driver運行與集羣以內. Client模式:driver由提交者在集羣以外自行建立 |
Worker node | 任何在集羣中能夠運行應用代碼的節點 |
Executor | 一個爲了在 worker 節點上的應用而啓動的進程,它運行 task 而且將數據保持在內存中或者硬盤存儲。每一個應用有它本身的 Executor |
Task | 任務.一個將要被髮送到 Executor 中的工做單元. |
Job | 做業.一個由多個任務組成的並行計算,而且能從 Spark action 中獲取響應(例如 save , collect ); 好比action,對用戶來講可見的基本都是Job |
Stage | 每一個 Job 被拆分紅更小的被稱做 stage(階段) 的 task(任務) 組,stage 彼此之間是相互依賴的(與 MapReduce 中的 map 和 reduce stage 類似) |
2.Spark的集羣調度類型
Spark目前支持如下四種集羣調度類型:
Standalone
Apache Mesos
Hadoop YARN
Kubernetes
3.應用程序的提交
使用 spark-submit 腳本能夠提交應用至任何類型的集羣
4.監控
4.1 Web UI 監控
每一個SparkContext都會啓動一個Web UI,默認端口爲4040,顯示有關應用程序的有用信息。這包括:
i).調度器階段和任務的列表
ii).RDD 大小和內存使用的概要信息
iii).環境信息
iv).正在運行的執行器的信息
能夠經過在Web瀏覽器中打開 http://<driver-node>:4040
來訪問此界面.(若是多個SparkContexts在同一主機上運行,則它們將綁定到連續的端口從4040(4041,4042等)開始)
注意:
默認狀況下 Web UI 中信息僅適用於運行中的應用程序
要在過後還能經過Web UI查看,請在應用程序啓動以前,將spark.eventLog.enabled
設置爲true(詳見後).
4.2 事件日誌的持久化
使用file-system提供的程序類(spark.history.provider)能夠對執行日誌進行持久化.
當進行持久化時,基本日誌記錄目錄必須在spark.history.fs.logDirectory
配置選項中提供,而且應包含每一個表明應用程序的事件日誌的子目錄
Spark任務自己必須配置啓用記錄事件,並將其記錄到相同共享的可寫目錄下.
例如,若是服務器配置了日誌目錄hdfs://namenode/shared/spark-logs,
那麼客戶端選項將是 spark.eventLog.enabled=true
spark.eventLog.dir=hdfs://namenode/shared/spark-logs
4.3 history server
若是在一個應用結束以後還須要查看應用的信息.能夠經過Spark的歷史服務器構建應用程序的UI, 只要應用程序的事件日誌存在,就能夠繼續查詢
./sbin/start-history-server.sh
默認狀況,會在
http://<server-url>:18080 建立一個WebUI
,顯示未完成,完成以及其它嘗試的任務信息
4.4 history server 的一些相關配置
4.4.1 環境相關
SPARK_DAEMON_MEMORY | history server 內存分配(默認值:1g) |
SPARK_DAEMON_JAVA_OPTS | history server JVM選項(默認值:無) |
SPARK_PUBLIC_DNS | history server 公共地址。若是沒有設置,應用程序歷史記錄的連接可能會使用服務器的內部地址,致使連接斷開(默認值:無) |
SPARK_HISTORY_OPTS | spark.history.* history server 配置選項(默認值:無) |
4.4.2 Spark配置
spark.history.provider | org.apache.spark.deploy.history.FsHistoryProvider | 執行應用程序歷史後端的類的名稱。 目前只有一個實現,由Spark提供,它查找存儲在文件系統中的應用程序日誌 |
spark.history.fs.logDirectory | file:/tmp/spark-events | 要加載的應用程序事件日誌的目錄.能夠是本地文件系統或任何Hadoop支持的分佈式文件系統 |
spark.history.fs.update.interval | 10s | 在日誌目錄中檢查新的或更新的日誌間隔區間. |
spark.history.retainedApplications | 50 | 在緩存中保留UI數據的應用程序數量.若是超出此上限,則最先的應用程序將從緩存中刪除(刪除後從磁盤讀取) |
spark.history.ui.maxApplications | Int.MaxValue | 在歷史記錄摘要頁面上顯示的應用程序數量 |
spark.history.ui.port | 18080 | history server 的Web界面綁定的端口 |
spark.history.kerberos.enabled | false | 代表 history server 是否應該使用kerberos進行登陸.若是 history server 正在訪問安全的Hadoop集羣上的HDFS文件 |
spark.history.kerberos.principal | (none) | 若是使用使用kerberos進行登陸,history server 的Kerberos主要名稱 |
spark.history.kerberos.keytab | (none) | 若是使用使用kerberos進行登陸,history server 的kerberos keytab文件的位置 |
spark.history.ui.acls.enable | false | 指定是否應檢查acls受權查看應用程序的用戶 |
spark.history.ui.admin.acls | empty | 經過逗號來分隔具備對history server中全部Spark應用程序的查看訪問權限的用戶/管理員列表 |
spark.history.ui.admin.acls.groups | empty | 經過逗號來分隔具備對history server中全部Spark應用程序的查看訪問權限的組的列表 |
spark.history.fs.cleaner.enabled | false | 指定 History Server是否應該按期從存儲中清除事件日誌 |
spark.history.fs.cleaner.interval | 1d | job history清潔程序檢查要刪除的文件的時間間隔 |
spark.history.fs.cleaner.maxAge | 7d | history保留時間,超出這個時間江北清潔程序刪除 |
spark.history.fs.numReplayThreads | 25% of available cores | history server 用於處理事件日誌的線程數 |
注意:
i).history server 顯示完成的和未完成的Spark做業。 若是應用程序在失敗後進行屢次嘗試,將顯示失敗的嘗試,以及任何持續未完成的嘗試或最終成功的嘗試
ii).未完成的程序只會間歇性地更新。 更新的時間間隔由更改文件的檢查間隔 (spark.history.fs.update.interval
) 定義。 在較大的集羣上,更新間隔可能設置爲較大的值。
查看正在運行的應用程序的方式其實是查看本身的Web UI
iii).沒有註冊完成就退出的應用程序將被列出爲未完成的,即便它們再也不運行。若是應用程序崩潰,可能會發生這種狀況
iv).一個用於表示完成Spark做業的一種方法是明確地中止Spark Context (sc.stop()
),或者在Python中使用 with SparkContext() as sc
4.5 REST API
Spark也提供Rest方式.這爲開發人員提供了一種簡單的方法來爲Spark建立新的可視化和監控工具
此處略,詳見官網
4.6 Metrics 與 Ganglia
略,詳見官網