前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Hadoop SequenceFile BLOCK压缩类型写入数据机制

Hadoop SequenceFile BLOCK压缩类型写入数据机制

作者头像
囚兔
发布2018-02-08 10:43:09
1.3K0
发布2018-02-08 10:43:09
举报
文章被收录于专栏:IT杂记IT杂记

最近测试Hadoop数据一致性,发现Hadoop SequenceFile BLOCK压缩类型(io.seqfile.compression.type=BLOCK)的文件存在数据丢失情况,对此进行研究并解决。

先来了解SequenceFile BLOCK压缩类型的数据写入机制:

BLOCK压缩类型的SequenceFile数据结构图

BLOCK压缩类型的SequenceFile.Writer实现类为SequenceFile.BlockCompressWriter,写入流程如下:

    1.写入头部信息:版本信息,压缩类型信息,压缩算法类信息,keyClass/valueClass类名,Metadata等;

    2.写入Sync标记;

    3.将key和value序列化并写入缓存,当缓存大小达到阈值(默认io.seqfile.compress.blocksize=1000000字节),触发sync()操作,sync操作:先写入sync标记,再将缓存中的key和value进行压缩写入FSDataOutputStream,格式如上图中的Block compression。 这样就成功写入了一个block;

    4. 后续的数据写入流程和3一样;

    5. 当最后数据写入完成后,会存在最后一个block的数据小于io.seqfile.compress.blocksize,这样不会触发sync()操作,所以必须调用BlockCompressWriter的close()方法,其中会去调用sync()操作将最后剩余的数据写入FSDataOutputStream,并对FSDataOutputStream做close(),至此完成整个写入流程。

解决我的问题:

    我的问题是由于在写入数据结束后只对FSDataOutputStream做了close()操作,而根据BLOCK压缩类型的写入必须调用Writer的close()操作,才能触发sync()操作将剩余数据压缩写入FSDataOutputStream。而在我的实现中,当设置io.seqfile.compression.type为NONE和RECORD,不会出现数据丢失。 因为这两种压缩类型,是来一条数据就写入outputStream,没有BLOCK这样的缓存后再写入机制。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档