监控spark应用程序的方法

目前有好几种监控spark应用程序的工具:web UIs,指标系统和外部监控仪。

一,web界面

1,界面的基本介绍

每一个Spark应用程序都会启动一个spark ui,默认端口是4040端口,用于展示对应用程序有用的信息。包括以下信息:

1),stages和tasks列表。

2),RDD大小的总概和内存使用。

3),运行环境信息。

4),运行的Executors状态。

可以在浏览器输入: http://:4040访问该界面。如果多个SparkContexts在同一台主机上运行,则它们将以4040(4041,4042等)开始绑定到连续的端口。请注意,默认情况下,这些信息只会在程序运行期间可以查看。在程序运行结束后查看webUI,需要在启动应用程序前设置spark.eventLog.enabled为true。这配置spark会将显示在web ui上的spark events存储到存储系统中去。

2,spark的historyServer

只要应用程序的事件日志存在,仍然可以通过Spark的历史记录服务器构建应用程序的UI。通过执行下面的命令,启动历史服务器:

./sbin/start-history-server.sh

默认情况下,这将在http:// 18080创建一个Web界面,列出未完成和已完成的应用程序和尝试。当使用文件系统提供程序类(请参见下面的spark.history.provider)时,基本日志记录目录必须在spark.history.fs.logDirectory配置选项中提供,并且应包含每个表示应用程序事件日志的子目录。必须将Spark作业本身配置为记录事件,并将其记录到相同的共享可写目录。例如,server的log目录为:hdfs://namenode/shared/spark-logs,那么客户端的配置如下:

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内部使用而言非常有用。

你可能感兴趣的:(spark)