HDFS的Write过程
hadoop中重要的组成部分HDFS,它所发挥的重要作用是进行文件的后端存储。HDFS针对的是低端的服务器,场景为读操作多、写操作少的情况。在分布式存储情况下,比较容易出现的情况是数据的损害,为了保证数据的可靠和完整,实现了数据的检验和(checksum)和多副本放置策略等措施。在HDFS中采用比较多的是CRC(循环冗余校验码)的检验和方式。HDFS是一种基于块的分布式文件系统,其他的有基于对象的分布式文件系统Ceph。
下面介绍几个关于HDFS中写入操作涉及到的概念:
1、Block:在HDFS中,每个文件都是采用的分块的方式存储,每个block放在不同的datanode上,每个block的标识是一个三元组(block id, numBytes,generationStamp),其中block id是具有唯一性,具体分配是由namenode节点设置,然后再由datanode上建立block文件,同时建立对应block meta文件(其中的内容,大部分是对应数据的检验和内容)。
2、packet:在DFSclient与DataNode之间通信的过程中,发送和接受数据过程都是以一个packet为基础的方式进行。
3、Chunk:对应的中文名字也可以称为块,但是为了与block区分,还是称之为chunk。在DFSClient与DataNode之间通信的过程中,由于文件采用的是基于块的方式来进行的,但是在发送数据的过程中是以packet的方式来进行的,每个packet包含了多个chunk,同时对于每个chunk进行checksum计算,生成checksum bytes。
下面是Packet的数据格式:
+-----------------------------------------------------------------------+
| 4 byte packet length(exclude packet header) |
+-----------------------------------------------------------------------+
| 8 byte offset in the block | 8 byte sequence number |
+-----------------------------------------------------------------------+
| 1 byte isLastPacketInBlock |
+-----------------------------------------------------------------------+
| 4 byte Length of actual data |
+-----------------------------------------------------------------------+
| x byte checksum data. x is defined below |
+-----------------------------------------------------------------------+
| actual data ......... |
+-----------------------------------------------------------------------+
x = (length of data + BYTE_PER_CHECKSUM - 1) / BYTE_PER_CHECKSUM * CHECKSUM_SIZE
在DFSClient与DataNode之间通信采用的是基于C/S的结构。其中涉及到DFSClient中写入操作过程中的重要的类有FSDataOutputStream、DFSOutputStream、FSOutputSummer。
下面是关于DFSClient写入数据过程的分析:
1、建立DFSClient类型,然后通过clientprotocol的远程过程调用方法addblock,获取具体的块信息,返回给DFSClient
2、通过返回的locatedBlock信息建立pipleline在多个DataNode上
+------------+ connect +------------+ connect +------------+DFSClient | |---------->| |----------->| |-------> | datanode | ack | datanode | ack | datanode |<------- | |<----------| |<-----------| |ack +------------+ +------------+ +------------+
DFSClient在要发送数据包之前需要建立与多个Datanode之间的联系,这样在Pipeline建立之后就可以接下来的数据传输
3、DFSClient进行发送数据使用的是FSOutputSummer类的write(byte[ ]buffer, int offset,int len),当达到一个chunk的时候调用DFSOutputStream的writechunk(byte[] b, int offset,int len,byte[] checksum),当达到一个packet的时候就完成了这个packet,接下来就是进入到发送队列中去,由DataStreamer类对象的发送线程发送数据(其中建立与多个datanode之间的数据pipeline的联系是由DataStreamer完成,当一个Block完成后,开始建立另外一个pipeline,重复上述过程)
附加说明:在上述DFSClient与DataNode之间建立联系的过程中发送的请求报文头部和DFSClient与DataNode之间建立读请求的报文头部差不多类似。在此不多加说明。
有了DFSClient,对应需要有DataNode上对应的守护线程来进行数据的接收,下面是DataNode上的接收过程分析:
1、DataNode上启动了一个重要的线程DataXceiverServer,用于侦听来自DFSClient或者其他DataNode上的连接请求
2、当DFSClient需要进行连接的时候,DataXceiverServer响应请求,建立一个DataXceiver线程,为之服务,接下来就是建立pipeline的连接管道,验证发送过来的请求报文头部信息
3、如果接受到的请求是OP_WRITE_BLOCK,则建立BlockReceiver类对象,用于接受具体的data,同时也接受来自数据中的checksum,两部分不同的数据放在不同的部分,data部分数据放在标准的block文件中,而checksum数据放在meta为后缀名的文件中保留下来,为以后数据完整性检查使用(可以是DFSClient进行验证,也可以是Blockscanner验证)
HDFS的Write过程的更多相关文章
- Hadoop之HDFS文件读写过程
一.HDFS读过程 1.1 HDFS API 读文件 Configuration conf = new Configuration(); FileSystem fs = FileSystem.get( ...
- HDFS文件读写过程
参考自<Hadoop权威指南> [http://www.cnblogs.com/swanspouse/p/5137308.html] HDFS读文件过程: 客户端通过调用FileSyste ...
- HDFS 文件读写过程
HDFS 文件读写过程 HDFS 文件读取剖析 客户端通过调用FileSystem对象的open()来读取希望打开的文件.对于HDFS来说,这个对象是分布式文件系统的一个实例. Distributed ...
- hdfs读写删除过程解析
一.hdfs文件读取过程 hdfs有一个FileSystem实例,客户端通过调用这个实例的open()方法就可以打开系统中希望读取的文件,hdfs通过rpc协议调用Nadmenode获取block的位 ...
- HDFS读写数据过程
一.文件的打开 1.1.客户端 HDFS打开一个文件,需要在客户端调用DistributedFileSystem.open(Path f, int bufferSize),其实现为: public F ...
- hdfs深入:06、hdfs的写入过程
7.HDFS的文件写入过程 详细步骤解析: 1. client发起文件上传请求,通过RPC与NameNode建立通讯,NameNode检查目标文件是否已存在,父目录是否存在,返回是否可以上传: 2. ...
- HDFS Namenode启动过程
文章作者:luxianghao 文章来源:http://www.cnblogs.com/luxianghao/p/6564032.html 转载请注明,谢谢合作. 免责声明:文章内容仅代表个人观点, ...
- HDFS数据读写过程
- HDFS读写过程
HDFS的读写过程: 读过程: Client收到用户的读请求——client拿着path向namenode请求文件或者block的datanode列表——client从返回的datanode列表中选择 ...
随机推荐
- 第一章Bootstrap简介
一.Bootstrap简介 Bootstrap是基于 HTML.CSS.JAVASCRIPT 的前端框架,它简洁灵活,使得 Web 开发更加快捷.它由Twitter的设计师Mark Otto和Jaco ...
- safari
http://www.zhangxinxu.com/wordpress/2014/10/mobilebone-js-mobile-web-app-core/ http://rawgit.com/zha ...
- mac下 安装tomcat 后项目无法启动以及 错误 找不到或无法加载主类
按照网上的步骤,在mac上安装tomcat后,写个简单的测试类报错:错误 找不到或无法加载主类 Class JavaLaunchHelper is implemented in both /Libra ...
- Linux-文件目录命令
黑色 代表是普通的文件 蓝色 代表是目录(文件夹) 紫色 代表是图片文件 绿色 代表是可以执行的文件(脚本文件)-->存放linux命令的 红色 代表是压缩文件 clear:清屏pwd:显示当前 ...
- linux安装redis+RedisDesktopManager
一:redis简介 (REmote DIctionary Server Redis远程字典服务器) 1:Redis是一个开源的使用ANSI C语言编写.完全免费开源的,遵守BSD协议.支持 ...
- vs2015生成的mvc模板结构说明
- javascript中简单提示框
CSS部分 .help-tip{ width: 340px; border:1px solid #A0A0A0; background-color: #F8F8F8; border-radius: 5 ...
- Java学习---连接数据库操作
Java连接Oracle数据库 package com.ftl.mysql; import java.sql.Connection; import java.sql.DriverManager; im ...
- MVC中使用EF的技巧集(二)——分部验证
1.从数据库生成模型后,再次更新模型时,之前设置的验证规则会丢失. 解决方法:在Models文件夹中新建一个空白类,把它命名为shujuyanzh.cs(类名可以自定),然后把Models中自动生成的 ...
- jquery.form.js(ajax表单提交)
Form插件地址: 官方网站:http://malsup.com/jQuery/form/ 翻译地址:http://www.aqee.net/docs/jquery.form.plugin/jquer ...