zhangyangffff 2011-07-12
From:https://issues.apache.org/jira/browse/HDFS-265
在Hadoop0.21.0中fsync(API中是DFSOutputStream的sync()方法)操作改名为hflush,原因是它的实际语义是刷新(flush)缓存,而不是同步数据到硬盘,fsync功能(Syncable接口中的hsync方法)可能会在以后的版本中添加(参考:https://issues.apache.org/jira/browse/HDFS-744,https://issues.apache.org/jira/browse/HADOOP-6313定义了三种flush)。
read/write语义不含append/hflush
1、对于打开的文件的数据,DFS尽力提供持久性( best effort durability ,类似ip层的besteffort,即不可靠)
-NameNode持久化文件元数据信息,但是不持久化文件由哪些块组成的信息,重启NameNode可能会导致数据丢失
-DFS不保证各数据块的副本数和文件的复制因子一致,如果一个数据块没有一个有效副本被写入,则写失败。
2、对于关闭的文件的数据,DFS提供强持久性
-NameNode持久化文件和数据块元数据信息,重启NameNode不会导致数据丢失。
-DFS保证各数据块的副本数和文件的复制因子一致。
-文件关闭不保证数据已经到达磁盘。如果数据未到达磁盘,重启DataNode会导致数据丢失。
3、read
-对于打开的文件数据,只有已完成块(block写满)的数据对readers是可见的。正在写的块中的数据,对reader来说是不可见的
append(追加写入)
1、只允许一个writer/appender ,这表明一个client只能append一个关闭的文件
2、已关闭的文件打开append时,DFS为旧数据提供强持久性,为新append的数据尽力提供持久性( best effort durability )
hflush(刷新缓存)
1、hflush保证hflush之前写入的数据对于新的reader都是可见的
-hflush不保证数据同步到磁盘,重启DataNode节点可能造成hflush过的数据丢失
2、对于hflush的数据,DFS只提供弱持久性
-NameNode持久化hflush的数据所属的block的元数据信息,重启NameNode不会导致hflush了的数据的丢失
-DFS不保证各数据块的副本数和文件的复制因子一致
read(读入文件)
1、允许存在多个程序并行地读取未关闭的文件
2、hflush的数据,对于新的新的reader都是可见的
3、writer/appender不调用hflush,reader仍可以看到之前写入的数据,但会有延时
4、如果一个字节对一个reader可见,它就是持续可见的,除非读该字节的所有副本数都失败,所有副本读入都失败将会返回一个error
-这表明一个字节的一个副本对reader可见,那其他副本也可见
-这对于hflush的和没有hflush的数据都适用