https://blog.csdn.net/zhikanjiani/article/details/102702365
背景:
外资车载导航、硬件、传感器、GPS等等
1、服务挂了,不能及时通知
2、服务不能达到秒级通知,前两年基本都是分钟级别,5min左右
3、对于一些即将出现的问题可以提前预知
4、有效的扩展到实时计算、日志
5、如MYSQL 、SQL的error、慢sql
6、如Nginx、Tomcat、Linux系统级别的日志
ELK项目在行业中有两家公司在做:
1、日志易(3、4年前是使用ELK做的)
2、SPLUNK公司
https://ruozedata.github.io/categories/%E7%94%9F%E4%BA%A7%E9%A2%84%E8%AD%A6%E5%B9%B3%E5%8F%B0%E9%A1%B9%E7%9B%AE/page/2/
车载导航的日志、系统运行日志(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
http://blog.itpub.net/30089851/viewspace-2134067/
原因是tail -f 文件被切走之后新建的原文件,tail -f不能识别。
https://blog.csdn.net/zhikanjiani/article/details/100678368
#Create topic PREWARNING
cd /opt/cloudera/parcels/KAFKA/lib/kafka/bin
./kafka-topics.sh \
--create \
--zookeeper hadoop001:2181,hadoop002:2181,hadoop003:2181/kafka \
--replication-factor 2 --partitions 2 --topic PREWARNING
#Create producer
./kafka-console-producer.sh \
--broker-list hadoop002:9092,hadoop003:9092 \
--topic PREWARNING
#Create consumer
./kafka-console-consumer.sh \
--bootstrap-server hadoop002:9092,hadoop003:9092 \
--from-beginning \
--topic PREWARNING
#delete topic
./kafka-topics.sh \
--delete \
--zookeeper hadoop001:2181,hadoop002:2181,hadoop003:2181/Kafka \
--topic PREWARNING
#describe topic
./kafka-topics.sh \
--describe \
--zookeeper hadoop001:2181,hadoop002:2181,hadoop003:2181/Kafka \
--topic PREWARNING
修改/var/lib/hadoop-hdfs/flume/conf/exec_memory_kafka.properties
# Name the components on this agent
a1.sources = r1
a1.sinks = k1
a1.channels = c1
# Describe/configure the custom exec source
a1.sources.r1.type = com.ruozedata.prewarning.ExecSourceJSON
a1.sources.r1.command = tail -F /var/log/hadoop-hdfs/hadoop-cmf-hdfs-NAMENODE-hadoop001.log.out
a1.sources.r1.hostname = hadoop001
a1.sources.r1.servicename = namenode
# Describe the sink
a1.sinks.k1.type = org.apache.flume.sink.kafka.KafkaSink
a1.sinks.k1.kafka.topic = PREWARNING
a1.sinks.k1.kafka.bootstrap.servers = hadoop001:9092,hadoop002:9092,hadoop003:9092
a1.sinks.k1.kafka.flumeBatchSize = 6000
a1.sinks.k1.kafka.producer.acks = all
a1.sinks.k1.kafka.producer.linger.ms = 1
a1.sinks.ki.kafka.producer.compression.type = snappy
# Use a channel which buffers events in memory
a1.channels.c1.type = memory
a1.channels.c1.keep-alive = 90
a1.channels.c1.capacity = 2000000
a1.channels.c1.transactionCapacity = 6000
# Bind the source and sink to the channel
a1.sources.r1.channels = c1
a1.sinks.k1.channel = c1
运动flume采集日志
nohup bin/flume-ng agent
-c /var/lib/hadoop-hdfs/flume/conf
-f /var/lib/hadoop-hdfs/flume/conf/exec_memory_kafka.properties
-n a1
-Dflume.root.logger=INFO,console &