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验证)

时间: 2024-12-15 05:49:58

HDFS的Write过程的相关文章

Hadoop之HDFS文件读写过程

一.HDFS读过程 1.1 HDFS API 读文件 1 Configuration conf = new Configuration(); 2 FileSystem fs = FileSystem.get(conf); 3 Path file = new Path("demo.txt"); 4 FSDataInputStream inStream = fs.open(file); 5 String data = inStream.readUTF(); 6 System.out.pri

初学HDFS的读过程和写过程的分析

刚刚接触HDFS,感觉HDFS的数据可靠性非常高,记录一下.. 一HDFS的基本原理 HDFS采用了主从(Master/Slave)结构模型,一个HDFS集群包括一个名称节点(NameNode)和若干个数据节点(DataNode).名称节点作为中心服务器,负责管理文件系统的命名空间及客户端对文件的访问.集群中的数据节点一般是一个节点运行一个数据节点进程,负责处理文件系统客户端的读/写请求,在名称节点的统一调度下进行数据块的创建.删除和复制等操作.每个数据节点的数据实际上是保存在本地Linux文件

HDFS读写过程

一.HDFS读文件过程 1.客户端调用DistributedFileSystem的对象实例FileSystem的open方法来打开希望读取的文件,调用open后会返回一个FSDataInputStream对象. 2.分布式文件系统DistributedFileSystem通过RCP(远程过程调用)来调用namenode,以确定文件的起始块的位置(这些信息都存储在namenode的内存中).对于每个块,namenode都返回该块的所有副本对应的datanode地址,在真正读取的过程中,这些data

HDFS知识点总结

学习完Hadoop权威指南有一段时间了,现在再回顾和总结一下HDFS的知识点. 1.HDFS的设计 HDFS是什么:HDFS即Hadoop分布式文件系统(Hadoop Distributed Filesystem),以流式数据访问模式来存储超大文件,运行于商用硬件集群上,是管理网络中跨多台计算机存储的文件系统. HDFS不适合用在:要求低时间延迟数据访问的应用,存储大量的小文件,多用户写入,任意修改文件. 2.HDFS的概念 HDFS数据块:HDFS上的文件被划分为块大小的多个分块,作为独立的存

大数据【二】HDFS部署及文件读写(包含eclipse hadoop配置)

一 原理阐述 1' DFS 分布式文件系统(即DFS,Distributed File System),指文件系统管理的物理存储资源不一定直接连接在本地节点上,而是通过计算机网络与节点相连.该系统架构于网络之上,势必会引入网络编程的复杂性,因此分布式文件系统比普通磁盘文件系统更为复杂. 2' HDFS 借此,关于GFS和HDFS的区别与联系查看 我于博客园找到的前辈的博客>>http://www.cnblogs.com/liango/p/7136448.html HDFS(Hadoop Dis

记录一则Spark读写和Lost Excutor错误的分析和解决过程

一.概述 上篇blog记录了些在用spark-sql时遇到的一些问题,今天继续记录用Spark提供的RDD转化方法开发公司第一期标签分析系统(一部分scala作业逻辑代码后面blog再给大家分享)遇到的一些SPARK作业错误信息.其中有些问题可能一些数据量或者shuffle量比较小的作业时不会遇到的,我们整套标签系统的初级输入数据大概是8T左右,这里也是个参考.(下面的Spark部署模式为spark on yarn) 二.问题 1.大规模数据往HDFS中写时候,报了HDFS读写超时,具体日志看下

【第二天】用kettle向hdfs复制文件

http://blog.csdn.net/greatelite/article/details/18676281 遇到的问题: 在连接到hdfs服务器上,一直提示unable to connect to HDFS Server 解决过程中: ①网上找了各种说是jar包驱动不兼容,端口号不对,最后都没解决 ②最后发现,是服务器上hadoop与kettle所用hadoop插件不一致, 服务器上用的是Hadoop 2.0.0-cdh4.5.0,这是一个经过第三方包装过的hadoop,而我在$PDI_H

Hadoop -- HDFS 读写数据

一.HDFS读写文件过程 1.读取文件过程 1)       初始化FileSystem,然后客户端(client)用FileSystem的open()函数打开文件 2)       FileSystem用RPC调用元数据节点,得到文件的数据块信息,对于每一个数据块,元数据节点返回保存数据块的数据节点的地址. 3)       FileSystem返回FSDataInputStream给客户端,用来读取数据,客户端调用stream的read()函数开始读取数据. 4)       DFSInpu

Java操作HDFS开发环境搭建以及HDFS的读写流程

Java操作HDFS开发环境搭建 在之前我们已经介绍了如何在Linux上进行HDFS伪分布式环境的搭建,也介绍了hdfs中一些常用的命令.但是要如何在代码层面进行操作呢?这是本节将要介绍的内容: 1.首先使用IDEA创建一个maven工程: maven默认是不支持cdh的仓库的,需要在pom.xml中配置cdh的仓库,如下: <repositories> <repository> <id>cloudera</id> <url>https://re