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过程的更多相关文章

  1. Hadoop之HDFS文件读写过程

    一.HDFS读过程 1.1 HDFS API 读文件 Configuration conf = new Configuration(); FileSystem fs = FileSystem.get( ...

  2. HDFS文件读写过程

    参考自<Hadoop权威指南> [http://www.cnblogs.com/swanspouse/p/5137308.html] HDFS读文件过程: 客户端通过调用FileSyste ...

  3. HDFS 文件读写过程

    HDFS 文件读写过程 HDFS 文件读取剖析 客户端通过调用FileSystem对象的open()来读取希望打开的文件.对于HDFS来说,这个对象是分布式文件系统的一个实例. Distributed ...

  4. hdfs读写删除过程解析

    一.hdfs文件读取过程 hdfs有一个FileSystem实例,客户端通过调用这个实例的open()方法就可以打开系统中希望读取的文件,hdfs通过rpc协议调用Nadmenode获取block的位 ...

  5. HDFS读写数据过程

    一.文件的打开 1.1.客户端 HDFS打开一个文件,需要在客户端调用DistributedFileSystem.open(Path f, int bufferSize),其实现为: public F ...

  6. hdfs深入:06、hdfs的写入过程

    7.HDFS的文件写入过程 详细步骤解析: 1. client发起文件上传请求,通过RPC与NameNode建立通讯,NameNode检查目标文件是否已存在,父目录是否存在,返回是否可以上传: 2. ...

  7. HDFS Namenode启动过程

    文章作者:luxianghao 文章来源:http://www.cnblogs.com/luxianghao/p/6564032.html  转载请注明,谢谢合作. 免责声明:文章内容仅代表个人观点, ...

  8. HDFS数据读写过程

  9. HDFS读写过程

    HDFS的读写过程: 读过程: Client收到用户的读请求——client拿着path向namenode请求文件或者block的datanode列表——client从返回的datanode列表中选择 ...

随机推荐

  1. css实现修改默认滚动条样式

    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"><html><head&g ...

  2. javascript实现深克隆的几种方法

    1)普通函数实现 function cloneObject(obj) { if (obj === null || typeof obj !== 'object') { return obj; } va ...

  3. C# 注释&SQL注释

    SQL注释: 1.单行注释:--单行注释 2.多行注释:/*多行 注释*/ C#注释: 1.单行注释://单行注释 2.多行注释:/*多行 注释*/ 3.说明注释:///<summary> ...

  4. 【VS2012】F5不能自动编译新修改

    VS2012正常使用时,如果文件有修改,按F5运行时,会自动对修改的文件进行重新编译.今天遇到的情况却并没有.度娘了下,网上有相同的问题,解决办法是“工具->选项->项目和解决方案-> ...

  5. LintCode2016年算法比赛----二叉树的所有路径

    二叉树的所有路径 题目描述 给定一棵二叉树,找从根节点到叶子节点的所有路径 样例 给出下面这课二叉树: 1 / \ 2 3 \ 5 所有根到叶子的路径为: [ "1->2->5& ...

  6. 引入 Tinker 之后如何在 Debug 模式下开启 Instant Run

    在<Tinker + Bugly + Jenkins 爬坑之路>一文中讲了在接入 Tinker 之后,Jenkins 中的一些坑,由此,热修复算告一段落,但是,在直接 Run 模式运行时, ...

  7. CPU硬件辅助虚拟化技术

    目前主要有Intel的VT-x和AMD的AMD-V这两种技术.其核心思想都是通过引入新的指令和运行模式,使VMM和Guest OS分别运行在不同模式(ROOT模式和非ROOT模式)下,且Guest O ...

  8. 检查 NaN 数据值 (C/C++/Python 实现)

    NaN 是 Not a Number 的缩写.它是一个数值类型值,通常在浮点计算中,表示未定义或无法表示的值.而且,不能直接使用相等运算符 (==) 检查 NaN.由于在程序中,nan == nan ...

  9. SQL Server ->> 使用Azure Active Directory Authentication连接到Azure SQL Database

    SQL Server 2016以后支持Azure AD集成验证,这当中有些数据驱动必须在高版本才可以使用,支持的包括sqlcmd,SSDT,JDBC,ODBC,SSMS等. 对于SSIS来讲,我们需要 ...

  10. Python 爬虫练习项目——异步加载爬取

    项目代码 from bs4 import BeautifulSoup import requests url_prefix = 'https://knewone.com/discover?page=' ...