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

本文深入探讨了Linux中sync、fsync、fdatasync的区别,并结合Hadoop 2.8.0源码分析了FsDataOutputStream的hflush和hsync操作。hflush类似于sync,仅将数据移动到OS缓存,不等待磁盘写入;而hsync则更接近fsync,不仅等待数据写入磁盘,还确保文件元数据同步。HDFS中,hflush不更新NameNode的文件元信息,而hsync通过强制flush数据并更新长度,更接近于全盘同步。
摘要由CSDN通过智能技术生成

本文是基于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并写本地。

确认

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值