HDFS中hsync方法介绍

原创文章,转载请注明:博客园aprogramer

原文链接:HDFS中hsync方法介绍

1. 背景介绍

HDFS在写数据务必要保证数据的一致性与持久性,从HDFS最初的版本到2.0版本HDFS提供了两种同步语义。 
1. 将client端写入的数据刷到每个DataNode的OS缓存中,如果每个副本所在的DataNode同时crash时(例如机房断电)就会导致数据丢失(sync和hflush方法)。
2. 将client端写入的数据刷到每个DataNode的磁盘中(hsync方法); 
在Hadoop2.0和cdh4中DFSOutputStream提供了sync,hflush和hsync三个方法,sync和hflush均是语义1,而hsync是语义2,hsync比sync和hflush的同步性更强,下面详细介绍hsync。 

2. Hadoop2.0中hsync的语义

hsync的语义是:client端所有的数据都发送到副本的每个datanode上,并且datanode上的每个副本都完成了posix中fsync的调用,也就是说操作系统已经把数据刷到磁盘上(当然磁盘也可能缓冲数据);需要注意的是当调用fsync时只有当前的block会刷到磁盘中,要想每个block都刷到磁盘,必须在创建流时传入Sync标示。 
通过分析上面的语义,可以确定hsyn涉及到两个角色client和DataNode,下面分别说明这两个角色。

3. DFSClient端逻辑

DFSClient端逻辑主要包括以下几步:

1. 判断是否需要sync,如果当前的数据都已经sync到磁盘了,则不需要再次sync;判断方法是首先调用flushBuffer(true),如果byteCurBlock(当前block的最后一个字节在file中的偏移量)大于上次sync的偏移量,则说明需要sync,否则不需要;
2. 如果需要sync,则将当前package的sync标示设为true;
3. 调用waitAndQueueCurrentPacket()将当前Package放到发送队列中
4. waitForAckedSeqno()等待发送package的确认包
5. 如果当前block没有调用namenode.fsync(),则调用该方法,持久化block元数据
6. 调用streamer.setHflush();
client端的时序图如下所示
 
查看大图:大图

4.DataNode端处理逻辑

DataNode端的改动比较简单,当接收的package的有sync标示,则执行flushOrSync方法(通过调用FileChannel的force方法,force方法会保证将文件内容刷到磁盘中)将block文件及meta文件刷到磁盘。序列图如下:
 
查看大图:大图

5. 性能分析及改进

由于调用hsync会比较耗时,将来可优化的方向:

1. 不是每个副本的DataNode都执行hsync,只有一个DataNode执行hsync;
2. 不同机架上的DataNode执行hsync;
3. hsync可同步进行,而不是等待hsync完成之后再返回给client端response(在这种情况下,client端的hsync方法的返回并不确保sync的完成,只有datanode端能保证)

6. 参考资料

[2]. Hadoop2.0代码
[3]. https://issues.apache.org/jira/browse/HDFS-744 

