巧用字典树算法,轻松实现日志实时聚类分析

by 田富龙

日志分析对于企业运维来说尤为重要,运维人员如不能实时了解服务器的安全状况,会给企业造成难以估计的损失。对日志进行分析,不仅可以了解到软、硬件设备的运行状况,还可以了解到报错日志的源头、服务器上正在发生的安全事件,判断错误是由应用引发的还是系统本身引起的,从而及时进行补救,以提高企业软、硬件设备的高可用性。
然而,随着服务器数量逐渐增加,日志数据也与日俱增,面对这种境况,利用传统的方式对日志进行分析,显然已经不能满足企业的要求。此时,基于AI技术的日志分析方式就显得尤为重要。
本文提出的实时日志聚类算法,通过提取日志模板方式,能够有效帮助运维人员进行诊断以及定位问题,提高解决问题的效率,从而起到事半功倍的效果。

在这里,我们将介绍实时日志聚类算法中用到的子算法–字典树,它能极大提升日志聚类算法的效率,使实时日志聚类算法能够在极短的时间内,从海量的日志信息中提取出日志模板。
字典树(Trie),又称前缀树,是哈希树(Hash Tree)的一种变种。它的核心思想是以空间换时间,常常用于统计、排序和保存大量的字符串(但不仅限于字符串)。在Trie的每个 Node中保存一个字符以及该节点的所有子节点,并且每个Node中带有一个标志位,用来标识由根节点出发到该节点为止是否能组成一个完整的字符串。
通常规定根节点对应空字符串,由于Trie是一种有序树结构,所以同一个节点的所有子孙节点都有相同的前缀。一般情况下,不是所有的节点都能组成一个完整的字符串,只有叶子节点和部分内部节点所对应的节点才能组成一个完整的字符串。
字典树的一个典型应用是,用于搜索引擎系统中的文本词频统计,它的最大优点是:利用字符串的公共前缀来减少查询时间,最大限度地减少无谓的字符串以达到提高效率的目的,查询效率高。
字典树的使用,主要包含插入、查找、删除三方面:
插入
例如,向字典树中插入useless、hope、inter三个字符串,字符串中的每个字符作为一个单独的Node插入到字典树中,每个Node包含两部分:
①根节点开始到该节点为止是否为一个完整的单词
②节点的所有子节点,用map来保存
当字符串插入完成之后,字典树的结构如下图所示,其中红色节点表示该节点是否为一个完整字符串的结尾。

插入useless过程
在此基础上,继续插入单词interact,如下图所示:

插入单词interact过程
查找
字典树的查找比较简单,遍历查找字符串的字符,如果每个节点都存在,并且待查找字符串的最后一个字符对应的Node的isWord属性为True,则表示该单词存在。如字符串apple存在,app则不存在,因为p的isWord属性为False,不对应一个完整字符串的结束。
删除
字典树的删除操作主要有以下2种情况:
1)待删除字符串是另一个字符串的前缀
如果待删除的单词是另一个单词的前缀,只需要把该单词的最后一个节点的 isWord 属性值改成False即可。比如Trie中存在
inter 和interact 这两个字符串,若要删除
inter 字符串,只需要把字符 r 对应的Node的 isWord 属性改成 False,如下图所示:

字典树删除inter过程
2)待删除字符串中对应的Node包含多个分支
如果待删除的字符串中字符对应的Node可能有多个分支,需要从该字符串最后一个字符对应的Node开始递归向上进行删除,若节点没有子节点,则将该节点删除,直到遇到节点有多个子节点,递归停止。例如在Trie中删除hope、interest字符串过程,如下图所示:

字典树删除hope过程

字典树删除interest过程
字典树算法是典型的空间换时间的算法,虽然对空间的消耗很大,但是利用字符串的公共前缀来降低查询时间,查询效率非常高;而且也可以使用压缩字典树(Compressed Trie)来降低对内存的消耗,增加硬件资源的有效利用率。

原文地址:https://blog.51cto.com/14281532/2448717

时间: 2024-08-28 19:23:32

巧用字典树算法,轻松实现日志实时聚类分析的相关文章

Trie字典树算法

特性 Trie树属于树形结构,查询效率比红黑树和哈希表都要快.假设有这么一种应用场景:有若干个英文单词,需要快速查找某个单词是否存在于字典中.使用Trie时先从根节点开始查找,直至匹配到给出字符串的最后一个节点.在建立字典树结构时,预先把带有相同前缀的单词合并在同一节点,直至两个单词的某一个字母不同,则再从发生差异的节点中分叉一个子节点. 节点结构:每个节点对应一个最大可储存字符数组.假设字典只存26个小写英文字母,那么每个节点下应该有一个长度为26的数组.换言说,可存的元素类型越多,单个节点占

