linux sync flush 区别,FsDataOutputStream 之 hflush和hsync的区别

本文是基于hadoop-2.8.0的源码实现

1. linux上的sync, fsync, fdatasync的区别

sync会将输出流缓冲区数据排入到OS维护的写磁盘对列,而不会等在磁盘操作完成,因此sync调用返回后数据依然有可能会丢失。

fsync和sync不同的是它会等待写磁盘操作完成,同时它还会修改文件meta信息。因此fsync往往对应两次磁盘IO:一次写数据到磁盘,一次修改文件meta信息到磁盘。

fdatasync 和fsync一样等到磁盘操作完成,但是它不会修改文件的meta信息。

2 FsDataOutputStream hflush和hsync

回到hdfs的hflush和hsync, 文件的meta信息存放在namenode上,文件的data信息存放在datanode上。

client调用hflush和hsync流程都是一样的,首先这里再次说明一下write的流程:

client端:

输出流底层会缓冲数据,缓冲到一定大小后flush到datanode,这个缓冲区是一个block。

写到block的数据又被切分成一个个packet,发送block的时候是一个个packet发送,发送完packet后会将packer移到等待确认对列中,然后等待datanode的确认。

datanode端:

写数据采用pipeline机制,比如数据需要在3个datanode(dn1, dn2, dn3)上备份,那么dn1收到 client端的packet后,写packet到dn2, 然后将packet写到本地磁盘并flush, dn2如法炮制写dn3并写本地。

确认:

dn3是pipeline中最后的datanode, dn3写完后发送对packet的ack到dn2, dn2发送ack到dn1,

dn1 发送ack到client。client收到packet的确认后将packet从确认对列移除。

下面比较两者的区别

下面是FsDataoutputStream中hflush和hsync的实现:

@Override // Syncable

public void hflush() throws IOException {

if (wrappedStream instanceof Syncable) {

((Syncable)wrappedStream).hflush();

} else {

wrappedStream.flush();

}

}

@Override // Syncable

public void hsync() throws IOException {

if (wrappedStream instanceof Syncable) {

((Syncable)wrappedStream).hsync();

} else {

wrappedStream.flush();

}

}

-----------------------------------------------------

调用的是wrappedStream的hflush和hsync,此处wrappedStream只讨论是DFSOutputStream的情况,下面是DFSOutputStream的hflush和hsync:

@Override

public void hflush() throws IOException {

try (TraceScope ignored = dfsClient.newPathTraceScope("hflush", src)) {

flushOrSync(false, EnumSet.noneOf(SyncFlag.class));

}

}

@Override

public void hsync() throws IOException {

try (TraceScope ignored = dfsClient.newPathTraceScope("hsync", src)) {

flushOrSync(true, EnumSet.noneOf(SyncFlag.class));

}

}

调用的都是flushOrSync,第一个参数的不同最终被导致了datanode端写数据处理方式的不同,不深挖代码了,后面的代码跟hdfs写数据流程重合,如果有空的化还会记录一下hdfs写数据过程。

hflush

上面简要的写流程可以看出,关键是datanode的收到packet后的flush。 client端调用FsDataoutputStream # hflush, 在datanode上实际上调用的是OutputStream # flush, 从jdk关于flush的解释可以知道,flush类似linux的sync操作,只是将文件输出流缓冲的的数据移动到os的写磁盘缓冲区,并不会等待写磁盘操作完成。

hsync

和hflush的不同只在与datanode write packet后不是调用flush,而是调用下面一段代码:

public void syncDataOut() throws IOException {

if (dataOut instanceof FileOutputStream) {

((FileOutputStream)dataOut).getChannel().force(true);

}

}

dataOut是本地文件输出流。force(true)的语义保证会等待数据写到磁盘, 指定参数true还会是的刷新datanode上dataOut输出流对应文件的meta信息。

所以hsync类似linux上的fsync调用。

但是hdfs上文件的meta信息保存在namenode上,无论是hflush还是hsync都没有更改namenode的文件meta信息,主要是length信息。这和DFSoutputStream中hflush和hsync调用的flushOrSync参数有关,其第二个参数都被设置成

EnumSet.noneOf(SyncFlag.class);

实际上SyncFlag枚举了两个值如下:

public enum SyncFlag {

/**

* When doing sync to DataNodes, also update the metadata (block length) in

* the NameNode.

*/

UPDATE_LENGTH,

/**

* Sync the data to DataNode, close the current block, and allocate a new

* block

*/

END_BLOCK

}

如果指定UPDATE_LENGTH 才会在flush之后修改namenode的meta信息。

