利用大数据技术实现日志记录与分析
鸣宇淳 博客园

整体分三步:

1、记录日志

1、记录日志采用UDP协议写入大数据平台,大数据平台采用Hive表来存储日志信息。

2、写入日志的工作,封装了一个Auto.Lib3.Dealer.Log.dll,这个dll要依赖ZooKeeperNet.dll  log4net.dll。这三个dll文件地址如下:

dll文件

TFS上路径

Auto.Lib3.Dealer.Log.dll

$/dealer/MCH/CommonLib/Auto.Lib3.Logging.dll

ZooKeeperNet.dll 

$/dealer/MCH/CommonLib/ZooKeeperNet.dll 

log4net.dll

$/dealer/MCH/CommonLib/log4net.dll

2、分析日志

可以在HUE里分析日志,也可以用Hadoop客户机分析日志,分析日志就是从Hive表里读取数据,进行各种变换数据(分组、排序、算术运算等)得到想要的结果的过程。

可以将分析的结果数据导出到SQL Server中,用于显示或者导出

3、显示分析结果

将分析结果用各种方式展示给用户,常见的显示方式有:图标、列表、导出Excel

技术架构

http://wiki.corpautohome.com/download/attachments/69312085/dealerlog.png?version=2&modificationDate=1469060114519

1.net站点调用Auto.Lib3.Dealer.Log.dll来写日志,传递的参数只有一个日志数据,另外需要配置一个 zookeeper集群的连接信息(包括IP和端口号),参数名为:zk.connect

2Auto.Lib.Dealer.Log.dll 封装了两部分内容:Zookeeper客户端和UDP客户端。

UDP客户端负责将日志信息发送给UDP服务器,因为UDP服务器是个集群,UDP不知道要发送给那个UDP服务器,所以要去Zookeeper客户端查询哪些UDP服务器是当前可用的。

Zookeeper客户端负责从Zookeeper集群查询可用的UDP服务器列表,并实时监听UDP服务器列表的变化,一旦UDP服务器列表有变化,就能监听到,并更新存储在Zookeeper客户端的可用UDP服务器列表,供UDP客户端使用。

3Zookeeper集群用来保证UDP集群的高可用,(高可用的含义是:集群中就算有一部分服务器宕机,也能保证正常地对外提供服务。)

·        Zookeeper集群能够保证UDP服务高可用的原理是:UDP集群中各个机器都定时地给Zookeeper发送心跳,告诉Zookeeper我还活着,可以提供服务,一旦Zookeeper检测不到某一台UDP服务器发送来的心跳后,就从可用服务器列表中,将这台UDP服务器删除掉,同时会通知所有正在监听的Zookeeper客户端,Zookeeper客户端刷新可用UDP服务器列表。这样就保证这些客户端能及时知道UDP服务器集群的变化,一直都是使用可用的UDP服务器,达到UDP集群的高可用目的

·        选举制度Zookeeper集群也能保证自身的高可用,保证自身高可用的原理是,Zookeeper集群中的各个机器分为LeaderFollower两个角色,写入数据时,要先写入LeaderLeader同意写入后,再通知Follower写入。客户端读取数时,因为数据都是一样的,可以从任意一台机器上读取数据。
这里Leader角色就存在单点故障的隐患,高可用就是解决单点故障隐患的。Zookeeper从机制上解决了Leader的单点故障问题,Leader是哪一台机器是不固定的,Leader是选举出来的。选举流程是,集群中任何一台机器发现集群中没有Leader时,就推荐自己为Leader,其他机器来同意,当超过一半数的机器同意它为Leader时,选举结束,所以Zookeeper集群中的机器数据必须是奇数。这样就算当Leader机器宕机后,会很快选举出新的Leader,保证了Zookeeper集群本身的高可用。

·        写入高可用:集群中的写入操作都是先通知LeaderLeader再通知Follower写入,实际上当超过一半的机器写入成功后,就认为写入成功了,所以就算有些机器宕机,写入也是成功的。

·        读取高可用:zookeeperk客户端读取数据时,可以读取集群中的任何一个机器。所以部分机器的宕机并不影响读取。

