乐趣区

关于lucene:基于Lucene实现万亿级多维检索与实时分析

5 月 29 日,录信数软技术总监郑其华在 QCon 寰球软件开发者大会分享了“基于 Lucene 实现万亿级多维检索与实时剖析”的主题演讲,现场座无虚席,流动在浓烈的技术探讨气氛中圆满结束。上面,咱们将分享演讲全文。

1. 万亿挑战之一:数据存储

第一个对于数据存储。平时咱们保留数据很简略,往硬盘外面写就行了。海量数据就没那么简略,会面临很多问题。比方老本问题。是应用 SSD 固态硬盘还是机械磁盘,是应用 100 块大磁盘,还是应用 1 万块小磁盘,在老本上都会造成微小的差别。

其次,数据的安全性也是一个问题。万一磁盘损坏了,或者误删除了,数据就会失落。数据迁徙、扩容也会比拟麻烦。另外,还有一个读写平衡的问题。数据写入不平衡的话,可能就会导致有的磁盘特地忙,有的磁盘很闲暇。或者,如果有个别磁盘出问题了,读写速度变慢了,就会导致所有的查问都会卡在这个磁盘的 IO 下面,升高了整体性能。

针对存储的这些问题,咱们采纳了基于 HDFS 的索引技术来解决。

采纳 HDFS 能够解决哪些问题呢?对于读写不平衡的问题,HDFS 是一个高度容错的零碎,如果有磁盘坏掉了,或者速度变慢了,会主动切换到速度较快的正本上进行读取。并且,会对磁盘数据读写进行主动平衡,避免出现数据歪斜的问题。对于数据安全性的问题,HDFS 有数据快照、冗余正本等性能,能够升高因磁盘损坏,或者误删除操作带来的数据失落问题。对于存储老本问题,HDFS 反对异构存储,能够混合应用各种存储介质,升高硬件老本。而且,HDFS 能够反对大规模的集群,应用和治理老本都比拟低。

除此之外,为了进一步升高存储老本,咱们研发了列簇的性能。原生 Lucene 是不反对列簇的,列簇的益处是什么呢?

咱们能够将数据列,指定为不同的列簇,按列簇来混合应用不同磁盘,并且能够对不同列簇设置不同的生命周期。比方,一个文档外面可能蕴含一些结构化的数据,像题目、作者、摘要等等,这些数据个别比拟小,而且是常常要进行检索的。那么咱们就能够将这些数据列定义为一个列簇,放在 SSD 上。还有一些相似附件、图片、视频等非结构化的数据,这些数据比拟大,而且个别不会进行查问的,能够定义为另一个列簇,放在的 SATA 盘下面。从而升高了 SSD 固态硬盘的使用量。另外,列簇联合 HDFS 的异构策略,咱们还能够实现冷热数据的拆散。比方,有的业务常常查问最近 1 个月以内数据。那么,咱们就能够将最近 1 个月保留在 SSD 上,1 个月当前,将数据,移到 SATA 盘上,从而进一步升高 SSD 使用量。

接下来,再看另外一个问题。大数据有一个根本的利用,就是查问检索。比方这个页面上显示的一个“全文检索”性能,是从海量数据外面查找蕴含用户输出关键字的数据。这样的搜寻性能很常见,也不难实现。难的中央在于性能。对于万亿规模的数据,是几秒就响应了,还是几个小时再响应呢?

2. 万亿挑战之二,检索性能

为了实现万亿秒查的性能。咱们对 Lucene 的倒排表进行了优化。

在全文检索畛域外面,通常的做法,就是进行切词,而后记录这个关键词在哪个文档外面呈现过。同时,也会保留其余一些相干的信息。比方,这个关键词呈现的频率、在这个文档呈现的地位等等,大略有十几个元素,这些元素就是保留在倒排表外面。Lucene 对这些元素,采纳的是行存储。这就意味着,每次查问都须要把所有的十几个元素都读取进去。而咱们在检索时,理论用到的可能只有其中的两三个元素。应用行存的话,会造成很多不必要的 IO。因而,咱们在这里,将倒排表外面的元数据,改成了列存储。

列存的益处是,查问用到哪个元素,我只读取这个元素的内容,其余的内容就能够间接跳过。这个改变看上去很小,然而在海量数据的场景,对性能的影响却是极大的。比方,咱们查问的关键字,可能命中了几亿条数据。就须要读取几亿个倒排表的元数据信息,如果应用行存,读取的数据量就是几亿个元数据乘以十几个元素。而列存储的话,只须要读取两三个元素,磁盘 IO 上就差了好几倍。所以,通过倒排表元数据的列存化,缩小有效 IO,这样一个优化,带来了好几倍的性能晋升。

而后,第二个优化的中央呢,咱们将 倒排表按时序进行了存储

因为咱们在理论场景中发现,很多数据会有一个时序性的特点。也就是数据都是随着时间推移而产生的。对这些数据查问时,个别也会联合工夫范畴进行。比方查问最近一天或者最近几小时的汽车尾气排放量等等。而原生 Lucene 的索引数据在寄存时,是杂乱无序的。同一天的数据,可能存在磁盘的不同地位。这样在读取的时候,就是一个随机读取。所以,咱们在这里也做了一点改良。把数据依照入库的程序进行寄存。那么,咱们在查问某时间段的数据时,只须要将磁盘上这一整块的数据读取进去。咱们晓得机械硬磁盘的随机读取性能比间断读取性能要差很多。而且,磁盘在读取间断数据时还有预读性能。同样大小的数据量,间断读取的性能可能会比随机读取的性能高一个数量级。

