`
hankesi2000
  • 浏览: 96644 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

lucene索引的新设计:DWPT,充分利用系统资源

阅读更多
翻译原文:http://blog.jteam.nl/2011/04/01/gimme-all-resources-you-have-i-can-use-them/
注:本文属个人爱好和英语学习,很多地方翻译的不好,如果需要了解真实内容,请阅读原文。

ps:lucene4.0的并发索引号称提高了265%的写速度,对系统资源的利用也很充分,下面这篇文章主要讲并发写的一个实现原理以及测试结果对比。


在使用Apache Lucene时利用所有的IO和CPU并发来进行索引

去年lucene发布了很大数量的一些改进,比如提升100倍的FuzzyQueries新的词(term)字典的实现提高了段(segment)的合并还有著名的灵活索引(Flexible-indexing)API。最近我开始了另一个工作DocumentsWriterPerThread,这对IndexWriter做了一个较大的重构:索引的性能不再因用户的并发交互而有影响。下面作下简单的介绍:

lucene在索引时,会先构建一个内存的索引,然后再flush到持久化存储中。在内存内部,会有多个小的段(segment),在需要flush的时候,才会合并到一起;这些小的段,可以并行的提供索引服务(即并发)。IndexWrite使用DocumentsWriter将索引数据通过一个私有线程写入到段中。见下图:

这个模式允许CPU并发执行;但是,当需要将内存中的段flush(通过一个抽象的java文件接口)到硬盘中时,并发的方式就行不通了。当lucene将段写入硬盘时,我们需要停掉所有的线程并一直等到flush线程处理结束。这个实现在lucene3.0里是stop-the-world模式,用来防止索引线程在flush的时候作处理的;但是在较慢的IO系统或者大数据量的索引时,这个限制将成为严重的瓶颈。

DocumentsWriterPerThread(DWPT)的重构,当前在该分支上开发;旨在尝试删除这个限制来让CPU和IO都到达并发索引的目的。替代合并内存数据然后写入到一个单独段的方式,改为每个DWPT将每个段写入自有的段中。这种方式允许我们并发的索引数据而不受到影响:


这个想法最初是由Michael Busch在实时搜索中提出并在2010.6提交了分支。我最近跟Mike McCandless一起添加了一个missing pieces来开始基准测试并最终将它合并到了主干上。一周前我提交了一个新的FlushPolicy用来控制DWPT如何flush段到硬盘中。目的是控制DocumentsWriter 何时需要flush;如果DWPT必须flush DocumentsWriter的交换数据,则会使用一个新的DWPT并且开始刷新段。

对于Lucene的默认策略FlushPolicy,我们只标记最大数据来写入,比如活跃的索引大小超出了RAMbuffer 大小时,将它移出活跃索引区,并准备flush。

使用这个模式我们保证会有足够的DWPT可用,即使是在写硬盘时也不会被阻塞。看起来很爽,下面来看一下我们的测试数据吧!

Benchmarking Lucene Indexing
围绕lucene我们使用了一个apache的扩展工具名叫luceneUtil来做性能测试以确保我们的修改对查询的性能并没有任何的负面影响。测试中我添加了一些统计信息,比如吞吐率、flush的团吐量等来展示DWPT。

我们照例使用维基英文xml文档来导出一个21G未压缩的文本文件。然后使用lucene的主干分支中的Realtimebranch作为本次的竞争者。我拿出1千万的文档数进行索引,机器配置为2*6 core XeonBox、24GRAM、500G Hitachi HDD,索引这1千万的文档,用了13分40秒,很好。


上图中,在50s-200s中,有一个很好的性能吞吐率,每秒大概处理40K的文档;但是在刷新到硬盘中时,没有做任何处理;刷新会占用一些时间并且使系统IO处于繁忙状态。我知道trunk上的这次测试有什么问题;看图就知道,其实它可以更快。问题是如何能更好的利用系统的资源。
使用DWPT测试只用了6分15秒,跟trunk比,降低了不只50%!

非常惊人的结果,多线程在后台不断地添加文档数据到索引中。峰值较trunk比稍微有些下降,这是因为在后台flush索引时,会有一些的线程切换。


通过该图可以看出,在并发flush时,系统IO的利用率很高。DWPT在并发flush数据时会有一些小的重叠,这让磁盘不能一直刷新某一块;这也解释了图4中的问题,如果多线程刷新时,有IO重叠,则不会继续处理,进而影响吞吐量。

总体来说,DWPT还是很惊人的,我们甚至不需要进行优化。我很好奇如果这个提升跟hadoop结合到一起(使用AppendingCodec直接写入到HDFS)会怎样?并发索引做了一个很好的改进。请继续关注。






  • 大小: 55.5 KB
  • 大小: 38.6 KB
  • 大小: 27 KB
  • 大小: 34.9 KB
  • 大小: 22.1 KB
分享到:
评论

相关推荐

    lucene 索引 查看 工具

    这就是"Lucene 索引 查看 工具"的用途,它可以帮助我们分析和理解 Lucene 索引的工作原理。 主要知识点: 1. **Lucene 索引**:Lucene 的索引是一种倒排索引,它将文档中的词项(tokens)映射到包含这些词项的文档...

    lucene索引查看工具及源码

    Luke 的源码也公开在 GitHub 上,这对于想深入理解 Lucene 内部机制的开发者来说是一个宝贵的资源。通过阅读和学习 Luke 的源码,我们可以了解到如何与 Lucene 索引进行交互,以及索引结构是如何组织和存储的。 在...

    Lucene索引器实例

    **Lucene索引器实例详解** Lucene是一个高性能、全文本搜索库,由Apache软件基金会开发,被广泛应用于各种搜索引擎的构建。它提供了一个高级的、灵活的、可扩展的接口,使得开发者能够轻松地在应用程序中实现全文...

    Lucene 索引的简单使用

    1. **初始化Directory**:选择存储索引的目录,如FSDirectory(文件系统)、RAMDirectory(内存)等。 2. **创建IndexWriter**:配置IndexWriter实例,指定Directory、Analyzer和其他参数。 3. **创建文档**:定义...

    深入 Lucene 索引机制

    《深入 Lucene 索引机制》这篇博文主要探讨了Lucene这个全文搜索引擎的核心索引原理,它在信息检索领域有着广泛的应用。Lucene是一个开源的Java库,它提供了高效、可扩展的文本搜索功能。以下是对Lucene索引机制的...

    lucene索引查看程序及代码

    《深入理解Lucene索引查看程序与代码》 在信息技术领域,搜索引擎的高效运作离不开底层索引技术的支持,而Lucene作为Apache软件基金会的一个开放源代码项目,正是一个强大的全文检索库,它提供了高效的文本搜索功能...

    Lucene索引和查询

    本项目中的代码旨在展示如何利用Lucene对多个文件夹下的数据进行索引创建和查询操作。 首先,我们需要了解Lucene的基本概念。Lucene的核心思想是将文本数据转换为结构化的索引,以便于快速查找相关文档。这个过程...

    lucene索引查看工具luck7.4.0

    `Luke 7.4.0`是这款工具的一个特定版本,它专门设计用来与Lucene 7.x版本的索引兼容。这个版本的Luke包含了对最新Lucene特性和改进的支持,使得用户能够更有效地探索和理解索引结构。 在解压提供的压缩包`luke-luke...

    Lucene 3.0 原理与代码分析PDF

    Lucene学习总结之三:Lucene的索引文件格式(1) Lucene学习总结之三:Lucene的索引文件格式(2) Lucene学习总结之三:Lucene的索引文件格式(3) Lucene学习总结之四:Lucene索引过程分析(1) Lucene学习总结之...

    Lucene索引文件查看工具lukeall4.7.1

    它是一款专门针对Lucene 4.7版本设计的索引文件查看和分析工具,帮助我们直观地洞察Lucene索引的内部结构。 LukeAll 4.7.1的核心功能主要集中在以下几个方面: 1. **索引目录选择**:用户可以直接通过双击运行...

    lucene索引优化多线程多目录创建索引

    - **硬件资源**:充分利用CPU和磁盘I/O资源,根据服务器配置合理设置线程数量。 - **内存管理**:监控内存使用情况,避免因内存不足导致的性能下降或崩溃。 - **索引段优化**:定期进行索引段合并,减少索引的段数量...

    基于lucene技术的增量索引

    本文将深入探讨如何利用Lucene实现增量索引,这是一种在数据库或文件系统更新时仅对新数据或变化数据进行索引的技术,以降低资源消耗并保持搜索性能。 **1. Lucene基础知识** Lucene首先需要理解的是它的核心概念,...

    Lucene索引查看工具

    lukeall-0.9.jar为Lucene索引查看工具,方便大家查看索引

    Lucene读取索引文件

    《深入理解Lucene:解析索引文件的读取》 Lucene,作为一款强大的全文搜索引擎库,被广泛应用于各类信息检索系统中。它的核心功能之一就是构建和读取索引文件,以高效地进行文本搜索。本文将深入探讨Lucene如何读取...

    lucene索引结构原理

    理解Lucene的索引结构原理对于优化搜索性能和设计高效的搜索应用至关重要。 首先,我们要知道Lucene的索引并非数据库中的那种可以立即定位数据的索引,而是用于快速查找文档中包含特定单词的索引。这个过程分为以下...

    IKAnalyzer中文分词支持lucene6.5.0版本

    由于林良益先生在2012之后未对IKAnalyzer进行更新,后续lucene分词接口发生变化,导致不可使用,所以此jar包支持lucene6.0以上版本

    lucene并行索引

    这样可以充分利用集群中多台机器的计算能力,大大缩短索引构建的时间。 - **合并索引**:各计算节点完成本地索引构建后,需要将这些局部索引合并成一个全局索引。这个过程可以通过Lucene提供的工具或者自定义逻辑...

    Lucene索引的基本操作

    Lucene索引存储在文件系统中,因此需要创建一个目录来保存索引。可以使用`FSDirectory`类来实现: ```java File indexLocation = new File("index"); Directory directory = FSDirectory.open(indexLocation.toPath...

    深入 Lucene 索引机制深入 Lucene 索引机制

    Apache Lucene 是一个高性能、全文检索库,由Java编写,其核心设计目标是提供一个灵活、可扩展的搜索功能。它允许开发者在自己的应用程序中嵌入强大的搜索引擎,从而实现高效的文本检索。本文将深入探讨Lucene的索引...

    lucene5+zoie实现近实时索引

    这样可以充分利用多核处理器的并行能力,提高索引构建速度。 2. **实时索引**:当有新数据到来时,Zoie会在后台创建一个新的Lucene索引实例,对新数据进行索引,同时保持旧索引对外提供服务。新索引完成后,通过...

Global site tag (gtag.js) - Google Analytics