HDFS中hsync方法介绍的更多相关文章

  1. Python中__init__方法介绍

    本文介绍Python中__init__方法的意义.         __init__方法在类的一个对象被建立时,马上运行.这个方法可以用来对你的对象做一些你希望的 初始化 .注意,这个名称的开始和结尾 ...

  2. python中join()方法介绍

    描述 Python join() 方法用于将序列中的元素以指定的字符连接生成一个新的字符串. 语法 join()方法语法:str.join(sequence) 参数 sequence -- 要连接的元 ...

  3. Java中setCharAt()方法介绍

    --转载自网络,备忘 这是StringBuffer类里面的一个方法:主要是用来替换的,方法里面有两个参数setCharAt(int index,Char ch),第一个参数是取代的位置 索引从0开始 ...

  4. 使用Memcache在PHP中调试方法的介绍及应用

    使用Memcache在PHP中调试方法的介绍及应用 如果我们在网络开发中,特别是大访问量的web项目开发中,为了提高响应速度,减少数据查询运算,那么我们都会选用memcahce.首先我们必须要安装,接 ...

  5. C++中内存泄漏的检测方法介绍

    C++中内存泄漏的检测方法介绍 首先我们需要知道程序有没有内存泄露,然后定位到底是哪行代码出现内存泄露了,这样才能将其修复. 最简单的方法当然是借助于专业的检测工具,比较有名如BoundsCheck, ...

  6. java中的 java.util.concurrent.locks.ReentrantLock类中的lockInterruptibly()方法介绍

    在java的 java.util.concurrent.locks包中,ReentrantLock类实现了lock接口,lock接口用于加锁和解锁限制,加锁后必须释放锁,其他的线程才能进入到里面执行, ...

  7. PHP删除数组中空值的方法介绍

    这篇文章主要介绍了PHP删除数组中空值的方法介绍,需要的朋友可以参考下 说来惭愧,以前在去掉数组的空值是都是强写foreach或者while的,利用这两个语法结构来删除数组中的空元素,简单代码如下: ...

  8. Python面向对象中的classmethod类方法和__getattr__方法介绍

    一.classmethod介绍 介绍:@classmethod修饰符我们从名称就可以知道,这是一个类方法,那么和普通的类中的方法有什么不同的 a.类方法,是由类本身调用的,无需实例化类,直接用类本身调 ...

  9. 游戏引擎中三大及时光照渲染方法介绍(以unity3d为例)

    (转)游戏引擎中三大及时光照渲染方法介绍(以unity3d为例)   重要:在目前市面上常见的游戏引擎中,主要采用以下三种灯光实现方式: 顶点照明渲染路径细节 Vertex Lit Rendering ...

随机推荐

  1. 聊聊数据库~6.SQL运维中篇

    上篇回顾:https://www.cnblogs.com/dotnetcrazy/p/10810798.html#top 1.6.5.MySQL日志相关 本文的测试环境:MySQL5.7.26.Mar ...

  2. SAP HR 复制PA30的人员

    [转自http://www.512test.com/home/space.php?uid=19&do=blog&id=2381] 很多顾问测试HR的程序时都为录入人员头痛,下面的程序提 ...

  3. 4G U盘版64位bitcoin专用挖矿操作系统

    这个操作系统是基于linux的操作系统,采用的ubuntu平台打造,所有的软件都已经安装齐备,是一个bitcoin专用挖矿操作系统,是64位的,对于显卡数量基本上没有限制,前提是你的主板支持足够多的显 ...

  4. 基于WebServices简易网络聊天工具的设计与实现

    基于WebServices简易网络聊天工具的设计与实现 Copyright 朱向洋 Sunsea ALL Right Reserved 一.项目内容 本次课程实现一个类似QQ的网络聊天软件的功能:服务 ...

  5. 20145229吴姗珊 《Java程序设计》第5周学习总结

    20145229吴姗珊 <Java程序设计>第5周学习总结 教材学习内容总结 第八章 异常处理 1.设计错误对象都继承自java.lang.Throwable类 2.Java中所有错误都会 ...

  6. 剑指offer——二叉树的深度与平衡二叉树的判断

    通过后续遍历,可以减少重复访问 #include <iostream> #include <string> using namespace std; struct Binary ...

  7. Ubuntu dpkg 查询已安装的软件包

    要检查特定的包,比如firefox是否安装了,使用这个命令: dpkg -s firefox 要列出你系统中安装的所有包,输入下面的命令: dpkg --get-selections 你同样可以通过g ...

  8. explain分析sql效果

    1.id:  代表select 语句的编号, 如果是连接查询,表之间是平等关系, select 编号都是1,从1开始. 如果某select中有子查询,则编号递增.如下一条语句2个结果 mysql> ...

  9. Java 9 逆天的十大新特性

    在介绍java9之前,我们先来看看java成立到现在的所有版本. 1990年初,最初被命名为Oak: 1995年5月23日,Java语言诞生: 1996年1月,第一个JDK-JDK1.0诞生: 199 ...

  10. Struts2 遇到的问题汇总

    1.报错如下信息: org.apache.jasper.JasperException: The Struts dispatcher cannot be found. This is usually ...