通过对索引的优化,基本上万亿数据的检索性能能够做到秒级响应。

3. 万亿挑战之三,多维统计

接下来看,另一个常见的利用。就是统计分析。

这是一个典型的数据立方体。会波及到多个维度,有工夫维度、地区维度等等。每个维度可能还会有层级关系,比如说咱们先查问每年的汽车保有量数据,而后须要在工夫维度下钻到每个季度的数据,或者到每个月的数据。而原生 Lucene 在索引上,只有单层的关系,对于一个列,只能建单列的索引,所以在做多维或者多层次的检索统计上,性能会比拟差。

对于多维统计,业界通常的做法,是应用 DocValues 进行统计分析。而 DocValues 会带来随机 IO 的问题。所以,咱们将 Lucene 的倒排索引表,又进行了批改。这次批改的倒排表外面的 term。

原来 term 外面只能存一个列,改良后,就能够存多个列的值。比方,第一列保留年份、第二列保留季度,第三列保留月份。通过干涉数据的排序散布,在同一个年份,比方 2018 年下,每个季度的数据都是间断的。这样,在统计分析 2018 年的每个月的数据时,只须要找到 2018 年的开始地位,间接读取接下来的一块数据就能够了。

另外,在这个多列联结索引的根底上,咱们还减少了两级跳跃表。每个跳跃表外面会保留多列联结索引的最大最小值。目标是在检索时,能够疾速定位到指定的关键字下面。从而进步单列或者多列的统计分析性能。

4. 万亿挑战之四,区域检索

而后,咱们再看一个比拟非凡的利用场景——区域检索。区域检索是基于地理位置信息,个别是经纬度进行查问匹配。常见于公安安防行业。

区域检索会有什么样的问题呢?原生 Lucene 在解决区域检索时,个别是采纳 GeoHash 来抉择一个正方形,而后应用 DocValues 进行二次验证。比方,要检索圆形区域的话,就须要裁剪掉多余的几个角。而应用 DocValues,跟后面的统计分析一样,就会导致随机读取问题,性能比拟差。

咱们所做的改变呢,就是把原来随机散落在磁盘各个地位的 DocValues,改为按地位邻近存储起来。也就是雷同的地理位置的数据,存储的时候,在磁盘上也是挨在一起的。搜寻的时候,因为数据挨在一起,读取就变为一个程序读取。相比原来的随机读取,性能有了一个大幅的晋升。

5. 万亿挑战之五,计算框架

除了对于存储层和索引层的优化,对于下层的计算框架,咱们也进行了相应的批改。尽管 spark 作为通用计算引擎,性能上根本满足咱们的需要。然而在万亿数据规模下,依然存在一些问题。例如,spark 底层对数据的获取是一条条暴力读取。当数据规模超过万亿时,性能比拟差。想晋升性能,则须要减少硬件投入,老本比拟高。而且在理论生产利用中呈现过各种问题。

所以,咱们对 spark 进行了批改。将底层的数据存储改为基于咱们自研的分布式索引。Spark 在查问的时候,就不须要对数据进行暴力扫描,而是先通过索引,疾速定位到命中的局部数据。从而晋升了数据的查问、统计工夫。同时,咱们修改了大量开源 spark 的问题,确保在生产零碎中能够稳固运行。

6. 产品架构

通过上述各个组件的整合和优化,最终咱们造成了如下的产品架构。

底部是 Hadoop 的根底服务,下面是 SQL 计算层,通过 SQL 语句与应用层进行交互。最外围的是两头的存储引擎层,蕴含了 lucene 的全文检索性能,HBase 的 KV 模型,还有多列联结索引实现的 OLAP 剖析引擎等。后续还能够在这一层外面进行扩大,实现图数据库以及一些行业定制的性能。

另外,能够通过 ETL 工具,与常见的内部数据源进行数据导入导出。

7. 利用场景

这样一套零碎,能够利用在哪些场景呢?能够反对万亿数据的检索剖析吗?

答案是必定的。这个零碎咱们在公安军队行业曾经有很多理论我的项目。公安行业,会集了全网各种维度的数据,超过万亿规模的我的项目十分常见。能够利用这个零碎,通过实时检索、关联碰撞等性能,提供智能研判关系网络,助力公安侦破各种案件。

另外一个场景,就是汽车行业。随着车联网的疾速倒退,汽车产生的数据规模也越来越大。比方,每台车载终端 T -Box,每天都会产生数万条数据,几十万台车辆每年产生的数据量就会超过万亿规模。针对国六规范的推广,对车辆的尾气数据、油耗数据都须要进行监管。咱们与中汽研单干,提供的数据存储和检索剖析解决方案,目前曾经利用于各大主机厂。

还有一个咱们最近正在开发和钻研的场景,就是针对于航空和船舶的时空轨迹剖析。通过对于大量的航空和船舶数据进行多维检索和可视化剖析,借助于咱们产品对于工夫、空间数据的优化,从而实现对于类似轨迹的碰撞剖析、随同剖析等。

下面这几个场景的数据量都达到了万亿规模,从理论应用成果来看,咱们这种架构架是能够满足撑持万亿数据的检索剖析需要。

在完结了北京的流动之后,咱们将会在 7 月 23 日 -24 日在深圳大中华喜来登酒店的 ArchSummit 寰球架构师峰会带来全新的分享,目前议题还 没编出来 在构思中,敬请期待!

下一站,咱们深圳见!

退出移动版