大数据实战课 - 生产预警平台01

https://blog.csdn.net/zhikanjiani/article/details/102702365

第一章:项目背景

背景:

外资车载导航、硬件、传感器、GPS等等
1、服务挂了,不能及时通知

2、服务不能达到秒级通知,前两年基本都是分钟级别,5min左右

3、对于一些即将出现的问题可以提前预知

4、有效的扩展到实时计算、日志

5、如MYSQL 、SQL的error、慢sql

6、如Nginx、Tomcat、Linux系统级别的日志

1.1.早期运维ELK

ELK项目在行业中有两家公司在做:
1、日志易(3、4年前是使用ELK做的)
2、SPLUNK公司

1.2.生产预警平台的架构

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的形式,以列的形式:时间 日志级别 日志详细信息

  • cd /var/log/hadoop-hdfs
    我们把日志贴出来,常见的日志就是时间、级别、详细信息;
  • 2019-09-21 13:25:31,527 INFO
    org.apache.hadoop.hdfs.server.common.Storage: Using 1 threads to
    upgrade data directories
    (dfs.datanode.parallel.volumes.load.threads.num=1, dataDirs=1)
  • 2019-09-21 13:25:31,532 INFO
    org.apache.hadoop.hdfs.server.common.Storage: Lock on
    /dfs/dn/in_use.lock acquired by nodename 21317@hadoop002

我们既然要用到Spark,使用DF操作,就是要使用RDD+schema来进行操作;

2、改造日志,改造成带有schema信息的;

  • cluster --> 选中HDFS --> configuration --> 选中NameNode,输入LOG进行搜索;
    大数据实战课 - 生产预警平台01_第1张图片
    NameNode Logging Advanced Configuration Snippet (Safety Valve):后面跟上这样一段话:
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)。
大数据实战课 - 生产预警平台01_第2张图片

那我们想要有Schema,最好就是构建JSON格式,并且JSON格式能够转换成DF的;

生产上每台机器不可能只运行1个服务,肯定是多个服务并存的,在我们采集这条数据的时候,我们要明白这条数据来自哪台机器;

  • 假设我们把所有的日志都放到一个文件中,任意抽取出一条数据,我们并不知道这条数据来自哪里,所以我们需要添加两列:机器名称和服务名称。

1.3 flume的二次开发

  • hadoop-cmf-hdfs-DATANODE-hadoop002.log.out,服务一直写的就是这个文件,写满100M就切换,什么意思呢?
  • 写满100M,文件进行重命名,mv hadoop002.log
    hadoop002.log1,touch的新文件还是hadoop002.log。

NameNode Logging Threshold:

NameNode Max Log Size:NameNode Default Group:200MB

NameNode Maximum Log File Backups:NameNode Default Group:10

  • 每隔200MB就切换到下一个文件,且每份文件保留10份。

我们想个问题,我们使用Exec Source就够了,思考:我们的服务挂了,数据丢失一点有没有关系?
不同的场景采用不同的source,在生产过程中,采用flume是没有发生过故障的,我们选择exec source

  • flume-ng的tail -f参数所诱发的血案:

http://blog.itpub.net/30089851/viewspace-2134067/
原因是tail -f 文件被切走之后新建的原文件,tail -f不能识别。

1.4 生产flume源码导入IDEA

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 &

你可能感兴趣的:(CDH,Kafka)