4UDP服务器负责接收日志数据,并定时地写入Hive表。

5Hive表中的数据实际上是存储在HDFS上的,HDFS是分布式文件系统,在HDFS上的文件是先切分为块,然后将各个块分布式地存储在很多DataNode上的,一个DataNode就是一台机器,同时每一个块会在不同的机器上存储多个副本,当某一个DataNode宕机时,可以用其他副本读取数据,这样存储方式也是高可用的。

到此,日志记录过程结束!

=====================================================================

接下来,是日志的分析、显示过程。

6、日志的分析在Hadoop客户机上进行,Hadoop客户机是一个可以使用Hadoop集群的机器,在Hadoop客户机上利用Hive语句来查询统计数据,将统计的结果数据存储在HDFS上,再利用Sqoop工具导出到SQL Server库中。

7、接下来是将数据显示的过程,一般是将Sql server库中的数据用程序变成图表、列表、导出Excel的方式给用户来看。

记录日志代码实现

1、日志格式说明

(1) 最终发给UDP服务器的日志格式如下:

日志类型名称|字段\t字段\t字段\t字段\t字段\t字段\t字段\t字段

字段的顺序要跟hive表的字段顺序完全一致,hive表的创建是让大数据部门的人员创建的。

(2) Auto.Lib3.Dealer.Log.HadoopRecort类说明

HadoopRecort有两个参数:TableName string  ValueList (List<string>),分别对应于日志格式中 | 前一部分和后一部分。

分析日志代码实现

前面已经将数据存储在了Hive表上,接下来就是分析数据了。

1、临时性的分析日志可以用HUE系统来利用Hive 语句来查询统计。

可以用HUE来查询统计数据。

HUE方式可以列表显示分析结果,也可以将分析结果导出到Excel

2、利用Hadoop客户机来分析

这种方式可以将分析结果导出到Sql Server 数据库里。

关于Auto.Lib3.Dealer.Log.dll实现

这个DLL功能可以分为两部分:Zookeeper客户端的封装、对UDP客户端的封装

一、Zookeeper客户端

1、封装Zookeeper客户端的原因

UDP服务来接收日志信息,目前部署了7UDP服务器集群,利用Zookeeper来保证UDP服务的高可用。Zookeeper是个本身就高可用的集群,它能帮助其他集群实现高可用。

Zookeeper实现高可用的原理是:每台UDP服务器定时向Zookeeper集群发送心跳报告自己还活着,Zookeeper集群会记录当前活着的可用UDP服务器列表,并供Zookeeper客户端查询。Zookeeper客户端会在Zookeeper集群上注册一个监听,当可用UDP服务列表发生变化时,会实时通知Zookeeper客户端,从而zookeeper客户端可以实时更新自己的列表,保证zookeeper客户端连接的都是可用的UDP服务器。

所以,就封装了一个Zookeeper客户端组件,Auto.Lib3.Dealer.Log.dll 中发送日志时,首先要根据Zookeeper客户端查询可用的UDP服务器列表。

2、预期的代码介绍

1zookeeper客户端初始化时执行initZookeeper方法,来实例化一个客户端并建立一个监听。

2refreshIp 方法是从zookeeper集群上查询目前可用的udp服务列表。

3GetNextUDPServer方法是publice方法,是随机从可用的服务器列表中取一个,提供给调用方。

4Watcher类是监听类,当zookeeper集群中的可用的UDP服务器列表发送变化时,会实时通知这个监听类,并执行这个类中的Process方法,这个方法里,重新刷新可用的UDP服务器列表。

二、UDP客户端

1、其他应用程序通过调用Auto.Lib3.Dealer.Log.dll中的UDP客户端来发送日志。

2、代码介绍

主要代码在UDPClientUDPAgent类中

(1) UDPClient类中实现对日志信息的拼接和发送

(2) UDPAgent类是个代理类,创建了一个线程池,以多线程方式发送UDP请求。因为是新开线程发送日志,所以发送日志对主体原有业务线程性能影响不大。


CIO之家 www.ciozj.com 公众号:imciow
关联的文档
也许您喜欢