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跟普通的 ...
随机推荐
- Tomcat学习总结(5)——Tomcat容器管理安全的几种验证方式
当访问服务器中受保护的资源时,容器管理的验证方法可以控制确认用户身份的方式.Tomcat支持四种容器管理的安全防护,它们是: BASIC (基本验证):通过HTTP验证,需要提供base64编码文本的 ...
- windows7(64位) PHP APACHE MYSQL
- 一.安装软件准备软件版本以本人安装为例,其他版本同理,软件到各官网下载 1.Apache(httpd-2.2.19-win64) 2.PHP(php-5.3.6-Win32-V ...
- 程序员必知的8大排序(四)-------归并排序,基数排序(java实现)
程序员必知的8大排序(一)-------直接插入排序,希尔排序(java实现) 程序员必知的8大排序(二)-------简单选择排序,堆排序(java实现) 程序员必知的8大排序(三)-------冒 ...
- k8s服务网关ambassador部署
1.ambassador是datawire开源的服务网关,很好的支持kubernetes.具体详细介绍参考官网:https://www.getambassador.io/about/why-ambas ...
- elasticSearch6源码分析(10)SettingsModule
1.SettingsModule概述 /** * A module that binds the provided settings to the {@link Settings} interface ...
- 基于Hadoop2.6.5(HA)的Hive1.2.1的MySQL方式配置
1.Hive配置MySQL Hive只是一个工具,无需配置多台机器,我在CentOS7One机器上配置Hive /usr/local/hive/apache-hive-1.2.1-bin/conf c ...
- Ubuntu下opencv的安装及IDEA开发配置
Ubuntu下opencv的安装及IDEA开发配置 环境配置 这篇博客主要介绍Ubuntu下opencv的安装编译,以及IDEA对opencv进行Java开发的环境配置 安装opencv 首先安装o ...
- Oracle TO_DATE() 函数格式化时间【全】
TO_DATE格式(以时间:2007-11-02 13:45:25为例) Year: yy two digits 两位年 显 ...
- Java 支付宝支付,退款,单笔转账到支付宝账户(支付宝订单退款)
上一篇写到支付宝的支付,这代码copy下来就能直接用了, 我写学习文档时会经常贴 官方参数文档的案例地址, 因为我觉得 请求参数,响应参数说明 官方文档整理的很好,毕竟官方不会误导大家. 我学一个 ...
- Java面试题阶段汇总
初级面试题 Java面试题-基础篇一 Java面试题-基础篇二 Java面试题-集合框架篇三 Java面试题-基础篇四 Java面试题-基础篇五 Java面试题-javaweb篇六 Java面试题 ...