根据hdfs中lzo.index文件逐数据块解压lzo文件

2018-09-29  本文已影响0人  火头陀

使用场景

搜索大文件时,假如行文件都有一个唯一的id(我们称之为logid), 那么我们完全刻意根据logid索引logid所在的文件中的offset,对于lzo压缩的文件而言,则能很容易滴索引到logid所在的数据块(单块不超过256k), 这样便能再一个任意大的文件中以极快的速度获取到logid对应的数据块

技术栈

header blocks tail
第一个块 每个block最大256k, 但行记录超出部分会被切割为多个block 最后4个byte

解析*.lzo.index(索引文件)文件

查看indexer源码发现

struct.pack(">Q", block_offset)

即将offset 转为8字节的二进制代码
解析方式为

struct.unpack(“>Q”, f.read(8))

获取offsets

offsets = []
while True:
    offset = indexFileStream.read(8)
    if not offset:
        break
    data = struct.unpack(">Q", offset)
    offsets.append(data[0])
lzoFileStream.seek(offsets[-1])
lastBlock = lzoFileStream.read()
offsets.append(offsets[-1]+len(lastBlock)-4)#tail

header & tail

lzoFileStream.seek(0)
header = lzoFileStream.read(offsets[0])

lzoFileStream.seek(offsets[-1])
tail = lzoFileStream.read(4)

获取完整block内容

lzoFileStream.seek(offsets[1])
block = lzoFileStream.read(offsets[2])
#content 为一段独立的可解压的数据块(不一定是完整的一行)
content = header + block + tail 
上一篇 下一篇

猜你喜欢

热点阅读