通过Hadoop做分布式索引

来源:互联网 发布:同时学java和python 编辑:程序博客网 时间:2024/05/17 18:12

数据库里面有千万级的数据需要做索引,开始的方案是起线程,然后每次读取一定的数量,索引,然后继续读。一开始上了四台普通的PC,1.8的CPU,1G的内存,做了10个多小时才索引完。

后来换了Hadoop,同样的四台机器,只要20分钟就完成了。当然不是直接上hadoop就能提速那么多,还是需要做很多地方的调整的。

第一个,先把数据库记录dump出来成为文本文件,然后放到hdfs里面,这样做的目的是要利用hdfs的文本处理能力,从比较看来,虽然hadoop 0.19加了DBInputFormat,但是性能并不好。

第二个就是,将mapper和reducer并行执行,mapper负责做些数据清洗,转换工作,同时reducer往文件系统写。要做到这个,可以把max.mapper和max.reducer进行适当调整,同时一定要调整reducer的数目,从观察来看,默认情况下,hadoop的自动估计不太准,一般就给我起一个reducer,这样的效果,就是不能同时利用各台机器的I/O。但是也不要让同一台机器同时跑多个reducer,因为I/O是有限的,索引的时候I/O负载很高,增加reducer并不会对索引性能有贡献,相反还会降低索引效率。

第三个就是,一定要减少lucene当中的open和optimize操作,之前单机做了一个简单的比较,open和optimize会极大影响lucene的索引效率。