翻译原文:
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索引器实例Lucene索引器实例
深入 Lucene 索引机制深入 Lucene 索引机制深入 Lucene 索引机制深入 Lucene 索引机制深入 Lucene 索引机制深入 Lucene 索引机制
lucene索引查看工具及源码lucene索引查看工具及源码lucene索引查看工具及源码
官网的lucene全文检索引擎工具包,下载后直接解压缩即可使用
Lucene学习总结之三:Lucene的索引文件格式(1) Lucene学习总结之三:Lucene的索引文件格式(2) Lucene学习总结之三:Lucene的索引文件格式(3) Lucene学习总结之四:Lucene索引过程分析(1) Lucene学习总结之...
lucene 索引 查看 工具
lukeall-0.9.jar为Lucene索引查看工具,方便大家查看索引
一个开源的lucene索引查看程序及代码,
Lucene创建索引步骤: 1、创建Directory(索引位置) 2、创建IndexWrite(写入索引) 3、创建Document对象 4、为Document添加Field(相当于添加属性:类似于表与字段的关系) 5、通过IndexWriter添加文档到索引中
lucene索引结构原理
这款已经老了,2.4以后的lucene索引用不了。我上传了最新版本的,有需要的话!请到http://download.csdn.net/source/1423241 下。一款可以查看Lucene分词后在索引的排名以及是否有无该词,很多时候用于查看有无需要...
Lucene创建索引,查询索引的简单使用。
lukeall,Lucene索引文件查看工具可支持Lucene4.7版本的索引查看,直接双击打开,选择索引目录进行使用
Lucene之删除索引 Lucene之删除索引 Lucene之删除索引 http://blog.csdn.net/nupt123456789/article/details/10666105
Lucene索引的基本操作,包括添加和更新操作及测试代码;
lucene索引查看工具luck7.4.0 ,解压后,windows平台点击luck.bat即可运行。
由于林良益先生在2012之后未对IKAnalyzer进行更新,后续lucene分词接口发生变化,导致不可使用,所以此jar包支持lucene6.0以上版本
该程序代码属于本人2015所写,虽然尚有不足,却实现了对多个文件夹下的数据进行Lucene建立索引和查询功能,并包含了所需的所有jar包,工程直接导入即可运行。
文档中包含Lucene4.0.0版本jar包,中文分词器jar包,Lucene实例代码 1:建立索引 2:各种搜索方式方法 3:删除索引 4:检查索引文件 5:恢复删除的索引 6:强制删除 7:更新索引 8:合并索引 9:高亮回显 供大家参考...
luke源码--查看lucene索引文件