WinCC与施耐德PLC的Modbus TCP通信实战指南 本文详细解析了西门子WinCC与施耐德PLC通过Modbus TCP协议实现通信的完整实战流程。内容涵盖硬件网络配置、Modbus地址映射核心规则、WinCC驱动连接建立、变量创建及高级数据访问技巧,并提供了常见故障排查思路,帮助工程师高效解决跨品牌设备通信难题。 阅读详情

相关推荐

今日指数项目之实时流数据采集【六】

实时数据采集代码

Maynor的博客 2104

fsync mysql_linux 磁盘 sync,fsync,fflush

sync,是同步整个系统的磁盘数据的.fsync是同步打开的一个文件到缓冲区数据到磁盘上.fflush是刷新打开的流的.fsync(将缓冲区数据写回磁盘)相关函数 sync表头文件 #include定义函数 int fsync(int fd);函数说明 fsync()负责将参数fd所指的文件数据,由系统缓冲区写回磁盘,以确保数据同步。返回值 成功则返回0,失败返回-1,errno为错误代码。传统的...

weixin_33957278的博客 494

基于单片机的消毒柜系统设计(程序+仿真)(51+1602+18B20+BZ+JK+KEY3) #0030

包括:源程序工程文件、Proteus仿真工程文件、配套技术手册1、采用51/52单片机(通用)作为主控芯片;2、采用1602显示实时温度、计时时间;3、采用18B20传感器测温;4、具有三个功能键:消毒(亮红灯):启动继电器加热到125°,计时加热10分钟,停止加热,蜂鸣器长鸣;保温(亮黄灯):低于50°启动加热器,高于70℃关闭加热器,持续工作;停止(亮绿灯):退出工作模式;

hdfs数据一致性研究

前言 在hadoop老版本中只提供了sync() hflush()方法,只能保证数据都传输到了datanode端,不能确保都进行了落盘操作,所以在写入数据过程中发生大面积down机的情况下会产生数据丢失问题。本篇文章主要对hdfs数据一致性模型进行一些研究。 HDFS 中 sync(),hflush() hsync() hadoop在2.0.2-alpha版本上添加...

breakout_alex的博客 1619

12 flush与fsync,checkpoint与redolog

一、flush log file或data file的writeflush是不同的操作,写后是否立即flush受参数srv_unix_file_flush_methodsrv_flush_log_at_trx_commit的影响。 二、主线程中的flush 每1S:若 buffer  pool 中的脏页比率超过了 srv_max_buf_pool_modified_pct  =

tz_sz的专栏 1753

hadoop 一致性模型,确保断电不丢数据(hflush() hsync())

原文链接:https://www.infoq.cn/article/large-data-processing-ensuring-data-not-lost-when-power-off 在 Hadoop 2.0.2-alpha 之前,HDFS 在机器断电或意外崩溃的情况下,有可能出现正在写的数据丢失的问题。而最近刚发布的 CDH4 中 HDFS 在 Client 端提供了 hsync() 的方...

Mr.pan felix的专栏 2164

函数sync、fsync、fdatasync以及fcntl

文件IO中的sync/fsync、fdatasync函数,同时简单的介绍了fcntl函数的功能

BUG_MeDe的博客 996

Redis之数据持久化

Redis有两种数据库持久化方案:RDBAOF AOF: AOF就像MySQL库中的binlog一样,把每一次写操作以追加的形式记录在其中以文件的形式刷到磁盘里。默认使用fsync策略,Redis的性能依然很好(fsyhc是由后台线程进行处理的,主线程会尽力处理客户端请求),一旦出现故障,最多丢失1秒的数据。 缺点:AOF文件的大小会随着时间线增大,一段时间后就会变得很大;如果要在一端以AO...

手写ArrayList 221

c语言fsync函数,c – 如何在一个流上做fsync

不幸的是,查看标准没有提供basic_filebuf或任何basic_ [io]?fstream类模板,以允许您提取底层的操作系统文件描述符(以fileno()为C stdio I / O的方式) .也没有一个open()方法或构造函数将这样的文件描述符作为参数(这将允许您使用不同的机制打开文件并记录文件句柄).有basic_ostream :: flush(),但是我怀疑这实际上并不调用fsyn...

weixin_42526087的博客 1168

linux sync flush 区别,fflushfsync的一些总结

int fflush(FILE *stream);If stream points to an output stream or an update stream in which the most recent operation was not input, the fflush function causes any unwritten data for that stream to be ...

weixin_30498015的博客 1673

写数据刷新的实现

