elephanttwin

elephanttwin是twitter开源的一个index hdfs项目,其立项的基本思路是,在需要查询的hdfs数据上建立索引,加快查询的速度。

提供了两种建立索引的方式,lucene和lzo压缩文件inverted

 

lucene

1. 启动一个mapreduce任务,mapper每隔n行数据,记录当前读到的位置(split上读到的行数,path,offset)用做store信息,提取n行里面需要index信息,组成一个document:索引字段、存储字段。

2. reducer启动时创建本地索引目录,mapper过来的document写入索引,reducer结束时将本地索引写入到hdfs上。

3. lucene读取hdfs索引进行搜索,得到存储字段(path, offset, counter), 读取数据时过滤。

 

lzo inverted

lzo压缩文件里feature -> list<lzo.block>,建索引生成,查询时使用。

mapper:加载lzo文件抽取feature,同feature 出现的block链表做一个归并,同一个block两条数据出现差距不太大时输出一条记录。

reducer:feature 出现的block流做一些合并和去重操作。

最后的输出就是:视角关注的feature -> list<blocks>,blocks=(lzo.block)+,写入MapFile

elephant-twin提供lzo index的InputFormat,在MapFile找到feature出现的block链表,封装成InputSplit,LZO.RecordReader读取并过滤。

 

appendix

1. SequenceFile,里面让标准格式写入key-value,在头部写一些描述,比如压缩,key和value的类型

2. MapFile,分两个SequenceFile文件,一个写原始的key-value数据,另一个每间隔多少个entry,写key-offset,建了一个基于原始数据的跳跃表。

项目地址: https://github.com/twitter/elephant-twin

posted on 2012-07-24 19:56  qinteng  阅读(361)  评论(0编辑  收藏  举报