使用Ganglia监控Spark
2016-03-13 00:26
567 查看
在本博客的《Spark Metrics配置详解》文章中介绍了Spark
Metrics的配置,其中我们就介绍了Spark监控支持Ganglia Sink。
Ganglia是UC Berkeley发起的一个开源集群监视项目,主要是用来监控系统性能,如:cpu 、mem、硬盘利用率, I/O负载、网络流量情况等,通过曲线很容易见到每个节点的工作状态,对合理调整、分配系统资源,提高系统整体性能起到重要作用。
由于Licene的限制,没有放到默认的build里面,如果需要使用,需要自己编译。在使用Maven编译Spark的时候,我们可以加上
如果你使用的是SBT来编译,可以加上
或者你在提交作业的时候,单独将Ganglia相关依赖加入到
依赖弄好之后,我们需要在
如果你出现类似下面的异常信息:
请查看你的Spark包是否将
配置弄好之后,启动你的Spark集群,然后去
![](http://www.iteblog.com/pic/spark-ganglia.png)
如果想及时了解Spark、Hadoop或者Hbase相关的文章,欢迎关注微信公共帐号:iteblog_hadoop
除了上图的
Metrics的配置,其中我们就介绍了Spark监控支持Ganglia Sink。
Ganglia是UC Berkeley发起的一个开源集群监视项目,主要是用来监控系统性能,如:cpu 、mem、硬盘利用率, I/O负载、网络流量情况等,通过曲线很容易见到每个节点的工作状态,对合理调整、分配系统资源,提高系统整体性能起到重要作用。
由于Licene的限制,没有放到默认的build里面,如果需要使用,需要自己编译。在使用Maven编译Spark的时候,我们可以加上
-Pspark-ganglia-lgpl选项来将Ganglia相关的类打包进
spark-assembly-x.x.x-hadoopx.x.x.jar中,命令如下:
1 | [iteblog@iteblog spark]$ ./ make -distribution.sh --tgz -Phadoop-2.4 -Pyarn -DskipTests |
2 | -Dhadoop.version=2.4.0 -Pspark-ganglia-lgpl |
SPARK_GANGLIA_LGPL=true,完整命令如下:
1 | [iteblog@iteblog spark]$ SPARK_HADOOP_VERSION=2.4.0 SPARK_YARN= true |
2 | SPARK_GANGLIA_LGPL= true sbt/sbt assembly |
--jars选项中:
1 | --jars lib/spark-ganglia-lgpl_2.10-x.x.x.jar ... |
$SPARK_HOME/conf/metrics.properties文件中加入一下配置:
1 | *.sink.ganglia.class=org.apache.spark.metrics.sink.GangliaSink |
2 | *.sink.ganglia.host=www.iteblog.com |
3 | *.sink.ganglia.port=8080 |
4 | *.sink.ganglia.period=10 |
5 | *.sink.ganglia.unit=seconds |
6 | *.sink.ganglia.ttl=1 |
7 | *.sink.ganglia.mode=multicast |
host和
port这个就是你Ganglia监控的地址,其中
mode支持'unicast'(单播) 和 'multicast'(多播)两种模式。
如果你出现类似下面的异常信息:
01 | 15 / 06 / 11 23 : 35 : 14 ERROR MetricsSystem : Sink class org.apache.spark.metrics.sink.GangliaSinkcannot be instantialized |
02 | java.lang.ClassNotFoundException : org.apache.spark.metrics.sink.GangliaSink |
03 | at java.net.URLClassLoader$ 1 .run(URLClassLoader.java : 366 ) |
04 | at java.net.URLClassLoader$ 1 .run(URLClassLoader.java : 355 ) |
05 | at java.security.AccessController.doPrivileged(Native Method) |
06 | at java.net.URLClassLoader.findClass(URLClassLoader.java : 354 ) |
07 | at java.lang.ClassLoader.loadClass(ClassLoader.java : 425 ) |
08 | at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java : 308 ) |
09 | at java.lang.ClassLoader.loadClass(ClassLoader.java : 358 ) |
10 | at java.lang.Class.forName 0 (Native Method) |
11 | at java.lang.Class.forName(Class.java : 191 ) |
12 | at org.apache.spark.metrics.MetricsSystem$$anonfun$registerSinks$ 1 .apply(MetricsSystem.scala : 138 ) |
13 | at org.apache.spark.metrics.MetricsSystem$$anonfun$registerSinks$ 1 .apply(MetricsSystem.scala : 134 ) |
14 | at scala.collection.mutable.HashMap$$anonfun$foreach$ 1 .apply(HashMap.scala : 98 ) |
15 | at scala.collection.mutable.HashMap$$anonfun$foreach$ 1 .apply(HashMap.scala : 98 ) |
16 | at scala.collection.mutable.HashTable$ class .foreachEntry(HashTable.scala : 226 ) |
17 | at scala.collection.mutable.HashMap.foreachEntry(HashMap.scala : 39 ) |
18 | at scala.collection.mutable.HashMap.foreach(HashMap.scala : 98 ) |
19 | at org.apache.spark.metrics.MetricsSystem.registerSinks(MetricsSystem.scala : 134 ) |
20 | at org.apache.spark.metrics.MetricsSystem.<init>(MetricsSystem.scala : 84 ) |
21 | at org.apache.spark.metrics.MetricsSystem$.createMetricsSystem(MetricsSystem.scala : 171 ) |
22 | at org.apache.spark.deploy.worker.Worker.<init>(Worker.scala : 106 ) |
23 | at sun.reflect.NativeConstructorAccessorImpl.newInstance 0 (Native Method) |
24 | at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java : 57 ) |
25 | at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java : 45 ) |
26 | at java.lang.reflect.Constructor.newInstance(Constructor.java : 526 ) |
27 | at akka.util.Reflect$.instantiate(Reflect.scala : 65 ) |
28 | at akka.actor.Props.newActor(Props.scala : 337 ) |
29 | at akka.actor.ActorCell.newActor(ActorCell.scala : 534 ) |
30 | at akka.actor.ActorCell.create(ActorCell.scala : 560 ) |
31 | at akka.actor.ActorCell.invokeAll$ 1 (ActorCell.scala : 425 ) |
32 | at akka.actor.ActorCell.systemInvoke(ActorCell.scala : 447 ) |
33 | at akka.dispatch.Mailbox.processAllSystemMessages(Mailbox.scala : 262 ) |
34 | at akka.dispatch.Mailbox.run(Mailbox.scala : 218 ) |
35 | at akka.dispatch.ForkJoinExecutorConfigurator$AkkaForkJoinTask.exec(AbstractDispatcher.scala : 386 ) |
36 | at scala.concurrent.forkjoin.ForkJoinTask.doExec(ForkJoinTask.java : 260 ) |
37 | at scala.concurrent.forkjoin.ForkJoinPool$WorkQueue.runTask(ForkJoinPool.java : 1339 ) |
38 | at scala.concurrent.forkjoin.ForkJoinPool.runWorker(ForkJoinPool.java : 1979 ) |
39 | at scala.concurrent.forkjoin.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java : 107 ) |
org.apache.spark.metrics.sink.GangliaSink打包进去了;或者仔细看下你的配置文件,请尽量拷贝我这里提供的。
配置弄好之后,启动你的Spark集群,然后去
http://www.iteblog.com/ganglia-web监控页面查看是否弄好了,类似下面的信息:
![](http://www.iteblog.com/pic/spark-ganglia.png)
如果想及时了解Spark、Hadoop或者Hbase相关的文章,欢迎关注微信公共帐号:iteblog_hadoop
除了上图的
master.apps和
master.workers监控,Ganglia里面还显示如下的信息:
01 | { |
02 | "version" : "3.0.0" , |
03 | "gauges" : { |
04 | "jvm.PS-MarkSweep.count" : { |
05 | "value" : 0 |
06 | }, |
07 | "jvm.PS-MarkSweep.time" : { |
08 | "value" : 0 |
09 | }, |
10 | "jvm.PS-Scavenge.count" : { |
11 | "value" : 186 |
12 | }, |
13 | "jvm.PS-Scavenge.time" : { |
14 | "value" : 375 |
15 | }, |
16 | "jvm.heap.committed" : { |
17 | "value" : 536412160 |
18 | }, |
19 | "jvm.heap.init" : { |
20 | "value" : 536870912 |
21 | }, |
22 | "jvm.heap.max" : { |
23 | "value" : 536412160 |
24 | }, |
25 | "jvm.heap.usage" : { |
26 | "value" : 0.315636349481712 |
27 | }, |
28 | "jvm.heap.used" : { |
29 | "value" : 169311176 |
30 | }, |
31 | "jvm.non-heap.committed" : { |
32 | "value" : 37879808 |
33 | }, |
34 | "jvm.non-heap.init" : { |
35 | "value" : 24313856 |
36 | }, |
37 | "jvm.non-heap.max" : { |
38 | "value" : 184549376 |
39 | }, |
40 | "jvm.non-heap.usage" : { |
41 | "value" : 0.19970542734319513 |
42 | }, |
43 | "jvm.non-heap.used" : { |
44 | "value" : 36855512 |
45 | }, |
46 | "jvm.pools.Code-Cache.usage" : { |
47 | "value" : 0.031689961751302086 |
48 | }, |
49 | "jvm.pools.PS-Eden-Space.usage" : { |
50 | "value" : 0.9052384254331968 |
51 | }, |
52 | "jvm.pools.PS-Old-Gen.usage" : { |
53 | "value" : 0.02212668565200476 |
54 | }, |
55 | "jvm.pools.PS-Perm-Gen.usage" : { |
56 | "value" : 0.26271122694015503 |
57 | }, |
58 | "jvm.pools.PS-Survivor-Space.usage" : { |
59 | "value" : 0.5714285714285714 |
60 | }, |
61 | "jvm.total.committed" : { |
62 | "value" : 574291968 |
63 | }, |
64 | "jvm.total.init" : { |
65 | "value" : 561184768 |
66 | }, |
67 | "jvm.total.max" : { |
68 | "value" : 720961536 |
69 | }, |
70 | "jvm.total.used" : { |
71 | "value" : 206166688 |
72 | }, |
73 | "master.apps" : { |
74 | "value" : 0 |
75 | }, |
76 | "master.waitingApps" : { |
77 | "value" : 0 |
78 | }, |
79 | "master.workers" : { |
80 | "value" : 0 |
81 | } |
82 | }, |
83 | "counters" : { }, |
84 | "histograms" : { }, |
85 | "meters" : { }, |
86 | "timers" : { } |
87 | } |
相关文章推荐
- 二、Nginx变量
- Linux下搭建android环境
- Linux系统下以RPM方式如何安装mysql-5.7.9
- nginx安装与部署
- NanoPC-T2 以太网分析(1)
- OPENCV图像处理基础(四)用滑动条做一个按钮
- Ubuntu中如何将Tomcat端口改为80
- 关闭Apache显示文件列表
- apache文件服务安装,脚本下载
- Centos7安装Samba 共享文件夹
- Sping控制反转(IOC)和面向切面(AOP)
- lamp环境搭建
- centos chrome flash
- 如何成为一名java架构师
- Linux 下 netns 间设备互联
- 转载centos6.5安装gitlab
- There is no getter for property named 'username'
- 14.Linux之搜索命令
- Corosync+Pacemaker+Isici实现MySQL的高可用
- Nginx(一):基础与配置文件简介