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列表中选择 ...
随机推荐
- css实现修改默认滚动条样式
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"><html><head&g ...
- javascript实现深克隆的几种方法
1)普通函数实现 function cloneObject(obj) { if (obj === null || typeof obj !== 'object') { return obj; } va ...
- C# 注释&SQL注释
SQL注释: 1.单行注释:--单行注释 2.多行注释:/*多行 注释*/ C#注释: 1.单行注释://单行注释 2.多行注释:/*多行 注释*/ 3.说明注释:///<summary> ...
- 【VS2012】F5不能自动编译新修改
VS2012正常使用时,如果文件有修改,按F5运行时,会自动对修改的文件进行重新编译.今天遇到的情况却并没有.度娘了下,网上有相同的问题,解决办法是“工具->选项->项目和解决方案-> ...
- LintCode2016年算法比赛----二叉树的所有路径
二叉树的所有路径 题目描述 给定一棵二叉树,找从根节点到叶子节点的所有路径 样例 给出下面这课二叉树: 1 / \ 2 3 \ 5 所有根到叶子的路径为: [ "1->2->5& ...
- 引入 Tinker 之后如何在 Debug 模式下开启 Instant Run
在<Tinker + Bugly + Jenkins 爬坑之路>一文中讲了在接入 Tinker 之后,Jenkins 中的一些坑,由此,热修复算告一段落,但是,在直接 Run 模式运行时, ...
- CPU硬件辅助虚拟化技术
目前主要有Intel的VT-x和AMD的AMD-V这两种技术.其核心思想都是通过引入新的指令和运行模式,使VMM和Guest OS分别运行在不同模式(ROOT模式和非ROOT模式)下,且Guest O ...
- 检查 NaN 数据值 (C/C++/Python 实现)
NaN 是 Not a Number 的缩写.它是一个数值类型值,通常在浮点计算中,表示未定义或无法表示的值.而且,不能直接使用相等运算符 (==) 检查 NaN.由于在程序中,nan == nan ...
- SQL Server ->> 使用Azure Active Directory Authentication连接到Azure SQL Database
SQL Server 2016以后支持Azure AD集成验证,这当中有些数据驱动必须在高版本才可以使用,支持的包括sqlcmd,SSDT,JDBC,ODBC,SSMS等. 对于SSIS来讲,我们需要 ...
- Python 爬虫练习项目——异步加载爬取
项目代码 from bs4 import BeautifulSoup import requests url_prefix = 'https://knewone.com/discover?page=' ...