美文网首页
根据hdfs中lzo.index文件逐数据块解压lzo文件

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

作者: 火头陀 | 来源:发表于2018-09-29 20:04 被阅读0次

使用场景

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

技术栈

  • lzo是无损压缩算法
  • lzo文件分为3个部分
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 

相关文章

网友评论

      本文标题:根据hdfs中lzo.index文件逐数据块解压lzo文件

      本文链接:https://www.haomeiwen.com/subject/gziboftx.html