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