使用Ganglia监控Spark

在本博客的 《Spark Metrics配置详解》文章中介绍了 Spark 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

  如果你使用的是SBT来编译,可以加上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

  或者你在提交作业的时候,单独将Ganglia相关依赖加入到--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

hostport这个就是你Ganglia监控的地址,其中mode支持'unicast'(单播) 和 'multicast'(多播)两种模式。

  如果你出现类似下面的异常信息:
0115/06/11 23:35:14 ERROR MetricsSystem: Sink class org.apache.spark.metrics.sink.GangliaSink cannot be instantialized
02java.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.forName0(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.newInstance0(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)

  请查看你的Spark包是否将org.apache.spark.metrics.sink.GangliaSink打包进去了;或者仔细看下你的配置文件,请尽量拷贝我这里提供的。

  配置弄好之后,启动你的Spark集群,然后去http://www.iteblog.com/ganglia-web监控页面查看是否弄好了,类似下面的信息:


如果想及时了解Spark、Hadoop或者Hbase相关的文章,欢迎关注微信公共帐号: iteblog_hadoop

  除了上图的master.appsmaster.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}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值