本发明涉及计算机技术领域,特别涉及一种分布式日志收集的系统和方法。
背景技术:
随着大数据时代的开启,每个公司都要面对如何收集每天产生的大量数据,以便在海量数据中掘金。
高可用性,高可靠性和可扩展性是所有日志收集系统都要解决的问题。
常用开源收集系统有Facebook的Scribe和Cloudera的Flume。总的来说,Scribe简单易用,但在容错与负载均衡上仍有欠缺。而Flume现在是Apache的子项目,本身提供可靠的数据传输服务。
Flume是Cloudera提供的日志收集系统,具有分布式、高可靠、高可用性等特点,对海量日志采集、聚合和传输,Flume支持在日志系统中定制各类数据发送方,同时,Flume提供对数据进行简单处理,并写到各种数据接受方的能力。
Flume的核心是把数据从数据源收集过来,再送到目的地。为了保证输送一定成功,在送到目的地之前,会先缓存数据,待数据真正到达目的地后,删除自己缓存的数据。
现有的flume更多用于离线日志收集,或离线与实时混用,混用会对维护及后续日志消费分析造成困扰,甚至不可用。
技术实现要素:
为了解决现有技术中的上述问题,本发明实施例提供了一种分布式日志收集的系统和方法。技术方案如下:
本发明提供了一种分布式离线日志收集的系统,其包括:
第一接入层,用于与客户端连接,接收HTTP协议数据上报并生成第一数据文件;
存储层;用于存储数据文件;
中心汇集层,用于汇集处理所述第一接入层生成的第一数据文件并写入到所述存储层。所述中心汇集层包含与所述存储层对接的适配器;所述存储层包含HDFS分布式文件系统。
本发明提供了一种分布式实时日志收集的系统,其包括:
第二接入层,用于与客户端连接,接收HTTP协议数据上报并生成第二数据文件;
处理层,用于处理所述第二接入层生成的第二数据文件。所述处理层是Kafka消息队列,其是一种分布式的,基于发布/订阅的消息系统。
本发明提供了一种分布式日志收集的系统,其包括:离线收集通道子系统和实时收集通道子系统;
其中所述离线收集通道子系统包括:
第一接入层,用于与客户端连接,接收HTTP协议数据上报并生成第一数据文件;
存储层;用于存储数据文件;
中心汇集层,用于汇集处理所述第一接入层生成的第一数据文件并写入到所述存储层;
其中所述实时收集通道子系统包括:
第二接入层,用于与客户端连接,接收HTTP协议数据上报并生成第二数据文件;
处理层,用于处理所述第二接入层生成的第二数据文件。
所述第一接入层和第二接入层共用一组HTTP服务器,每个HTTP服务器都有两个进程分别对应第一接入层和第二接入层。
所述第一接入层包括若干组连接的Nginx服务器和文件夹监控模块,该文件夹监控模块与中心汇集层连接,其用于通过监控文件夹方式读取所述第一数据文件;
所述第二接入层包括若干组连接的Nginx服务器和实时读取模块,该实时读取模块与所述处理层连接,其用于通过不间断循环方式读取第二数据文件。
本发明提供了一种分布式日志收集的方法,其包括:
架设由若干HTTP服务器组成的接入层,预先与客户端约定http协议报文,日志收集时,客户端主动向接入层发送数据报文;
将接收到的数据报文分别生成第一数据文件和第二数据文件;
读取所述第一数据文件和第二数据文件,汇集处理所述第一数据文件并写入到存储层,或/和将第二数据文件转发给处理层进行处理。
具体的,所述第一数据文件是按照离线收集的时延性生成的,第二数据文件是按照实时通道对时延性生成的;所述接入层运行有离线收集进程和实时收集进程,其中离线收集进程通过监控文件夹方式读取所述第一数据文件;实时收集进程通过不间断循环方式读取第二数据文件。
所述汇集处理所述第一数据文件采用负载均衡策略,达到负载均衡的目标,防止中心汇集层的单机失效问题。
通过本发明将日志收集的系统分为离线收集通道子系统和实时收集通道子系统,两个子系统均分层设计;通过对整个分布式系统的分层设计,再以不同的配置构建出适应不同任务的Flume进程,分配到各层中。按照本发明去构建日志收集系统,可以任意扩展以收集海量的日志,同时支持后端的实时或离线数据处理,并具有高可用性及高可靠性;本发明的优化在于实时与离线的通道分离,互不干扰,但能互相对照;在高可用及维护方面也更有优势。
附图说明
为了更清楚地说明本发明实施例中的技术方案,下面将对实施例描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。
图1是本发明一个实施例中提供的分布式日志收集系统的离线收集子系统图;
图2是本发明另一个实施例中提供的分布式日志收集系统的实时收集子系统图;
图3是本发明一个实施例中分布式日志收集方法的流程图。
具体实施方式
为使本发明的目的、技术方案和优点更加清楚,下面将结合附图对本发明实施方式作进一步地详细描述。
为了便于描述,首先对本发明实施例所涉及的相关知识进行详细描述。
首先对背景知识做一些介绍:Flume是一个从可以收集例如日志,事件等数据资源,并将这些数量庞大的数据从各项数据资源中集中起来存储的工具/服务。flume具有高可用,分布式,配置工具,其设计的原理也是基于将数据流,如日志数据从各种网站服务器上汇集起来存储到HDFS,HBase等集中存储器中。比如我们在做一个电子商务网站,然后我们想从消费用户中访问点特定的节点区域来分析消费者的行为或者购买意图.这样我们就可以更加快速的将他想要的推送到界面上,实现这一点,我们需要将获取到的她访问的页面以及点击的产品数据等日志数据信息收集并移交给Hadoop平台上去分析。而Flume正是帮我们做到这一点。现在流行的内容推送,比如广告定点投放以及新闻私人定制也是基于此。
本发明的目的是提供基于Flume的分布式架构设计,只要适度增加服务器,就可以使日志收集系统任意扩展,以适应海量数据收集。同时具备实时与离线的多通道后继服务能力。
本发明提供了一种分布式日志收集的系统。该系统包括:离线收集通道子系统和实时收集通道子系统。
参照图1,其中所述离线收集通道子系统包括:
第一接入层001,用于与客户端连接,接收HTTP协议数据上报并生成第一数据文件;该接入层包含若干组Nginx服务器(即0011),和文件夹监控模块即Flume_spool模块;Flume_spool模块通过监控文件夹,发现文件夹中的变更(如新增文件),及时读取该文件夹中离线数据文件片段传输到下一级采集模块
存储层003;用于存储数据文件;本实施例使用HDFS系统;
中心汇集层002,用于汇集处理所述第一接入层生成的第一数据文件并写入到所述存储层003;中心汇集层包含flume_collect模块和与存储层对接的适配器piver。
参照图2,其中所述实时收集通道子系统包括:
第二接入层101,用于与客户端连接,接收HTTP协议数据上报并生成第二数据文件;该接入层包含若干组Nginx服务器和实时读取模块即Flume_tail模块;Tail为一种linux命令,flume可集成Flume_tail模块的这种命令,达到不间断循环读取文件的目的,形成实时数据流;实际命令为:tail–f文件名。
处理层102,用于实时处理所述第二接入层生成的第二数据文件;本发明实施例使用Kafka消息系统来完成处理层的所有工作。
上述Kafka是最初由Linkedin公司开发,是一个分布式、分区的、多副本的、多订阅者,是一种分布式的,基于发布/订阅的消息系统,基于zookeeper协调的分布式日志系统(也可以当做MQ系统),常见可以用于web/nginx日志、访问日志,消息服务等等,Linkedin于2010年贡献给了Apache基金会并成为顶级开源项目。
上述第一接入层和第二接入层共用一组HTTP服务器,每个HTTP服务器都有两个进程分别对应第一接入层和第二接入层。
一起参照图1和图2,具体来讲:
(1)上述离线收集通道子系统分三层,接入层,中心汇集层,存储层。实时收集通道子系统只有两层,分别是接入层和处理层;Kafka作为实时收集系统的边界同时也是实时处理Storm平台的前端。
(2)上述的第一和第二接入层前端实质是一组web服务器,这些web服务器采用HTTP协议,除了可以使用Nginx服务器,也可以有多种替代组件。
(3)离线和实时通道的接入层共用同一批物理机器Nginx,即每个机器都有两个flume进程,Flume_spool为离线收集通道服务,Flume_tail为实时收集通道服务。接入层通过nginx的静态页面接受HTTP协议数据上报,上报数据被写成log文件(普通文件或FIFO文件)在接入层机器中轮转。离线收集通道Flume通过监控文件夹方式读取log文件(spool方式),实时通道Flume通过tail方式读取log文件即通过不间断循环读取文件的目的,形成实时数据流并分发。中心汇集层负责接收第一接入层Flume_spool模块读取的数据进行一定的汇总,再集中写到存储层中提供永久存储服务。
(4)离线收集通道的接入层到中心汇集层采用load_balance策略,达到负载均衡的目标,防止中心汇集层的单机失效问题。
(5)离线收集通道的中心汇集层的flume可以直接通过sink把数据写到HDFS中。图1中hcat为我们封装hive后一个客户端,hive是基于Hadoop的一个数据仓库工具,hcat是本发明将hive进行修改及封装后的工具,功能和hive一致;Hive的主要功能是可以将HDFS文件系统里的结构化的数据文件映射为一张数据库表,并提供简单的sql查询功能,可以将sql语句转换为MapReduce(Hapdoop的计算部分)任务进行运行。piver为flume与hcat数据对接的适配器。实际架构可按需选择直接写到HDFS或经适配器传输数据。
(6)实时收集通道逻辑上与离线收集通道分离,实时收集通道的数据文件不需要经由中心汇集层分拣到Kafka中。分离两个通道,并精简实时通道为两层结构,更具时效性。
参照图3,本发明实施例还提供了一种分布式日志收集的方法,其包括:
S01:架设由若干HTTP服务器组成的接入层,预先与客户端约定http协议报文,
S02:日志收集时,客户端主动向接入层发送数据报文;
S03:将接收到的数据报文分别生成第一数据文件和第二数据文件;
301:读取所述第一数据文件,汇集处理所述第一数据文件并写入到存储层;
302:读取第二数据文件将第二数据文件转发给处理层进行处理。
具体的,所述第一数据文件和第二数据文件是按照离线及实时通道对时延性的不同要求生成的,所述接入层运行有离线收集进程和实时收集进程,其中离线收集进程通过监控文件夹方式读取所述第一数据文件;
上述离线收集进程通过文件夹监控模块即Flume_spool模块读取所述第一数据文件;即通过监控文件夹,发现文件夹中的变更(如新增文件),及时读取该文件夹中离线数据文件片段传输到下一级采集模块即图1中的Flume_collect模块。
实时收集进程通过图2中的Flume_tail模块实时读取方式读取第二数据文件;Tail为一种linux命令,flume可集成Flume_tail模块的这种命令,达到不间断循环读取文件的目的,形成实时数据流。
所述汇集处理所述第一数据文件采用负载均衡策略,达到负载均衡的目标,防止中心汇集层的单机失效问题。
具体来说:本发明实施例的一种日志收集的完整过程如下:
(1)架设http服务器,本发明实施例使用Nginx服务器。Nginx服务器是一个高性能的HTTP和反向代理服务器,也是一个IMAP/POP3/SMTP服务器;其将源代码以类BSD许可证的形式发布,因它的稳定性、丰富的功能集、示例配置文件和低系统资源的消耗而闻名。
Nginx是一款轻量级的Web服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,并在一个BSD-like协议下发行。其特点是占有内存少,并发能力强,事实上Nginx的并发能力确实在同类型的网页服务器中表现较好。
预先与客户端约定http协议报文,用于承载上报数据;日志收集时,客户端主动向http服务器发送数据报文;
(2)按照离线及实时通道对时延性的不同要求,Nginx对同一报文,分别存储成普通文件或FIFO文件(即上述第一数据文件和第二数据文件),供后续flume消费;
(3)flume通过自定义配置,读取Nginx生成的普通文件或FIFO文件,再转普通文件发给下游的HDFS系统进行存储;或将FIFO文件转发给消息队列(例如Kafka)中进行处理。
Flume与HDFS间使用普通文件及自编写的piver对接,Flume与Kafka之间可通过Flume的配置文件对接;最终成为一体化的多通道日志收集装置。
本发明上述实施方式的有益效果如下:
本发明涉及大数据采集领域,其发明目的是针对目前没有一种成熟简单的海量日志收集的系统和架构,提出的一种基于Flume开源项目的分布式日志收集方法和架构。通过对整个分布式系统的分层设计,再以不同的配置构建出适应不同任务的Flume进程,分配到各层中。按照本发明去构建日志收集系统,可以任意扩展以收集海量的日志,同时支持后端的实时或离线数据处理,并具有高可用性及高可靠性。
本发明可以通过提出一个基于Flume的分布式数据收集架构,有效收集海量日志数据,各层相对独立,任一层达到容量上限可单独扩展,并不影响其它层次。充分考虑了离线分析和实时分析对数据源的指标要求。
上述本发明实施例序号仅仅为了描述,不代表实施例的优劣。
本领域普通技术人员可以理解实现上述实施例的全部或部分步骤可以通过硬件来完成,也可以通过程序来指令相关的硬件完成,所述的程序可以存储于一种计算机可读存储介质中,上述提到的存储介质可以是只读存储器,磁盘或光盘等。
以上所述仅为本发明的较佳实施例,并不用以限制本发明,凡在本发明的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。