《CLP: Efficient and Scalable Search on Compressed Text Logs》论文概括

CLP:压缩文本日志上进行高效和可扩展的压缩

一、问题定义:

本文介绍了CLP的设计和实现,CLP是一个能够无损压缩非结构化文本日志的工具,同时能够直接在压缩的数据上进行快速搜索。CLP是一个完整的端到端系统,用于读取、归档、搜索和分析日志信息;
要满足以下目标:
首先,日志是无损压缩的,用户可以删除原始日志,而且不用担心会对其进行破坏性的改变(例如,通过改变浮点值的精度)。第二,用户能够搜索他们的日志中的任何数值,这与基于索引的搜索不同,后者通常只允许搜索索引的数值。最后,CLP应该是高性能和可扩展的,用户可以用它来获取和搜索大量的日志数据,同时节省存储成本。

二、算法核心:

1. 基本概念
1.1 CLP的压缩包括两个步骤:首先,它将每个日志信息中高度重复的部分删除,并以特殊的格式进行编码,然后它将轻量级的压缩器应用于编码后的数据,进一步减少其大小。
1.2 CLP将每个消息分成三块。1)日志类型,通常是高度重复的静态文本;2)变量值;3)时间戳(如果消息包含时间戳)。CLP进一步将变量值分成两类,第一类是重复的,如各种标识符(如用户名),第二类是不重复的(如一项工作的完成时间)。第一类称为字典变量,第二类称为非字典变量。
1.3 一旦被解析,字典中的变量就存储在一个两级的变量字典中,被称为vDict,第一层将每个字典变量Schema映射到一个唯一的ID。每个Schema也被映射到一个指针上,该指针指向vDict的第二层,实际的变里值被存储在那里。


在图3中,Schema中的task ID、IP地址和container ID都被映射到第一层的ID 的0,1和2,而实际的变量值被存储在第二层。

1.4 非dictionary变量值会直接存储在编码的日志信息中。例如,"0.335"是使用IEEE-754标准讲行编码的,并存储为64位的编码信息中的值。CLP目前支持将浮点数和整数作为非字典变量进行编码。如果一个非字典变量不能在64位内精确编码(例如,它的值溢出),它将被存储为一个字典变量。非字典变量倾向于是唯一的值,就像计数器一样,所以它们不能从存储在字典中获益。论文了使用固定宽度的64位编码,而不是可变宽度的编码,因为它实现起来很简单,而且空间效率低下的问题会因为应用于编码数据的轻量级压缩器而有所缓解。
1.5 存储在日志类型的字典中(ItDict) ,以ID为索引:
1.5.1 CLP使用字节\X11来代表一个学典变量值。在\X11后面的一个或多个字节是一个索引,进vDict的第一层,也就是变量Schema的索引。在图3中,日志类型中的\X00、\X01和\X02是Schema的vDict中task ID、 IP地址和container ID的索引。
1.5.2 CLP使用\X12作为占位符来表示一个浮动点非字典值。
1.5.3 \X13,表示在原始日志文件中的“.”之前有一位数字,之后有三位数字,以确保浮点值可以无损解压。
1.6 CLP将编码后的信息输出为一个元组,其中有三个元素,如图3所示:一个64位的时间戳,一个32位的日志类型ID,以及一个64位变量ID和编码变量值的序列。之所以用固定长度64位表示时间戳,而不是变长,是因为扫描固定长度比扫描变长长度更快。
1.7 CLP支持不同的压缩模式,可以提供更好的压缩,但代价是性能略有下降。这是通过改变轻量级压缩机的设置来实现的。CLP目前有三种模式。

(1)"Default"模式使用3级Zstandard,同时对压缩速度和搜索性能进行了优化;
(2)"Archive"模式使用1级7z-lzma,提供更高的压缩率,但搜索性能略有下降;
(3)"Ultra"模式使用9级7z-lzma,提供更高的压缩率,但搜索性能进一步下降。CLP可以通过简单的解压和重新压缩片段在这些模式之间进行迁移。

2. 压缩算法

读入log文件,删除重复数据,并为它编码,以面向列的方式存储编码的信息,最初缓存在内存中,达到一定大小的时候需要写到磁盘上,但是写之前需要用Zstandard进行轻量级压缩。

以Figure3为例,一条log并为它编码;

2.1 读入一条log文件,信息如下:

2.2 对之进行标记,提取变量值,对“*”分割符进行标记,根据字典变量和非字典变量的规则定义,可以发现task_12,container_15,172.128.0.41可编码为字典变量,0.335可编码为非字典变量;转换变量结果见下图;例:task_12第一层ID为0,第一层ID是Schema的ID,第二层ID为8,8对应的value值是真实的值;

