任務的監控和使用
有幾種方式監控spark應用:Web UI,指標和外部方法
Web接口
每個SparkContext都會啟動一個web UI,默認是4040端口,用來展示一些信息:
- 一系列調度的stage和task
- RDD大小和內存的使用概況
- 環境變量信息
- excutors的相關信息
可以通過http://<driver-node>:4040訪問,如果有多個sparkcontext運行在同一個節點,那么端口會依次為4040、4041、4042。
注意這些信息只有在應用執行期間才能看到。如果想要執行完畢查看,那么可以在應用開始前設置spark.eventLog.enabled為true,這樣spark的日志信息會被持久化。
在應用執行結束后查看web UI
當應用執行完畢,可以在Spark History Server上查看日志。可以通過下面的命令啟動history server:
./start-history-server.sh
這樣默認訪問http://<server-url>:18080即可。
如果使用文件系統的provider class(比如spark.history.provider),需要配置spark.history.fs.logDirectory選項。
spark的jobs本身需要配置日志,並且輸出到相同的共享、可寫目錄。比如,下面就把日志輸出到hdfs://namenode/shared/spark-logs,client需要增加配置:
spark.eventLog.enabled true
spark.eventLog.dir hdfs://namenode/shared/spark-logs
環境變量
| 變量 | 說明 |
|---|---|
| SPARK_DAEMON_MEMORY | history server分配的內存 |
| SPARK_DAEMON_JAVA_OPTS | JVM選項 |
| SPARK_PUBLIC_DNS | 對外的地址,如果沒有設置應該是用回環地址,這塊沒怎么看明白 |
| SPARK_HISTORY_OPTS | history server的配置 |
配置
| 變量名 | 默認值 | 說明 |
|---|---|---|
| spark.history.provider | org.apache.spark.deploy.history.FsHistoryProvider | history背后的實現類,目前spark就提供這一種,是基於文件系統的 |
| spark.history.fs.logDirectory | file:/tmp/spark-events | 支持file://或者hdfs:// |
| spark.history.fs.update.interval | 10s | 這個是服務器刷新的時間,只有服務器這邊刷新了,webUI那邊才有反應 |
| spark.history.retainedApplications | 50 | 緩存的應用個數,如果超過限制,會從磁盤加載 |
| spark.history.ui.maxApplications | Int.MaxValue | 概況首頁可以顯示的應用數量 |
| spark.history.ui.piort | 18080 | 端口號 |
| spark.history.kerberos.enabled | false | 是否使用kerberos登陸 |
| spark.history.kerberos.principal | kerberos不了解 | |
| spark.history.kerberos.keytab | kerberos不了解 | |
| spark.history.ui.acls.enable | false | acl校驗 |
| spark.history.ui.admin.acls | empty | 可以查看history server的用戶,*代表所有用戶 |
| spark.history.fs.cleaner.enabled | false | 是否周期性的清除日志 |
| spark.history.fs.cleaner.interval | 1d | 多長時間檢查一次,應用日志是否清除 |
| spark.history.fs.cleaner.maxAge | 7d | 超過這個時間的日志會被清除掉 |
| spark.history.fs.numReplayThreads | 25% of available cores | history server可以用的處理日志的線程數 |
注意在概況首頁,所有的列都可以點擊用來排序。
- history server可以同時展示完成或者未完成的spark任務。如果應用在失敗后有多次嘗試,失敗的記錄也會展示出來。
- 未完成的應用需要等待服務器內部刷新。刷新的時間可以通過
spark.history.fs.update.interval。如果集群很大,那么刷新時間應該長一點,如果想看實時的數據,可以通過web UI查看 - application如果中途直接退出,那么會被標注為未完成。
- 想要標記spark為完成狀態,需要sc.stop()方法執行
Rest API
另外可以通過UI查看指標。這樣可以讓開發者很容易的創建一些可視化的工具。這些命令同時也只支持正在運行的應用。對於history server,訪問的地址是http://<server-url>:18080/api/v1,對於正在運行的任務,可以訪問http://localhost:4040/api/v1
在這些api中,應用的標識為ID[app-id]。當通過YARN啟動時,每個應用可能會有多次嘗試,只有在cluster模式下才有 應用嘗試的id,client模式是沒有的。如果是集群模式,那么app-id其實是[base-app-id]/[attempt-id],其中base-app-id是yarn的appid。
?status=[active|complete|pending|failed] 可以列出對應的狀態
| url | 說明 |
|---|---|
/applications |
列出所有的應用。?status=[complete|running]選擇對應的狀態展示?minDate=[date]顯示最小日期的應用,?maxDate=[date]``minEndDate=[date]``?maxEndDate=[date]``?limit=[limit] |
/applications/[app-id]/jobs |
展示對應的jobs |
/applications/[app-id]/jobs/[job-id] |
job信息 |
/applications/[app-id]/stages |
stages信息 |
/applications/[app-id]/executors |
excutors信息 |
/applications/[app-id]/streaming/statistics |
streaming信息 |
其他工具
其他相關的性能調優的工具:
- 集群監控,可以使用Ganglia
- 操作系統監控,可以用dstat, iostat, iotop
- JVM可以用jstack, jstat, jconsole
