HDFS文件写入FSDataOutputStream中的持久化hsync()不起作用详解
2017-09-05 17:33
711 查看
问题说明
近期项目中用到实时抽取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中含有一个默认值“UPDATE_LENGTH”,其中的说明可以解释;
解决代码
// 实时持久化处理 DFSOutputStream dfsOutputStream = (DFSOutputStream) outputStream.getWrappedStream(); EnumSet<HdfsDataOutputStream.SyncFlag> syncFlags = EnumSet.of(HdfsDataOutputStream.SyncFlag.UPDATE_LENGTH); dfsOutputStream.hsync(syncFlags);
相关文章推荐
- FSDataOutputStream中的hsync()不起作用?
- FSDataOutputStream.writeUTF(String)写入文本异常
- FSDataOutputStream (浅析hadoop写入数据api)
- FSDataOutputStream.writeUTF(String)写入文本异常
- 利用Hadoop的FileSystem create方法获取 FSDataOutputStream 实现文件的上传
- 利用Hadoop的FileSystem create方法获取 FSDataOutputStream 实现文件的上传
- HDFS文件读取、写入过程详解
- Android持久化技术之文件的读取与写入实例详解
- API读取写入 ini文件内容的方法函数详解
- android OutputStream向sd卡中文件写入操作立即关机数据清0问题
- 用OutputStream的wirte(byte[] b)方法写入文件 改变了文件的大小?
- HDFS读取实时写入的文件大小
- Multipart/form-data POST文件上传详解
- hadoop hdfs uri详解 一、hdfs基本命令: hadoop fs -cmd <args> 选项: cmd: 具体的操作,基本上与UNIX的命令行相同 args: 参数 二、hdfs资
- hdfs配置文件详解(转载)
- 模拟使用Flume监听日志变化,并且把增量的日志文件写入到hdfs中
- http multipart/form-data POST文件上传详解
- HDFS的API对Hadoop文件系统的文件进行写入
- 【Android基础】通过流将文件写入手机data目录
- API读取写入 ini文件内容的方法函数详解