HDFS hflush hsync和close的区别
HDFS的hflush,hsync和close有啥区别,分别做了什么
hflush: 语义是保证flush的数据被新的reader读到,但是不保证数据被datanode持久化.
hsync: 与hflush几乎一样,不同的是hsync保证数据被datanode持久化。
close: 关闭文件.除了做到以上2点,还保证文件的所有block处于completed状态,并且将文件置为closed
场景是写一个字节(append或者create),然后调用hflush.看看hflush做了什么。
涉及到几个线程,一个是调FSDataOutputStream的write的线程,它是应用程序自己的线程,write会将数据以packet的形式一个个的丢入data queue中。
另外两个是HDFS客户端代码中的线程,其中一个是DataStreamer,负责从data queue中取出一个个的packet发出去,过程是为每个block建立一个pipeline,然后发packet,最后关闭pipeline,接着下一个block。另外一个是ResponseProcessor,负责处理下游节点的ack。
实际上,packet是由chunk组成的,每个chunk对应一个checksum,一个packet大概64KB左右,一个chunk通常512字节。通常情况下,每512字节算一个checksum,写入到packet中。但是最后一个chunk通常是不满512字节。hflush实际上,就是将最后不满一个chunk的数据算checksum,然后
写入packet,最后将这个packet放入data queue队列.在我们只写一个字节的场景下,一个字节不够一个chunk,故data queue中始终每个packet,DataStreamer始终等待着没有建立pipeline,调用hflush后,往data queue塞入一个packet,DataStreamer终于从data queue中取到一个packet,然后建立pipeline,接着发送packet。调完hflush的应用程序线程一直在等待最后一个packet的ack被收到,轮到ResponseProcessor上场。他不断的处理从datanode收到的packet ack,不断更新block的长度。接着,执行hflush的应用程序线程终于等到了最后一个packet的ack,然后它告诉namenode最后一个block的长度,namenode更新内存状态,实际
上是根据文件名找到INodeFile,将block长度写入,并且记一条edit log.
下面看看关闭文件close时做了什么.
FSDataOutputStream的close:
一开始也是和hflush一样,将最后一个packet进data queue,不同的是还会生成一个特殊的packet入data queue,lastPacketInBlock标记设为true,意思是告诉datanode这是block的最后一个packet,然后等最后这个包的ack收到。接着关闭DataStreamer和ResponseProcessor线程。然后调用completeFile(),最后结束file lease.
看看completeFile():
通知namenode,namenode会做一些检查:
- 根据文件名从目录树中拿出INode,检查文件是否处于under construction状态,如果不是,则complete file失败.
- 从INode中拿出修改这个文件的lease holder和当前completeFile()这个客户端比较,看是否是同一个client,如果不是,则complete file失败(namenode从目录树中得到当前打开文件的信息,会定期检查打开的文件的lease是否超过hard limit,默认1小时,如果超过了,会强行将文件的lease设置为namenode,这样,client 就不能向namenode commit block了。)
- namenode会检查文件的倒数第二个block是否已经是completed状态,如果不是客户端重试,否则,将最后一个block变成completed状态,其实就是修改一下内存中数据结构,写一条edit log。一个block是completed状态的条件是满足最低副本数要求,默认配置1,配置项DFS_NAMENODE_REPLICATION_MIN_KEY.当datanode收到一个block后,会向namenode汇报,只要有一个datanode汇报成功,namenode就将block置为completed.最后namenode将file置为closed状态。
最后看看hsync.
实现上和hflush几乎一样,代码共有,特殊的是最后一个packet标记为syncBlock状态,datanode收到后就会落盘了.
参考资料
hadoop-hdfs-2.4.1.jar
HDFS hflush hsync和close的区别的更多相关文章
- HDFS中hsync方法介绍
HDFS中hsync方法介绍 原创文章,转载请注明:博客园aprogramer 原文链接:HDFS中hsync方法介绍 1. 背景介绍 HDFS在写数据务必要保证数据的一致性与持久性,从HDFS最初的 ...
- [HDFS Manual] CH1 HDFS体系结构
v\:* {behavior:url(#default#VML);} o\:* {behavior:url(#default#VML);} w\:* {behavior:url(#default#VM ...
- Hadoop hdfs副本存储和纠删码(Erasure Coding)存储优缺点
body { margin: 0 auto; font: 13px / 1 Helvetica, Arial, sans-serif; color: rgba(68, 68, 68, 1); padd ...
- Hadoop学习笔记一(HDFS架构)
介绍 Hadoop分布式文件系统(HDFS)设计的运行环境是商用的硬件系统.他和现存的其他分布式文件系统存在很多相似点.不过HDFS和其他分布式文件系统的区别才是他的最大亮点,HDFS具有高容错的特性 ...
- Hadoop生态集群之HDFS
一.HDFS是什么 HDFS是hadoop集群中的一个分布式的我文件存储系统.他将多台集群组建成一个集群,进行海量数据的存储.为超大数据集的应用处理带来了很多便利. 和其他的分布式文件存储系统相比他有 ...
- HDFS 和 YARN 的 HA 故障切换【转】
来源:https://blog.csdn.net/u011414200/article/details/50336735 一 非 HDFS HA 集群转换成 HA 集群二 HDFS 的 HA 自动切换 ...
- hadoop之HDFS学习笔记(一)
主要内容:hdfs的整体运行机制,DATANODE存储文件块的观察,hdfs集群的搭建与配置,hdfs命令行客户端常见命令:业务系统中日志生成机制,HDFS的java客户端api基本使用. 1.什么是 ...
- day1--大数据概念,hadoop介绍,hdfs整体运行机制
1.什么是大数据 基本概念 在互联网技术发展到现今阶段,大量日常.工作等事务产生的数据都已经信息化,人类产生的数据量相比以前有了爆炸式的增长,以前的传统的数据处理技术已经无法胜任,需求催生技术,一套用 ...
- hdfs运行机制
hdfs:分布式文件系统 hdfs有着文件系统共同的特征: 1.有目录结构,顶层目录是: / 2.系统中存放的就是文件 3.系统可以提供对文件的:创建.删除.修改.查看.移动等功能 hdfs跟普通的 ...
随机推荐
- CentOS 6.5 网络服务器功能的实现①:运用bind搭建基本的DNS服务器
何谓DNS服务?简而言之,DNS服务在互联网中可以实现域名解析(把域名转换成网络可以识别的IP地址). 名词解释①:正向解析:域名解析IP地址:反向解析:IP地址解析域名. DNS服务的正/反向区域解 ...
- Java中的构造器与垃圾回收
构造器 在我们初始化对象时,如果希望设置一些默认值,那么就可以使用构造器,在Java中,构造器使用和类同名的名字且没有返回值,如下 class Test{ private String name; T ...
- 编译centos6.5:glibc 升级2.14问题
第一种:不需要 ln 创建软连接,缺点嘛,就是直接安装到系统文件夹/lib64下,想换回来就比较麻烦.(我选择的第二种,因为公司需要fpm打包,写到脚本里面,第一种之间安装在/usr目录下,打包的包安 ...
- Mysql的select in会自动过滤重复的数据
默认使用 SELECT 语句: 当加上in范围后,结果如下图: in范围内的数据,如果有重复的,只会选择第一个数据. 所以如果不是直接使用SQL语句来查询,而是在代码中来查询时,记得使用 distin ...
- 导入maven项目遇到中文乱码
windows->preferences->content types->word Document 并输入utf-8->update; 右键选中的项目,选择propertie ...
- Spring Import注解
今天了解了,Spring @Import的使用 先贴上Spring官方关于Spring @Import注解的文档链接 https://docs.spring.io/spring/docs/3.0. ...
- ffplay源码分析1-概述
本文为作者原创,转载请注明出处:https://www.cnblogs.com/leisure_chn/p/10301215.html ffplay是一个很简单的播放器,但是初次接触仍会感到概念和细节 ...
- 学习Spring.Net:1.简单的应用之控制台
1.开始. 2.新建一个控制台,我们新建一个SpringNetTest类. using System; using System.Collections.Generic; using System.L ...
- elasticsearch6.7 04.API规范
API Conventions elasticsearch的REST的API是使用HTTP的JSON格式暴露的. 除非另有说明,本章中列出的约定可以在整个REST API中应用. 多索引 索引名称支持 ...
- 编程输出杨辉三角的前10行---多维数组的应用---java实现
import java.util.Scanner;public class yanghui{ public static void main(String[] args){ Scanner sc=n ...