【具体实施方式】
为使本发明实施例的目的、技术方案和优点更加清楚,下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有作出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
图1为本发明一实施例提供的日志数据处理***的结构示意图。如图1所示,该***包括:日志宿主机100和计算节点200。
其中,日志宿主机100是指产生日志数据的各种设备,例如可以是计算机、生产***的服务器等。计算节点200是负责对日志数据进行处理的设备,例如可以是Hadoop中的Map/Reduce节点。
日志数据产生后会存储在日志宿主机100上的日志文件中。通常,日志数据在日志宿主机100上并不是永久保留,一般是按天滚动,保留固定天数之后会被删除,但是一般情况下日志数据在日志宿主机100上的保留时间已经足够满足以实时分析为主要目标的监控计算等场景。
日志宿主机100本身可以提供日志的查询服务。但是,日志宿主机100一般是直接向最终用户提供服务的,不能因为日志分析而消耗过多性能。为了尽量不影响日志宿主机100的性能,本实施例在日志宿主机100上部署客户端代理装置11(如图1所示),由客户端代理装置11提供日志查询功能,并且尽量将日志查询功能带来的性能消耗局限在必需的网络带宽上,不产生其他性能消耗。
为实现上述目的,本实施例的客户端代理11需要为日志宿主机100在不同时间产生的日志数据创建用于指示该日志数据在日志文件中的位置的位置索引。这样,客户端代理装置11就可以根据位置索引快速找到待查询的日志数据,降低对日志宿主机100的性能消耗。
其中,客户端代理装置11提供日志查询功能的过程如图2所示。图2为本发明一实施例提供的日志数据处理方法的流程示意图。如图2所示,该方法包括:
201、部署于日志宿主机上的客户端代理装置接收计算节点发送的查询请求,该查询请求包括:日志文件标识和时间段标识。
202、客户端代理装置根据上述日志文件标识和时间段标识,获取上述时间段标识所标识的时间段内产生的日志数据的位置索引,该位置索引用于指示该时间段内产生的日志数据在上述日志文件标识所标识的日志文件中位置。
203、客户端代理装置根据上述时间段内产生的日志数据的位置索引,从日志宿主机上的上述日志文件中获取上述时间段内产生的日志数据。
204、客户端代理装置将上述获取的上述时间段内产生的日志数据传输给计算节点,以供计算节点进行处理。
具体的,在计算节点的任务调度驱动作业时,向客户端代理装置发送查询请求,以请求获取作业所需的日志数据。计算节点会在查询请求中携带用于标识所请求获取的日志数据的信息,例如可以是日志文件标识和时间段标识。其中,日志文件标识用于标识所请求获取的日志数据所在的日志文件;而时间段标识用于标识所请求获取的日志数据产生的时间段。其中,日志数据所在的日志文件结合日志数据产生的时间段可以唯一确定日志数据。值的说明的是,用于标识所请求获取的日志数据的信息并不限于日志文件标识和时间段标识。其中,根据日志数据的存储格式或方式的不同,标识日志数据的方式也会有所不同。
客户端代理装置接收计算节点发送的查询请求,对查询请求进行解析,从中获取日志文件标识和时间段标识。之后,客户端代理装置根据日志文件标识和时间段标识,确定用于指示在该时间段标识所标识的时间段内产生的日志数据在上述日志文件标识所标识的日志文件中的位置的位置索引。在此说明,计算节点所请求获取的日志数据是指在时间段标识所标识的时间段内产生且存储于日志文件标识所标识的日志文件中的日志数据。其中,不同类型的日志数据存储在不同的日志文件中。
接着,客户端代理装置根据所确定的位置索引,从上述日志文件标识所标识的日志文件中获取相应的日志数据。最后,客户端代理装置将所获取的日志数据传输给计算节点。计算节点接收到客户端代理装置传输的日志数据后,可以按照作业流程对日志数据进行处理。
在本实施例中,在日志宿主机上部署客户端代理装置,由客户端代理装置提供日志查询功能。与现有技术相比,本实施例提供的日志数据处理方法中节约了日志数据从日志宿主机到HDFS存储节点的传输时间,因此提高了处理日志数据的实时性;另外,由于不需要专门的HDFS存储节点,同时还节约了存储资源。
进一步值得说明的是,基于本实施例提供的日志数据处理方法,在计算节点出现机器故障或者重启导致某个作业任务失败的情况下,完全可以在计算节点恢复正常之后尽快重新调度该作业任务,保证作业任务的完成。具体理由是:在本实施例中,作业任务所需的日志数据在短时间内依然存储在日志宿主机上,并且仍由客户端代理装置提供着该日志数据的查询服务。由此可见,采用本实施例提供的方法还可以不用花费大量精力去解决高可靠通讯、计算冗余、持久化状态等复杂难题。
在此说明,本实施例提供的方法适用于任何日志数据处理场景。其中,一种常用的日志数据处理场景是基于日志分析的监控场景。本发明以下实施例将重点针对基于日志分析的监控场景,详细说明本发明技术方案。
在基于日志分析的监控场景下,Hadoop的计算任务都是周期性的,这里的周期性是指每次计算任务都要处理相同时间内的日志数据,例如每个任务周期均需处理一分钟内产生的日志数据以产出这一周期的日志分析结果,这种任务需要查询的是某分钟,例如2014-11-1111:11这一分钟内产生的日志数据。基于此,本实施例设定单位周期,以单位周期内产生的日志数据为最小数据单位进行存储和查询。其中,单位周期可以是1秒、1分钟、2分钟、3分钟、1小时等,具体可以根据用户需求而定。基于此,上述时间段标识所标识的时间段包括至少一个单位周期。意味着,计算节点一次查询请求可以查询至少一个单位周期内产生的日志数据。
基于上述,客户端代理装置应该为日志宿主机在每个单位周期内产生的日志数据创建位置索引。
在一可选实施方式中,客户端代理装置可以自日志宿主机产生日志数据开始,为每个单位周期内产生的日志数据创建位置索引。
在另一可选实施方式中,考虑到计算节点有可能从某个时间开始才启动对日志宿主机产生的日志数据的处理任务,这样为了减轻客户端代理装置的处理负担,降低对日志宿主机的性能消耗,客户端代理装置可以根据计算节点发送的启动指示,开始为日志宿主机产生的日志数据创建位置索引。具体的,计算节点打算在第一时间启动对日志宿主机产生的日志数据进行处理的任务时,向客户端代理装置发送启动指示,该启动指示用于指示自第一时间开始为每个单位周期内产生的日志数据创建位置索引。相应的,客户端代理装置接收计算节点发送的启动指示,根据该启动指示,自第一时间开始为每个单位周期内产生的日志数据创建位置索引,并将自第一时间开始的每个单位周期和为每个单位周期内产生的日志数据所创建的位置索引对应存储到位置索引文件中。
对于自第一时间开始的每个单位周期,是指从第一时间开始计算,之后的每个单位周期。例如,单位周期是1分钟,第一时间是指2014-06-30-11-11这一分钟,则客户端代理装置需要为2014-06-30-11-12这一分钟以及之后每分钟内产生的日志数据创建位置索引。
值得说明的是,位置索引可以用日志数据在日志文件中的起始字节位置和日志数据的字节长度来表示;或者,位置索引也可以用日志数据在日志文件中的起始字节位置和结束字节位置来表示。
具体的,对于第一时间之后的每个单位周期,客户端代理装置对该单位周期的上一个单位周期的尾部数据进行解析,确定该单位周期内产生的日志数据的起始位置,并对该单位周期的尾部数据进行解析,确定该单位周期内产生的日志数据的长度,作为该单位周期内产生的日志数据的位置索引。其中,该单位周期的尾部数据是指在该单位周期即将结束时产生的日志数据。
简单来说,上述实施方式主要是利用了日志打印的特点,即时间增序打印(意思是不可能出现较晚产生的日志数据打印在较早产生的日志数据之前),在相邻单位周期交替的时刻,客户端代理装置从单位周期内产生的日志数据的末尾读取少量字节进行解析,确定当前单位周期内产生的日志数据的结束点以及下一单位周期内产生的日志数据的起始点。
例如,对于单位周期T和单位周期T+1,如果对单位周期T内产生的日志数据的末尾进行分析,确定该末尾数据的下一字节是单位周期T+1内产生的日志数据,那说明在这个位置单位周期T内产生的日志数据已经全部结束,而单位周期T+1内产生的日志数据刚刚开始,这个末尾数据就是两个相邻单位周期的交替点。找到交替点之后,客户端代理装置就可以得到单位周期T内产生的日志数据的结束点位置(其中,根据起始点位置和结束点位置可以计算出日志数据的字节长度),以及单位周期T+1产生的日志数据的起始点位置;如此循环反复,就能得到每个单位周期内产生的日志数据的起始点位置和字节长度,即位置索引。
值得说明的是,在实际应用中,有可能存在日志数据缓冲打印的情况(即某个时刻产生的日志数据可能延迟几秒才会打印),对该情况,客户端代理装置可以考虑推迟创建位置索引,具体推迟多长时间、一共容忍推迟多少次等可以根据实际情况进行调整。
经过上述位置索引创建过程所创建的位置索引可以存储到位置索引文件中,如表1所示,是位置索引文件的一种实现结构。
表1
单位周期 |
起始点位置 |
字节长度 |
16:03 |
xxx1 |
yyy1 |
16:04 |
xxx2 |
yyy2 |
16:05 |
xxx3 |
yyy3 |
16:06 |
xxx4 |
yyy4 |
结合上述位置索引文件,本发明另一实施例提供的日志数据处理方法的流程如图3所示,该方法包括:
301、部署于日志宿主机上的客户端代理装置接收计算节点发送的查询请求,该查询请求包括:日志文件标识和时间段标识,该时间段标识所标识的时间段包括至少一个单位周期。
302、客户端代理装置根据上述日志文件标识,确定日志文件标识所标识的日志文件对应的位置索引文件,该位置索引文件对应存储有单位周期和单位周期内产生的日志数据的位置索引。
303、客户端代理装置根据上述时间段标识,在上述位置索引文件中进行匹配,并判断在位置索引文件中是否匹配到上述时间段包括的单位周期;如果是,则执行步骤304;如果否,则执行步骤305。
304、客户端代理装置获取上述位置索引文件中匹配到的单位周期内产生的日志数据的位置索引,并执行步骤306。
305、客户端代理装置根据上述日志文件标识,对上述日志文件中的日志数据进行解析,确定上述时间段包括的每个单位周期内产生的日志数据的位置索引,并执行步骤306。
306、客户端代理装置根据上述时间段包括的每个单位周期内产生的日志数据的位置索引,从上述日志文件中获取上述时间段包括的每个单位周期内产生的日志数据。
307、客户端代理装置将上述时间段包括的每个单位周期内产生的日志数据传输给计算节点,以供计算节点进行处理。
在本实施例中,客户端代理装置在位置索引文件中查找查询请求中时间段标识所标识的时间段内产生的日志数据的位置索引。关于位置索引文件可参见前述实施例描述的方式获得。
考虑到有些日志数据的位置索引是从计算节点打算对该类日志数据进行处理的第一时间开始创建的,所以位置索引文件中有可能不存在第一时间之前产生的日志数据的位置索引。
因此,对于未在位置索引文件中匹配到上述时间段包括的单位周期时,客户端代理装置可以根据上述日志文件标识,确定日志文件;然后采用二分法,对上述日志文件中的日志数据进行解析,获得上述时间段包括的每个单位周期内产生的日志数据的位置索引。相应的,客户端代理装置还可以将采用二分法所获得的上述时间段包括的每个单位周期内产生的日志数据的位置索引以及对应的单位周期存储到位置索引文件中。
以上述时间段包括的单位周期为单位周期T为例,则采用二分法,对日志文件中的日志数据进行分析,获得单位周期T内产生的位置索引的过程包括:
步骤a1、如果已经预知单位周期T1和单位周期T2内产生的日志数据的位置索引,且T1<T<T2,可以确定T内产生的日志数据在T1和T2产生的日志数据之间;
值得说明的是,如果无法确定与T最邻近的T1和T2,则可以用日志文件的头尾位置对应的单位周期分别作为T1和T2。
步骤a2、在T1和T2产生的日志数据的中间位置捞取少量字节的日志数据解析得到单位周期Tn;
步骤a3、若Tn<T(即Tn早于T),将Tn作为T1,并返回执行步骤a1;
步骤a4、若Tn>T(即Tn晚于T),将Tn作为T2,并返回执行步骤a1;
步骤a5、若Tn=T,记录此条日志数据的起始点位置,并从起始点位置往前多次捞取一定字节的日志数据,直至找到单位周期T-1和T的交替点,并往后多次捞取一定字节的日志数据,直到找到T和单位周期T+1的交替点;通过两个交替点得到T内产生的日志数据的起始点位置和字节长度。
在实际应用场景中,一个每天1GB的日志文件所需要捞取的日志数据不到1MB,而且大部分只是分摊在一天里各个单位周期交替的时刻,采用上述实施例的方法进行日志数据的捞取,对日志宿主机的CPU和内存的消耗几乎可以忽略不计,但是却明显提高了捞取日志数据的效率,提高了处理日志数据的实时性。
基于上述各实施例或实施方式,客户端代理装置具体可以采用零拷贝(zerocopy)技术,将上述时间段内产生的日志数据传输给计算节点,从而在提高处理日志数据实时性的同时,进一步节约网络带宽。具体的,客户端代理装置用zerocopy来请求操作***内核(kernel)直接把硬盘上的日志数据传输给操作***内核级的套接字(socket),而不是通过用户级的应用程序传输,因此大大提高了客户端代理装置的性能,并且减少了操作***内核和用户模式之间的上下文切换。
需要说明的是,对于前述的各方法实施例,为了简单描述,故将其都表述为一系列的动作组合,但是本领域技术人员应该知悉,本发明并不受所描述的动作顺序的限制,因为依据本发明,某些步骤可以采用其他顺序或者同时进行。其次,本领域技术人员也应该知悉,说明书中所描述的实施例均属于优选实施例,所涉及的动作和模块并不一定是本发明所必须的。
在上述实施例中,对各个实施例的描述都各有侧重,某个实施例中没有详述的部分,可以参见其他实施例的相关描述。
图4为本发明一实施例提供的客户端代理装置的结构示意图。该客户端代理装置部署于日志宿主机上实现,如图4所示,该装置包括:请求接收模块41、索引获取模块42、数据获取模块43和发送模块44。
请求接收模块41,用于接收计算节点发送的查询请求,该查询请求包括:日志文件标识和时间段标识。
索引获取模块43,与请求接收模块41连接,用于根据请求接收模块41接收的日志文件标识和时间段标识,获取时间段标识所标识的时间段内产生的日志数据的位置索引,该位置索引用于指示时间段内产生的日志数据在日志文件标识所标识的日志文件中的位置。
数据获取模块43,与索引获取模块43连接,用于根据索引获取模块43获取的时间段内产生的日志数据的位置索引,从日志文件中获取时间段内产生的日志数据。
发送模块44,与数据获取模块43连接,用于将数据获取模块43获取的时间段内产生的日志数据传输给计算节点,以供计算节点进行处理。
在一可选实施方式中,上述时间段标识所标识的时间段包括至少一个单位周期。基于此,如图5所示,索引获取模块42的一种实现结构包括:确定单元421、匹配单元422、第一索引获取单元423和第二索引获取单元424。
确定单元421,与请求接收模块41连接,用于根据请求接收模块41接收的日志文件标识,确定日志文件对应的位置索引文件,该位置索引文件对应存储有单位周期和单位周期内产生的日志数据的位置索引。
匹配单元422,与请求接收模块41和确定单元421连接,用于根据请求接收模块41接收的时间段标识,在确定单元421确定的位置索引文件中进行匹配。
第一索引获取单元423,与匹配单元422连接,用于在匹配单元422在位置索引文件中匹配到时间段包括的单位周期时,获取位置索引文件中匹配到的单位周期内产生的日志数据的位置索引。
第二索引获取单元424,与匹配单元422连接,用于在匹配单元422未在位置索引文件中匹配到时间段包括的单位周期时,根据日志文件标识,对日志文件中的日志数据进行解析,确定时间段包括的每个单位周期内产生的日志数据的位置索引。
进一步,第二索引获取单元424具体可用于根据日志文件标识,确定日志文件,采用二分法,对日志文件中的日志数据进行解析,获得时间段包括的每个单位周期内产生的日志数据的位置索引。
基于上述,如图5所示,所述装置还包括:存储模块45,与第二索引获取单元424连接,用于将时间段包括的每个单位周期和第二索引获取单元424获得的时间段包括的每个单位周期内产生的日志数据的位置索引对应添加到位置索引文件中。
进一步,如图5所示,所述装置还包括:指示接收模块46和索引创建模块47。
指示接收模块46,用于接收计算节点发送的启动指示,该启动指示用于指示自第一时间开始为每个单位周期内产生的日志数据创建位置索引。
索引创建模块47,与指示接收模块46连接,用于自第一时间开始为每个单位周期内产生的日志数据创建位置索引,将自第一时间开始的每个单位周期和为每个单位周期内产生的日志数据所创建的位置索引对应存储到位置索引文件中。索引创建模块47与确定单元421连接,用于向确定单元421提供位置索引文件。
进一步,如图5所示,索引创建模块47的一种实现结构包括:索引创建单元471和存储单元472。
索引创建单元471,用于对于第一时间之后的每个单位周期,对该单位周期的上一个单位周期的尾部数据进行解析,确定该单位周期内产生的日志数据的起始位置,并对该单位周期的尾部数据进行解析,确定该单位周期内产生的日志数据的长度,作为该单位周期内产生的日志数据的位置索引;其中,该单位周期的尾部数据是指在该单位周期即将结束时产生的日志数据;
存储单元472,与索引创建单元471连接,用于将第一时间之后的每个单位周期和索引创建单元471为每个单位周期内产生的日志数据所创建的位置索引对应存储到位置索引文件中。
在一可选实施方式中,发送模块44具体可用于采用零拷贝技术,将上述时间段内产生的日志数据传输给计算节点。
本实施例提供的客户端代理装置,部署于日志宿主机上,根据计算节点的查询请求,确定需要查询的日志数据的位置索引,根据位置索引直接从日志宿主机上的日志文件中获取日志数据,再将所获取的日志数据传输给计算节点以进行计算处理,相当于在日志宿主机上直接实现了日志查询功能,使得日志数据的处理不再需要经过HDFS存储节点,节约了将日志数据传输到HDFS存储节点的时间,有利于提高处理日志数据的实时性。
所属领域的技术人员可以清楚地了解到,为描述的方便和简洁,上述描述的***,装置和单元的具体工作过程,可以参考前述方法实施例中的对应过程,在此不再赘述。
在本发明所提供的几个实施例中,应该理解到,所揭露的***,装置和方法,可以通过其它的方式实现。例如,以上所描述的装置实施例仅仅是示意性的,例如,所述单元的划分,仅仅为一种逻辑功能划分,实际实现时可以有另外的划分方式,例如多个单元或组件可以结合或者可以集成到另一个***,或一些特征可以忽略,或不执行。另一点,所显示或讨论的相互之间的耦合或直接耦合或通信连接可以是通过一些接口,装置或单元的间接耦合或通信连接,可以是电性,机械或其它的形式。
所述作为分离部件说明的单元可以是或者也可以不是物理上分开的,作为单元显示的部件可以是或者也可以不是物理单元,即可以位于一个地方,或者也可以分布到多个网络单元上。可以根据实际的需要选择其中的部分或者全部单元来实现本实施例方案的目的。
另外,在本发明各个实施例中的各功能单元可以集成在一个处理单元中,也可以是各个单元单独物理存在,也可以两个或两个以上单元集成在一个单元中。上述集成的单元既可以采用硬件的形式实现,也可以采用硬件加软件功能单元的形式实现。
上述以软件功能单元的形式实现的集成的单元,可以存储在一个计算机可读取存储介质中。上述软件功能单元存储在一个存储介质中,包括若干指令用以使得一台计算机设备(可以是个人计算机,服务器,或者网络设备等)或处理器(processor)执行本发明各个实施例所述方法的部分步骤。而前述的存储介质包括:U盘、移动硬盘、只读存储器(Read-OnlyMemory,ROM)、随机存取存储器(RandomAccessMemory,RAM)、磁碟或者光盘等各种可以存储程序代码的介质。
最后应说明的是:以上实施例仅用以说明本发明的技术方案,而非对其限制;尽管参照前述实施例对本发明进行了详细的说明,本领域的普通技术人员应当理解:其依然可以对前述各实施例所记载的技术方案进行修改,或者对其中部分技术特征进行等同替换;而这些修改或者替换,并不使相应技术方案的本质脱离本发明各实施例技术方案的精神和范围。