fflush是libc.a中提供的方法,是用来将流中未写的数据传送到内核。对于提供事务支持的数据库,在事务提交时,都要确保事务日志(包含该事务所有的修改操作以及一个提交记录)完全写到硬盘上,才。fflush:是把C库中的缓冲调用write函数写到磁盘[其实是写到内核的缓冲区]。fsync, 将缓冲区的数据写到文件中.(有一个参数 int fd)c库缓冲—–fflush———〉内核缓冲——–fsync—–〉磁盘。fsync是同步打开的一个文件到缓冲区数据到磁盘上.sync,是同步整个系统的磁盘数据的.

远行的蜗牛 629

FSDataOutputStream中的hsync()不起作用?

最近在做一个demo,用flume收集实时日志到hdfs,然后用spark来读,写入spark用的的FSDataOuputStream,写入的格式是avro格式的。计划是在append数量到了1000条的时候就flush一次,结果发现调用hflush后,只有第一次的时候文件大小才会变化,根据这个接口说明,一旦hflush后,reader能可以看到最新的数据,于是,写了个reader去读,真的能读到

joy6331的专栏 1286

HDFS hflush hsyncclose的区别

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

weixin_30633949的博客 323

Hadoop Distributed File System(HDFS,hadoop分布式文件系统)

主从架构。 以流式数据访问模式来存储超大文件,可以从MB乃至PB级大小,不能行于商用硬件集群上。 是为高吞吐量应用优化的,这可能会以高时延为代价,低时延应选择HBase。 HDFS所能够存储的文件总数受限于NameNode的内存总量。 HDFS中的文件可能只有一个writer,且洗的数据总是将数据添加在文件的末尾。不支持具有多个writer的操作,也不支持在文件的任意位置进行修改(因为这么...

小朋友2滴偷偷的在写博客 2086

Rust那些事之深入理解文件系统的flush

Rust那些事之深入理解fs的flush在 Rust 中,fs 模块提供了文件系统操作的函数,包括向文件写入数据。其中一个常用的函数是 fs::write,它允许用户将数据写入文件。然而,重要的是要注意,fs::write 不会自动刷新或同步数据到磁盘,如果不正确处理,可能会导致潜在的数据丢失或不一致性问题。问题问题出在 fs::write 不保证写入文件的数据立即结束在磁盘上。相反,它会将数据缓...

Francis的博客 924

Linux内核进程详解之一:sync_supers

先说下环境,CentOS 6.0/Linux kernel 2.6.38.8/X86-64,后面提到的代码也都来之kernel 2.6.38.8。这个环节下的进程列表具体如下所示,后续将有一系列的文章分析各个进程(主要是内核进程)的功能: [root@localhost ~]# cat /etc/issue CentOS Linux release 6.0 (Final) Kernel \r o

kenny的专栏 5058

FSDataOutputStream实现追加写

在用Hadoopapi时,会遇见一个情况,每次都会覆盖原来的内容 FileSystem fs=getFs(); FSDataOutputStream fSDataOutputStream= fs.create(new Path("/user/lf_by_pro/zba_dwa.db/zhanggf/a.txt")); fSDataOutputS...

zhanggf的博客 4394

Hadoop-HDFS学习

HDFS学习 0x01 摘要 本文介绍了Hadoop体系中最重要的HDFS原理。 0x02 Hadoop的整体框架 Hadoop由HDFS、MapReduce、HBase、HiveZooKeeper等成员组成,其中最基础最重要元素为底层用于存储集群中所有存储节点文件的文件系统HDFS(Hadoop Distributed File System)来执行MapReduce程序的MapReduce引...

迷路剑客个人博客 3965

图解elasticsearch数据写入流程(包含对refresh、fsyncflush操作的理解)

elasticsearch写入数据时涉及到的核心概念讲解: segment file: 存储倒排索引的文件,每个segment本质上就是一个倒排索引,每秒都会生成一个segment文件,当文件过多时es会自动进行segment merge(合并文件),合并时会同时将已经标注删除的文档物理删除; commit point(重点理解): 记录当前所有可用的segment,每个commit point都会维护一个.del文件(es删除数据本质是不属于物理删除),当es做删改操作时首先会在.del文件中声明某个

男儿当自强 825

HDFS的读写流程 —— Hadoop权威指南4

HDFS读写流程 初始化FileSystem,client调用FileSystem对象的open()方法,打开一个HDFS文件。实际,是获取一个DistributedFileSystem实例 DistributedFileSystem通过RPC调用NameNode,获取一批文件block的位置列表。其中,每个block的副本所在的DataNode,是按照它们与客户端的距离排序的 DistributedFileSystem向客户端返回一个FSDataInpu

lucyLee的博客 3429
上一篇: 装linux服务器进去配置界面,在CentOS 8 Linux上安装和配置SuiteCRM的步骤
下一篇: stm32F的USB可以linux系统,stm32f407以太网及USB OTG快速开发
uu老魏
博客等级 码龄7年 20粉丝 57原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值