阅读《基于 Flink ML 搭建的智能运维算法服务及应用》一文后,对其中日志聚类算法有了些思考。
日志聚类,简而言之是对海量日志的分析;其分析处理链路可以分为如下流程:日志采集 -> 预处理 -> 分词和特征表示 -> 聚类和标注;也可以概述为数据收集及预处理、文本向量化、文本相似度计算、文本分类四部分。
针对如上的链路流程做一个拆分叙述。
常用的日志采集方案是写完数据库多写一遍ElasticSearch;目前我个人推荐的方案是基于Flink CDC组件来采集。
一般来说,预处理阶段是在业务中常用的一个阶段,根据业务的不同做不同的处理,比如精简文本删除不必要的语气词、标点符号、替换占位符等等。日志一般都是非结构化的文本类型数据,由于开发人员的开发习惯与团队开发规范的约束,每个人记录的日志模板可能是不一样的,因此,需要对日志文本做一次常见的预处理—————删除不必要的语气词等。
其实对于分词,我一开始想到的就是ElasticSearch中很重要的一个组件模块——————分析器。分析器由字符过滤器、分词器、词语(token)过滤器组成。在我看来,预处理流程与分词流程其实可以归纳为分析器的处理。
对于分词,当前主要有两种算法,一种是基于已有的词典库,一种是基于统计的机器学习。
基于词典的分词算法分为以下几种:正向最大匹配法、逆向最大匹配法和双向匹配分词法等。基于词典的分词算法是应用最广泛、分词速度最快的。基于统计的机器学习算法法是HMM、CRF、SVM、深度学习等算法,比如stanford、Hanlp分词工具是基于CRF算法。
常见的分词器都是使用机器学习算法和词典相结合,一方面能够提高分词准确率,另一方面能够改善领域适应性。
将分词后的词作为特征列表,基于此列表,对日志做向量化的构建。通过TF-IDF算法对关键词做统计分析,得到词向量后,再做一次相似度比较,最终就可以得到向量。
其实我理解这里就是在做文本相似度匹配的处理。一般都是处理文本向量化。
最后通过聚类算法:层次聚类算法、K-means算法等来得到我们的聚类结果,也就是各个日志模板所对应的日志类别。
在上份工作中,其实就遇到了类似的问题,当时我们有大量的日志数据,且需要基于这些日志数据做分析推送对应的解决策略以及解答给客户或是一线。但由于当时所有的开发人员都做的是业务开发,对机器学习及应用压根就不清楚(严格来说,都没有考虑过从这方面入手),所以导致当时的运维量和客户的反馈不太好;当时我花了不少时间分析过如何解决,受限于当时的认知与能力,画过一个简单的流程图,但很难落地,而且没有足够的理论与算法的支持,相比较现在的解决方案,那真是没眼看。目前来看,日志聚类的应用完全是可以落地到当时的业务上的。
参考