使用kibana和elasticsearch日志实时绘制图表

前言: 此文接的是上篇,上次的内容是,用python操作elasticsearch存储,实现数据的插入和查询.  估计有些人一看我的标题,以为肯定是 logstash kibana elasticsearch的组合.这三个家伙也确实总是勾搭在一块. 其实logstash是可以被别的替换,比如常见的fluented .剩下的那两个,kibana和elasticsearch是一伙的,不好做分离. 这次用的不是那种开源的.cs模式日志收集应用,还真不是.而是自己直接从程序里面把日志打到elastics

在Spring中轻松写日志

最近觉得写的一点代码(JAVA),还觉得颇为自得,贡献出来供大家参考. 首先,先上代码: @Controller public class Controller1{ @WriteLog(value = "${p0.username}从${ctx.ip}登录, 登录${iif(ret.success,'成功','失败')}") public Object login(Login loginObj, HttpServletRequest req){ //blablabla... } } 在

go路由httprouter中的压缩字典树算法图解及c++实现

目录 go路由httprouter中的压缩字典树算法图解及c++实现 前言 httprouter简介 压缩字典树 概念 插入操作 查询操作 c+++实现 go路由httprouter中的压缩字典树算法图解及c++实现 @ 前言 准备从嵌入式往go后端转,今年准备学习一下gin框架,决定先从这个轻量级的路由请求器着手,本文讲讲它用到的压缩字典树算法. httprouter简介 HttpRouter是一个Go编写的轻量级的高性能Http请求路由器(也可称为多路选择器multiplexer简称mux)

消息队列_RabbitMQ-0003.深入RabbitMQ节点/配置/管理及日志实时化?

理解节点: 说明: 节点是指Erlang节点,而且节点之间支持相互通信,RabbitMQ应用跑在Erlang节点之上,应用崩溃,Erlang节点会自动尝试重启应用程序,前提是Erlang本身没有崩溃,节点日志默认位于var/log/rabbitmq/[email protected]log 基本管理: 启动节点: rabbitmq-server -detached 关闭节点: rabbitmqctl stop -n [email protected] 说明: rabbitmq-server启动后

日志实时收集和计算的简单方案

作为互联网公司,网站监测日志当然是数据的最大来源.我们目前的规模也不大,每天的日志量大约1TB.后续90%以上的业务都是需要基于日志来完 成,之前,业务中对实时的要求并不高,最多也就是准实时(延迟半小时以上),因此,我们使用Flume将数据收集到HDFS,然后进行清洗和分析. 后来,根据业务需要,我们有了两个Hadoop集群,并且部署在不同的地方(北京和西安),而所有的日志收集服务器在北京,因此需要将日志数据通过外网传输到西安,于是有了这样的部署: 很快,通过Flume流到西安Hadoop集群的

开源分布式搜索平台ELK+Redis+Syslog-ng实现日志实时搜索

logstash + elasticsearch + Kibana+Redis+Syslog-ng ElasticSearch是一个基于Lucene构建的开源,分布式,RESTful搜索引擎.设计用于云计算中,能够达到实时搜索,稳定,可靠,快速,安装使用方便.支持通过HTTP使用JSON进行数据索引. logstash是一个应用程序日志.事件的传输.处理.管理和搜索的平台.你可以用它来统一对应用程序日志进行收集管理,提供 Web 接口用于查询和统计.其实logstash是可以被别的替换,比如常见

CentOS7搭建开源分布式搜索平台ELK实现日志实时搜索并展示图表

    一.简介  Elasticsearch是个基于Lucene实现的开源.分布式.restful的全文本搜索引擎,此外他还是一个分布式实时文档存储,其中每个文档的每个filed均是可被索引的数据,且可被搜索,也是一个带实时分析功能的搜索引擎,能够扩展至数以百计的节点实时处理PB级别的数据.它的特点有:分布式,零配置,自动发现,索引自动分片,索引副本机制,restful风格接口,多数据源,自动搜索负载等.日志主要包括系统日志.应用程序日志和安全日志.系统运维和开发人员可以通过日志了解服务器软硬

构建企业日志实时查看系统log.io

软件介绍: log.io 是一个实时日志监控工具,采用 node.js + socket.io 开发,使用浏览器访问,每秒可以处理超过5000条日志变动消息.有一点要指出来的是 log.io 只监视日志变动并不存储日志,和其他的监控工具一样,log.io 也采用服务器-客户端的模式.log.io 由两部分组成:server 和 harvester, server 运行在机器 A(服务器)上监视和纪录其他机器发来的日志消息:log harvester 运行在机器 B(客户端)上用来监听和收集机器