`
bupt04406
  • 浏览: 348420 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

DFSClient 写一个Block的过程

 
阅读更多

 

DFSClient 写一个Block的过程


 

 

 

(1) 上层应用程序往输出流(FSDataOutputStream封装)写数据,底层DFSClient把数据切分成packets(典型的是64K),一个一个packet发送出去。
Packet 格式:

     *  (H is head, C is checksum data, D is payload data)
     *
     * [HHHHHCCCCC________________DDDDDDDDDDDDDDDD___]
     *       ^    ^               ^               ^
     *       |    checksumPos     dataStart       dataPos
     *   checksumStart

Head 里面包含pktLen(packet的长度)、dataLen(不包含checksum)、是否是当前Block的最后一个Packet等信息。

Packet的数据又是由一些chunks组成。每个Chunk默认是512字节,对应产生4byte的checksum。
所以写数据的时候会先缓存,够一个Chunk了就往当前Packet里面写一个chunk的数据,当Packet达到了最大的chunk数目(64k/512=128)时,这个Packet就满了,就new 一个新的Packet,往新的packet里面写数据。满了的packet就会往dataQueue里面put,由线程DataStreamer写出去。前面是正常的write过程。
sync操作会强制把缓冲的数据即使没有满足一个chunk,往packet里面发送,然后把packet往dataQueue里面put,然后等到这个packet的ack返回回来。
对于hbase key=10,value=100的数据大小,往往生成的packet只有几百byte(即使hbase用了group sync)。 


(2)  DFSClient 对于建立的一个pipeline有两个线程,一个是DataStreamer,一个是ResponseProcessor。
DataStreamer线程从dataQueue队列里面获得packet,把packet数据发送出去,然后put到ackQueue队列中。
ResponseProcessor 获得DataNode1的ack,然后把packet从ackQueue中拿掉,等待sync该packet的APP就会被notify。
需要注意的是每个packet由一个Seqno,一个block的Seqno从0开始,顺序递增,这个seqno用于顺序保证的,所有的packet必须顺序被处理,如果乱序了就会抛出异常。
ackQueue.size() +  dataQueue.size() < 80     each packet 64K, total 5MB   像hbase这种sync频繁的,实际上远远不够这么多。 (1000*80=78k)



(3) DataNode 也有两个线程DataXceiver、PacketResponder。
DataXceiver主要是分析是那种请求:读、写等。写调用BlockReceiver来处理。
BlockReceiver 里面就是一个个packet进行处理,读到一个packet的数据 需要往两个地方写:一个是写一个datanode、一个是本地disk。先往下一个datanode写,后往disk写。做完之后就往ackQueue里面写一个packet,这个packet跟DFSClient的packet不同,这个packet只记录seqno以及lastPacketInBlock(是否是本block的最后一个packet).
最后面一个。
注意在建立pipeline的时候已经DFSClient以及pipeline上面的DataNode已经知道了后续的节点(node)。


最后面一个DataNode的PacketResponder 从ackQueue里面获得一个packet往前序的DataNode发送ack。中间的DataNode只有获得后面的DataNode的ack(read an ack from downstream datanode)后才能往前序的DataNode发送ack。

在hbase的运行过程中,很多时候各个packet的处理时间不同,读写、compact相互影响。
目前社区已经实现了并行写:DFSClient像各个DataNode写数据,不在是pipeline的方式,能够降低latency,但是同时也会降低throughput,如果网络带宽不是问题可以使用。

 

一个Packet在这个过程的各个阶段都会产生延时,导致hbase一条记录写入产生毛刺,比如DFSClient端packet可能会在dataQueue里面停留1ms以上等。

 

https://issues.apache.org/jira/browse/HDFS-265

 

  • 大小: 74.7 KB
分享到:
评论

相关推荐

    Hadoop学习总结之二:HDFS读写过程解析.doc

    当`DFSClient`调用`NameNode.getBlockLocations`时,NameNode返回一个`LocatedBlocks`对象,包含了文件的所有块信息,包括每个块的`Block`对象,块在文件中的偏移量以及存储这些块的`DataNode`列表。 2. **NameNode...

    Hadoop源代码分析(四一)

    在深入解析Hadoop源代码的过程中,本文档聚焦于DFSClient类的剩余部分。DFSClient是Hadoop分布式文件系统(HDFS)中的核心组件之一,负责客户端与NameNode之间的交互。在前一部分已经详细分析了DFSClient内部类的...

    Hadoop源代码分析(三八)

    ### Hadoop源代码分析(三八):深入理解HDFS中的DFSClient与Block Reader #### 概述 本文档深入探讨Hadoop分布式文件系统(HDFS)中的DFSClient及其内部类,特别是关注LeaseChecker、FSInputStream以及Block ...

    Hadoop学习总结之二:HDFS读写过程解析

    具体来说,当执行`DistributedFileSystem.open(Path f, int bufferSize)`时,实际上是通过`DFSClient`对象的`open`函数来创建一个`DFSInputStream`实例并返回。这个过程涉及几个关键步骤: - 首先,`DFSInputStream...

    hadoop client与datanode的通信协议分析

    客户端首先创建一个新的SocketOutputStream,向DataNode发送读取Block的请求头,包括数据传输版本、操作类型、Block ID、生成戳、起始偏移量和读取长度等信息。接着,客户端创建SocketInputStream,并检查返回的消息...

    对Hadoop-HDFS性能造成重大影响的杀手-Shell.docx

    由于`ProcessBuilder`创建子进程的过程可能会使JVM的大部分线程处于等待状态,这可能导致DFSClient在等待过程中出现写入超时或关闭流失败的问题。在Hadoop的0.21-unk版本中,流的关闭存在安全风险,这可能会导致资源...

    HDFS资料整理.pdf

    5. 在读取完一个block后,DFSInputStream关闭与当前DataNode的连接,并开始读取下一个block。 6. 客户端完成读取后,调用FSDataInputStream的close方法结束。在整个过程中,如果客户端和DataNode通信出现问题,会...

    Hadoop分布式文件系统的文件读写

    1. **Block分裂**:HDFS将大文件划分为多个固定大小的块(默认128MB),每个块最多存储在一个DataNode上。如果文件大小不足一个块,也会创建一个完整的块。 2. **NameNode与DataNode交互**:客户端首先与NameNode...

    大数据面试一:hadoop

    4. 数据开始分块(Block)并传输,Client向第一个DataNode(dn1)上传一个Block,该DataNode将数据分发给其他DataNodes(dn2和dn3)。 HDFS读取文件的过程则如下: 1. 客户端向NameNode请求下载文件的元数据。 2. ...

    Hadoop分布式文件系统架构

    HDFS采用主从架构,由一个名为NameNode的主节点和多个名为DataNode的从节点组成: - **NameNode**:负责管理文件系统的命名空间(Namespace),包括文件、目录和块的映射信息。此外,NameNode还管理客户端对文件的...

    Hadoop源代码分析

    源代码中的`org.apache.hadoop.hdfs.DFSClient`是客户端的主要实现,它处理与NameNode和DataNode的通信。 接下来,我们转向MapReduce,这是Hadoop用于大规模数据处理的编程模型。MapReduce包含两个主要阶段:Map...

    《Hadoop技术内幕:深入解析Hadoop Common和HDFS架构设计与实现原理 》的源代码

    3. **文件操作**:如打开、关闭、读取和写入文件的API实现,涉及的类如DFSClient、DFSOutputStream和DFSInputStream。 4. **故障恢复**:包括Heartbeat机制、BlockReport和 LeaseManager,这些都是DataNode向...

    hadoop-src源代码

    2. `DFSClient`:客户端类,用于与HDFS交互,包括文件读写操作。源码中包含了文件打开、创建、追加、读取、删除等核心方法。 3. `FSNamesystem`:HDFS的元数据管理系统,管理命名空间和文件块映射。源码展示了如何...

    CDH集群常用组件关键参数及修改建议.docx

    CDH集群的优化是一个涉及多方面、多层次的过程,包括HDFS和YARN在内的各个组件都需要精细化调整。通过上述参数的合理设置,可以有效提高集群的资源利用率,降低延迟,提升整体性能,并确保数据安全。然而,任何调整...

    Impala安装,亲测

    Impala 是一个新的实时大数据处理框架,它能够高速处理大规模数据,并提供了实时查询和分析能力。在本文档中,我们将详细介绍 Impala 的安装过程,包括 MASTER 节点和 WORKER 节点的安装配置。 Impala 安装 在开始...

    Hadoop学习总结.doc

    - **分布式文件系统客户端(DFSClient)**:根据文件路径向Namenode发送请求,获取文件的数据块信息及其位置。 - **数据节点选择**:根据Namenode返回的信息选择最佳的数据节点进行读取。 - **数据读取**:客户端从...

    Hadoop面试100题.pdf

    18. **Mapreduce的inputsplit就是一个block** - **知识点说明**:InputSplit并不是直接对应于HDFS的数据块。InputSplit是指由InputFormat类分割的数据集的一部分,它可以对应于一个或多个HDFS数据块。 19. **...

    hadoop源码.zip

    4. `DFSClient`:客户端与HDFS交互的主要接口,负责文件的读写操作。通过源码,我们可以看到如何构建RPC请求,以及如何处理来自NameNode和DataNode的响应。 五、源码学习的重要性 阅读Hadoop HDFS的源码能够帮助...

    linux实验与习题

    Samba是一个开源软件,它实现了Microsoft的SMB/CIFS(Server Message Block/Common Internet File System)协议,使得Linux/Unix系统可以无缝地与Windows网络共享资源。Samba提供了一个跨平台的文件和打印机共享...

Global site tag (gtag.js) - Google Analytics