HDFS文件写入FSDataOutputStream中的持久化hsync()不起作用详解

在将ActiveMQ中的爬虫数据实时抽取到HIVE表并写入HDFS时,发现FSDataOutputStream的hsync()方法无法实时持久化数据。问题在于HDFS的block只有达到128M时才会完成持久化。对比了hflush、hsync和close的区别,了解到hsync能确保数据在datanode上持久化。为解决此问题,深入源码,通过DFSOutputStream的hsync()方法配合特定参数实现了数据的正确持久化。

开发板推荐:天空星STM32F407VET6开发板

超高性价比 STM32主控 | 超高主频 | 一板兼容百芯 | 比赛神器 | 沉金彩色丝印

问题说明

近期项目中用到实时抽取ActiveMQ中的爬虫数据到HIVE表中,但是在持久化数据到HDFS的时候,发现FSDataOutputStream.hsync()不能实时持久化,只能持久化第一条数据。
从一些文章中了解到,只有当HDFS中的block达到128M时,才可以使block处于completed状态,即持久化显示查到,故在代码测试中如果将流close掉,即可实现持久化,但是与业务场景不服;


拓展HDFS的hflush,hsync和close区别

hflush: 语义是保证flush的数据被新的reader读到,但是不保证数据被datanode持久化。
hsync: 与hflush几乎一样,不同的是hsync保证数据被datanode持久化。
close: 关闭文件,除了做到以上2点,还保证文件的所有block处于completed状态,并且将文件置为closed。


解决方法

查看源码,发现FSDataOuputStream中有一个方法getWrappedStream(),返回DFSOutputStream对象;
在DFSOutputStream中有一个方法:hsync(EnumSet syncFlags);

这里写图片描述

从方法说明中可以了解到,决定是否更新block的长度标识(即持久化);
自己建一个EnumSet 参数放进去,其中SyncFlag中含有一个

开发板推荐:天空星STM32F407VET6开发板

超高性价比 STM32主控 | 超高主频 | 一板兼容百芯 | 比赛神器 | 沉金彩色丝印

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

生命不息丶折腾不止

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值