2.3 之后用\X11\X01,\X12\X13等类似的编码对整个log消息进行变量转换,变量转换规则见1.5 ,结果见下图:

2.4 最后对转换后变量log type dictionary进行编码,编码后的信息为一个元组,有三个元素,一个64位的时间戳,一个32位的日志类型ID,以及一个64位变量ID和编码变量值的序列。

3. 解压缩算法

CLP的解压过程通常是压缩过程的反转。给定一个编码后的消息,CLP使用该消息的log type ID,在ItDict中找到相应的日志类型。然后,CLP重建变量值并替换日志类型中的占位符。例如,CLP重新构建到图3中变量值值"task_12"的方法如下:日志类型中的第一个’\x11’,表明下是一个字典变量,所以CLP便用个一个字节’\X00’作为索引进入
vDict的第一层。然后,CLP使用存储的Variable values(本例中为8)中的索引,以索引vDict的相关第二层,并恢复了变量值"task12"。最后,CLP将时间戳转换回为文本并将其插入到信息中。

4. 搜索算法

CLP首先在搜索字符串的开头和结尾插入一个*_card,把他变成一个子串搜索。CLP可以识别一下tokens: “Task”,“assigned”, “to”, “container”, “172.128*”.但是,CLP并不将单个*_card视为token。例如,“Task”后面的*_card不会被当作token处理,然后将每个标记与所有的变量Schema进行比较,确定出“Task”,“assigned”, “to”,不符合任何Schema,因此他们是log type的一部分,其余两个标记有歧义,可以总结如下:前三个将“container”作为日志类型的一部分,而“172.128*”则作为IP地址的一部分、浮点数和分别是子查询1,2,3中的日志类型。

查询将分三步处理 首先,中在ItDict中搜索匹配的日志类型,只有当有一个匹配的日志类型时,它才会进入下一个步骤,在vDict中搜索字典变量。只有当每个字典变量至少有一个匹配的结果时,CLP才会进入第三步。它取匹配的日志类型和字典变里的段索引的交集,对于每一个段,CLP都会解压段,并搜索与编码查询匹配的编码信息。如果前两个步骤中的任何一个没有返回匹配的结果,或者段索引的交集是空的,那么子查询处理就会以不匹配返回。不同的子查询将被并行处理。
对于表1所示的六个子查询,只有第一个子查询将行使所有三个步骤,并返回图3所示的匹配日志信息。其他五个子查询的处理将在第一步后返回,因为生成的日志类型与ItDict中的任何日志类型不匹配(这些日志类型是不可能的).

三、实验

1. 实验设置
1.1 实验是在一个由16台Linux服务器组成的集群上进行的,这些服务器通过10GbE网络连接,每台服务器都有一个8核Intel Xeon E5-2630v3处理器和128GB的DDR4内存。除非另有说明,所有数据都存储在连接到每台机器的3TB(标记为3TB,实际大小2.73TB) 7200RPM SA TA硬盘上。
1.2 只修改了Elasticsearch和Splunk Enterprise的默认配置,以确保它们与CLP的搜索功能匹配,而不存储更多数据。
1.3 实验使用的日志数据集,“/var/log/*”语库中包含了过去6年/var/log/目录下所有由超过30个Linux服务器组成的集群生成的日志。OpenStack- 33GB日志集是通过在OpenStack上运行云可伸缩性基准测试工具Rally收集的。Apache- 6TB包含了美国证券交易委员会EDGAR系统在15年期间收集的Apache httpd访问日志。Hadoop- 14tb日志由三个Hadoop集群生成,每个集群包含48个数据节点,运行HiBench Benchmark Suite上的工作负载一个月。
2. 实验结果


CLP平均压缩率是32,日志索引工具 Elasticsearch 和 Splunk Enterprise 的压缩率明显较低,分别为 1.75 和 2.86。平均而言,在所有实验中,CLP 的日志类型字典占总压缩大小的 0.03%,变量字典占 1.07%。

CLP、Elasticsearch、Splunk Enterprise和流行的压缩顺序搜索组合的搜索性能。对于较长的查询,CLP速度更快,对于较短的查询,CLP具有竞争力。CLP的缓存极大地提高了其竞争力。CLP、Elasticsearch 和 Splunk Enterprise 的平均归一化完成时间分别为 1x、1.3x、4.2x;

附:优缺点
优点:
  1. CLP支持直接对压缩文件删除日志消息
  2. 支持不同的压缩模式
  3. 它是基于索引压缩和顺序搜索的混合产物,字典达到了轻量级索引的目的;
  4. 对数字的精度编码,实现无损压缩
缺点:
  1. 目前CLP的搜索没有在字典上使用任何的附加索引,非字典变量里也没有;
  2. CLP的编码不能被ASCII码打印出来,需要转义;
  3. 分布式结构的时候只允许编辑之后可读;
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值