第一章: 项目背景
第二章: 进行开发
项目名称:生产预警平台
背景:
1、服务挂了,不能及时通知
2、服务不能达到秒级通知,前两年基本都是分钟级别,5min左右
3、对于一些即将出现的问题可以提前预知
4、有效的扩展到实时计算、日志
5、如MYSQL 、SQL的error、慢sql
6、如Nginx、Tomcat、Linux系统级别的日志
涉及到甲方和乙方:
SLA:Service-Level Agreement(服务等级协议) 99%
J总当时遇到一个问题:
1、ELK入门实战(算一个小项目),写完后可以写在简历中
ELK项目在行业中有两家公司在做:1、日志易(3、4年前是使用ELK做的) 2、SPLUNK公司
车载导航的日志、系统运行日志(app、各个传感器温度、经纬度、高度)、用户行为日志;
上报数据的日志有两个维度:
维度一:1min/5min/10min
维度二:数据量达到10kb就上传
特斯拉系统就是后台导航远程在监控;数据上报过来之后在Tomcat采集器,车载导航把所有数据发送给Tomcat采集器,数据落地到磁盘文件;Linux --> ELK进行分析预警;开发人员去查看有无问题。
AWS集群,公司面对车场的业务,腾讯有软件公司对外接服务,选择了XX公司,在初中时代10快钱一个月的彩铃包月、导航业务(付费业务)
我们采集CDH的NN进程的日志 --> flume --> kafka --> Spark Streaming --> influxdb --> grafana
第一座山:
第二座山:
1、NameNode的log是log4j的形式,以列的形式:时间 日志级别 日志详细信息
我们既然要用到Spark,使用DF操作,就是要使用RDD+schema来进行操作;
2、改造日志,改造成带有schema信息的;
log4j.appender.RFA.layout.ConversionPattern = {"time":"%d{yyyy-MM-dd HH:mm:ss,SSS}","logtype":"%p","loginfo":"%c:%m"}%n
如上JSON格式解析:
time:时间 logtype:日志类型 loginfo:报错信息 %n换行符
在NameNode和DataNode中都进行配置:保存完了之后回到首页;重启HDFS即可(Restart Stale Service)。
那我们想要有Schema,最好就是构建JSON格式,并且JSON格式能够转换成DF的;
生产上每台机器不可能只运行1个服务,肯定是多个服务并存的,在我们采集这条数据的时候,我们要明白这条数据来自哪台机器;
NameNode Logging Threshold:
NameNode Max Log Size:NameNode Default Group:200MB
NameNode Maximum Log File Backups:NameNode Default Group:10
我们想个问题,我们使用Exec Source就够了,思考:我们的服务挂了,数据丢失一点有没有关系?
不同的场景采用不同的source,在生产过程中,采用flume是没有发生过故障的,我们选择exec source
原因是tail -f 文件被切走之后新建的原文件,tail -f不能识别。
1、首先要找到Exec的源代码:
1、添加两列:机器名称、服务名称
2、日志折断
3、在构建hdfs日志的时候,spark作业出现一个json串的时候无法生效,就无法转化为DF,我们需要做的是清洗+JSON校验 --> 校验成功写到channel memory --> kafka.
概念:linux中error信息,从上面到下面是一整条信息;抛exception的时候错误信息是有很多行的;
解决:
1、在每一行加上时间+日志级别+机器名称:问题:后续进行分析分辨不清楚哪条日志是否是一个整体
2、采取的措施:把换行符换成自己特有的分割符,使其变成一个整体
自定义source和service,拿到这两个参数后,来自哪个服务是通过参数配置的,一个flume进程只采集一个配置;
验证tmpevent是否为json格式,不验证的话,会导致job计算失败:
if (jsonvalidator.validate(tmpevent)){
eventList.add(EventBuilder.withBody(tmpevent))
} else{
输出到某个errorparse.log
}
自定义代码搞完之后,只打包flume-ng-core工程下的文件;打完包后去到target下显示的打包文件目录。
以后打包的时候,class文件不生效的话,记得先去clean一下。
打包方式:J总以前是单独打包两个文件,今天我们使用IDEA maven打包一个整的jar包。