大数据基础系列之spark的监控体系介绍
浪尖 浪尖聊大数据
目前有好几种监控spark应用程序的工具:web UIs,指标系统和外部监控仪。
一,web界面
1,界面的基本介绍
每一个Spark应用程序都会启动一个spark ui,默认端口是4040端口,用于展示对应用程序有用的信息。包括以下信息:
1),stages和tasks列表。
2),RDD大小的总概和内存使用。
3),运行环境信息。
4),运行的Executors状态。
你可以在浏览器输入: http://<driver-node>: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:// <server-url>: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内部使用而言非常有用。