目前有好几种监控spark应用程序的工具:web UIs,指标系统和外部监控仪。
一,web界面
1,界面的基本介绍
每一个Spark应用程序都会启动一个spark ui,默认端口是4040端口,用于展示对应用程序有用的信息。包括以下信息:
1),stages和tasks列表。
2),RDD大小的总概和内存使用。
3),运行环境信息。
4),运行的Executors状态。
可以在浏览器输入: http://
2,spark的historyServer
只要应用程序的事件日志存在,仍然可以通过Spark的历史记录服务器构建应用程序的UI。通过执行下面的命令,启动历史服务器:
./sbin/start-history-server.sh
默认情况下,这将在http://
spark.eventLog.enabled true
spark.eventLog.dir hdfs://namenode/shared/spark-logs
3,historyServer的配置
1),环境变量
环境变量名 |
默认值 |
含义 |
SPARK_DAEMON_MEMORY |
1g |
historyServer默认内存 |
SPARK_DAEMON_JAVA_OPTS |
none |
historyServer的JVM参数 |
SPARK_PUBLIC_DNS |
none |
历史服务器的公共地址。如果没有设置,那么到应用程序历史记录的链接可能会使用服务器的内部地址,导致链接断开 |
SPARK_HISTORY_OPTS |
none |
historyServer的spark.history.* 配置项 |
2),spark的配置选项
属性名 |
默认值 |
含义 |
spark.history.provider |
org.apache.spark.deploy.history.FsHistoryProvider |
历史服务器的实现类。目前仅仅只有当前一个实现,spark默认自带的,会从系统文件中查找程序日志 |
spark.history.fs.logDirectory |
file:/tmp/spark-events |
应用日志存储的位置,可以是本地文件或者hdfs,file://path或者hdfs://namenode/shared/path |
spark.history.fs.update.interval |
10s |
Provider扫描日志目录,查看有误新的或者更新的日志信息的周期 |
spark.history.retainedApplications |
50 |
在缓存中保留UI数据的应用程序数量。 如果超出此上限,则最早的应用程序将从缓存中删除。 如果应用程序不在缓存中,则如果应用程序从UI访问,则必须从磁盘加载该应用程序。 |
spark.history.ui.maxApplications |
Int.MaxValue |
在历史页面展示的最大应用程序的数目。即使没有在页面展示也照样可以通过他们的URLs访问。 |
spark.history.ui.port |
18080 |
历史服务器端口。 |
这里只配置了常用的,还有更多配置请参考官网。
http://spark.apache.org/docs/latest/monitoring.html
通过页面我们很容易发现慢任务和数据倾斜。
注释:
1),historyserver会展示完成的任务和未完成的任务。如果一个任务失败之后重试了很多次,失败尝试会展示,正在运行的未完成的尝试,最终成功的尝试都会展示。
2),不完整的应用程序仅间歇更新。更新之间的时间由更改文件的检查间隔(spark.history.fs.update.interval)定义。在较大的集群上,更新间隔可能设置为较大的值。查看正在运行的应用程序的方式实际上是查看应用自己的Web UI。
二,监控指标
Spark具有基于Dropwizard Metrics Library的可配置度量系统。这允许用户将Spark指标报告给各种sinks,包括HTTP,JMX和CSV文件。度量系统是通过配置文件进行配置的,Spark度量系统的配置文件为$ SPARK_HOME / conf / metrics.properties。可以通过spark.metrics.conf配置属性指定自定义文件位置。默认情况下,用于驱动程序或执行程序度量标准的根命名空间是spark.app.id的值。然而,通常,用户希望能够跟踪spark程序的driver和Executor的指标,这与应用程序ID(即spark.app.id)很难相关,因为每次启动应用程序程序ID都会发生变化。这对这种情况,一个自定义namespace必须被指定,可以使用spark.metrics.namespace设置为${spark.app.name}。然后该值会被spark展开作为root namespace。非driver和Executor度量指标不会以spark.app.id为前缀,spark.metrics.namespace属性也不会对此度量指标有任何影响。
Spark的度量指标被分解为与Spark组件相对应的不同实例。每一个实例都可以配置多个sinks,作为指标的输出地。下面的实例是当前所支持的:
1),master:Standalone模式下的master进程。
2),applications:master内的一个组件,用于报告各种应用程序。
3),worker:Standalone模式下的worker进程。
4),executor:spark的Executor。
5),driver:spark的diver进程。
6),shuffleService:Spark的shuffle服务。
每个实例能够输出到0个到多个sinks。Sinks包括在org.apache.spark.metrics.sink
1),ConsoleSink:将指标信息记录到控制台。
2),CSVSink:定期将度量数据导出到CSV文件。
3),JmxSink:注册指标到JMX控制台中查看的。
4),MetricsServlet:在现有的Spark UI中添加一个servlet,将度量指标以json的格式提供。
5),GraphiteSink:将指标追加到Graphite节点。
6),Slf4jSink:将度量标准作为日志条目发送到slf4j。
Spark还支持由于许可限制而不包含在默认构建中的Ganglia接收器
7),GangliaSink:向Ganglia节点或多播组发送指标。
要安装GangliaSink,您需要自定义编译spark。请注意,通过嵌入此库,您将在Spark包中包含LGPL许可的代码。对于sbt用户,在编译之前设置SPARK_GANGLIA_LGPL环境变量。对于Maven用户,启用-Pspark-ganglia-lgpl配置文件。除了修改集群的Spark构建用户应用程序,还需要链接到spark-ganglia-lgpl工件。度量系统的配置语法在示例配置文件$ SPARK_HOME / conf / metrics.properties.template中定义。
三,高级监控
可以使用多个外部工具来帮助描述Spark作业的性能:
1,集群的监控工具,如Ganglia,可以提供整体集群利用率和资源瓶颈的分析数据和视图。例如,Ganglia仪表板可以快速显示特定工作负载是否为磁盘瓶颈,网络瓶颈或CPU瓶颈。
2,操作系统分析工具(如dstat,iostat和iotop)可以在单个节点上提供细粒度的分析。
3,用于提供堆栈跟踪的JVM实用程序jstack ,用于创建堆视图的jmap,用于报告时间序列统计信息的jstat以及用于可视化浏览各种JVM属性的jconsole对于那些对JVM内部使用而言非常有用。