开发者学堂课程【大数据实战项目:反爬虫系统(Lua+Spark+Redis+Hadoop框架搭建)第四阶段:数据预处理-系统监控-效果及总结】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/672/detail/11677
数据预处理-系统监控-效果及总结
内容介绍:
一.效果
二.总结
一.效果
前面已经把所有的监控的代码都已经全部写完了,但是还没有看到效果,接下来就来看一下效果。找到数据预处理,
//10 系统监控功能(数据与处理的监控功能)
SparkStreamingMonitor.streamMonitor(sc,rdd,serverCount,redis)
这个是调用,爬虫将数据预处理程序跑起来,跑起来以后,在 Redis 中应该没有多数据,但是多了一些数据是之前爬虫残留的数据。右键执行,爬虫跑起来,数据预处理也在走着。目前无报错说明监控的代码也没有问题,验证方法为数据最终会被写入到 Redis 中,在 Redis 中有数据。刷新 Redis,数据数量变为95,很多 DP,DP 是在之前写数据时使用 CSANTI_MONITOR_DP 作为前缀,后面加了时间戳
这些就是整理出的数据,只要在 Redis 中看到 DP 数据以及结果,立刻到前端界面就有数据
实时流量转发,曲线图已有数据,系统当前运行情况也已有数据,各链路流量转发情况也有了。
这就看到实际的效果了,只要在 Redis 中能够看到 DP 数据,看得到数据的结果,就能够看前端界面系统监控功能,这些数据全部都有。实时流量转发曲线图,变颜色运行正常以及各链路流量柱状图全都有了。看到这个效果,监控界面以及监控功能模块就实现了。
将爬虫调节速度,现在是一秒钟填一次,将它停止,修改为500毫秒填一次
//请求jpg
spiderJpg();
Thread.sleep(millis:500);
500毫秒填一次速度是之前的两倍,前端界面的数据应该会有一个比较大的增长
2019-05-15 22:27:30处下来了是因为刚刚停了一下变为0了,然后长起来了是因为恰好大概是之前的两倍,现在是24。
再刷新出现几个波动,数据在不断增长。再调快,关闭调到300毫秒,再跑起来,速度更快了。在看前端界面,产生更高的值
这其中确实监控了该循环爬虫。再将速度调小,修改为1000毫秒,再查看效果,曲线图又下降与最开始一致,
看到该效果说明该程序确实监控爬虫数据,监控效果查看完成。
二.总结
关闭程序,回到笔记-任务监控功能,具体实现了如下模块,思路如下:
1.首先开启任务的监控,在 conf 中开启任务监控
代码:
. set(“spark.metrics.conf.executor.source.jvm.class”,“org.apache.spark.metrics.source.JvmSource”)//
开启集群监控功能
2.开启之后,通过 http://localhost:4040/ metrics/json/
路径获得数据,该数据为全部数据
代码:
val url =“http:// localhost:4040/metrics/json/”
val jsonData = SparkMetricsUtils.getMetricsJson(url)
3.全部数据获取之后,由于数据是 gauges 格式,所以先以 gauges 作为节点勾取出来获取值,也就是先获取 gauges节点的数据。
代码:
val gaugesJson = jsonData.getJSONObject(“gauges”)
4.拼接结束的时间
代码:
val endTimePath = appId +“.driver.”+ appName + “.StreamingMetrics.streaming.lastCompletedBath_processingEndTime”
5.拼接开始的时间
代码:
val startTimePath = appId +“.driver.”+ appName + “.StreamingMetrics.streaming.lastCompletedBath_processingStartTime”
6.单独获取时间(开始时间和结束时间)
代码:
val tmpStartTime = gaugesJson.getJSONObject(startTimePath)
//后去最终的开始时间戳
var startTime: Long = 0
if (tmpStartTime != null) {
startTime = tmpStartTime.getLong(“value”)
}
//获取出结束时间
val tmpEndTime = gaugesJson.getJSONObject(endTimePath)
//后去最终的开始时间戳
var endTime: Long = 0
if (tmpEndTime != null) {
endTime = tmpEndTime.getLong(“value”)
}
7.获取之后求差,也就是运行时间
代码:
val runTime = endTime - startTime
8.运行时间有了,还需要一个获取数据总量,数据总量除以时间就是速度
代码:
val dataCount = rdd.count()
val runSpeed = dataCount.toFloat / runTime.toFloat
9.封装前端数据所需要使用的展现需要的数据
代码:
val Maps = Map(
“costTime”-> runTime.toString,
“serversCountMap”-> serverCount,
“applicationId”-> appId.toString,
“countPerMillis”-> runSpeed.toString,
“applicationUniqueName”-> appName.toString,
“endTime”-> endTimeS,
“sourceCount”-> dataCount.toString
)
10.将数据写入 redis
代码:
val key = PropertiesUtil.getStringByKey(“cluster.key.monitor.dataProcess”,
“jedisConfig.properties”) + System.currentTimeMillis().toString
val time = PropertiesUtil.get.getStringByKey(“cluster.exptime.monitor”,
“jedisConfig.properties”)toInt
redis.setex(key, time, Json(DefaultFormats).write(Maps))
这就是数据预处理的性能监控,也就是任务监控的实现。
随着监控功能的实现完成,代码工作彻底结束了,找到该流程
监控功能已完成,预处理代码功能模块彻底结束了。现在数据已展现在前端,曲线图有了,系统功能运行情况也变为正常颜色,柱状图也有了,数据写入redis 中怎么到前端界面,这三个模块的展现过程从后端到前端的展现不需要写代码。功能上总体流程已完成,还需要看一个前端展现的代码,这个代码查看以后所有功能结束。