博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Hadoop SequenceFile BLOCK压缩类型写入数据机制
阅读量:6323 次
发布时间:2019-06-22

本文共 1005 字,大约阅读时间需要 3 分钟。

hot3.png

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

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

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

192021_BhVi_143181.gif

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这样的缓存后再写入机制。

转载于:https://my.oschina.net/shipley/blog/538018

你可能感兴趣的文章
软硬之争 思科与VMware谁是SDN最后赢家
查看>>
PostgreSQL前言
查看>>
腾讯研究院发布《中美两国人工智能产业发展全面解读》:中国AI产业将迎来泡沫?(附全文PDF下载)...
查看>>
如何用人工神经网络处理决策边界问题?这里有一份简单的代码参考
查看>>
键桥通讯进军智慧城市领域
查看>>
周志华包揽 AI 相关领域会士“大满贯”,盘点 2016 AI 学术中国力量
查看>>
TensorFlow上手要点都总结在这儿了,你还有理由偷懒吗?
查看>>
《深入理解OSGi:Equinox原理、应用与最佳实践》一第3章 生命周期层规范与原理...
查看>>
消息称华为计划发行20亿美元债券
查看>>
CNN 那么多的网络有什么区别吗?看这里了解 CNN 的发展历程
查看>>
多云中如何共享责任模式
查看>>
Adenium约旦57MW太阳能光伏项目投产
查看>>
《Servlet和JSP学习指南》一3.6 动作
查看>>
物联网市场FD-SOI制程会取代FinFET吗?
查看>>
FB Messenger 支持秘密对话,不用担心内容遭骇曝光
查看>>
新余市首个乡镇智慧管理平台正式上线
查看>>
《VMware、Citrix和Microsoft虚拟化技术详解与应用实践》一2.2 ESXi简介
查看>>
卡巴斯基发布欧美青少年上网报告:英法小孩更爱看电视
查看>>
外媒称苹果和微软争相模仿对方,但苹果学得更快
查看>>
外媒:新型太阳能板用空气压缩制成饮用水
查看>>