Datanode中包含DataXceiverServer。DataXceiverServer是一个socket server,负责接收client发起的socket连接。DataXceiverServer接收到一个socket连接后,启动一个线程DataXceiver,由DataXceiver具体负责该scoket的处理。DataXceiver从client读取client想要进行操作的操作码。如果操作码是OP_READ_BLOCK,则DataXceiver负责读取该block,并将其发送给client。
读取block数据传输格式
Client为了从Datanode读取block,按照一定的格式向Datanode发送指令及其他一些数据,具体的格式如下:
Ø operator:byte Client所需要的操作,读取一个block、写入一个block等等Ø version:short Client所需要的数据与Datanode所提供数据的版本是否一致
Ø blockId:long 所要读取block的blockId
Ø generationStamp:long 所需要读取block的generationStamp
Ø startOffset:long 读取block的的起始位置
Ø length:long 读取block的长度
Ø clientName:String Client的名字
Ø accessToken:Token Client提供的验证信息,用户名密码等
读取过程
DataXceiver首先按照上面的数据格式依次读取各变量。读取完成后,如果需要进行访问控制,则根据Client提供的accessToken进行验证。验证通过后,产生一个BlockSender实例blockSender,通过blockSender进行数据的读取与传输。这里有一个需要注意的地方,HDFS在保存文件的时候有几个非常重要的概念:一个文件由多个block构成。HDFS在进行block读写的时候是以packet为单位进行的。每一个packet由若干个chunk组成。Chunk是进行数据校验的基本单位,对每一个chunk生成一个校验和并将校验和进行存储(在默认情况下一个chunk的大小是512byte,生成的校验和是4byte)。在读取一个block的时候,数据传输的基本单位是packet,每个packet由若干个chunk组成。
为了读取一个block,首先从block的.meta文件中读取block的版本号、校验类型等,并生成相应的校验工具类。Meta文件的格式如下所示:
Ø version:short 所保存block的版本号
Ø checksumType:int 校验码的类型,要么没有校验码,要么是CRC32校验码(CHECKSUM_NULL、CHECKSUM_CRC32)
Ø bytesPerChecksum:int 表示这么校验和是由多少byte的源数据计算而来
Ø checksum:每一个chunk的校验和
这里有一个需要注意的地方,当读取数据的时候读取的起始位置必行是一个chunk的起始位置,如果client读取的起始位置不是chunk的起始位置,那么必须回退到chunk的起始位置开始读取。确定好位置后,Datanode以packet为单位依次发送block的数据,packet的具体格式如下图所示:
Ø packetLen:int packet的长度,包括数据、数据的校验等等
Ø offset:long packet在block中的偏移量
Ø sequenceNum:long 该packet在这次block读取时的序号
Ø isLastPacket:byte packet是否是最后一个
Ø dataLen:int 该packet所包含block数据的长度,纯数据不包括校验和其他
Ø checksum:该packet每一个chunk的校验和,有多少个chunk就有多少个校验和
Ø data:该packet所包含的block数据
本篇文章来源于 Linux公社网站(www.linuxidc.com) 原文链接:http://www.linuxidc.com/Linux/2012-10/73036.htm
分享到:
相关推荐
客户端首先创建一个新的SocketOutputStream,向DataNode发送读取Block的请求头,包括数据传输版本、操作类型、Block ID、生成戳、起始偏移量和读取长度等信息。接着,客户端创建SocketInputStream,并检查返回的消息...
HDFS架构主要由四个部分组成:HDFS Client、NameNode、DataNode和SecondaryNameNode。 HDFS Client: * 文件切分:文件上传到HDFS时,Client将文件切分成一个一个的Block,然后进行存储。 * 与NameNode交互:获取...
DataNode是HDFS的Slave节点,负责存储Block和数据校验和执行客户端发送的读写操作。它与NameNode交互,获取Block列表信息,并执行客户端发送的读写操作。 Block Block是HDFS的最小存储单元。文件写入HDFS时,会被...
当某个参与数据读取的DataNode出现故障时,HDFS会自动寻找其他拥有相同数据块副本的DataNode继续读取。这一机制基于HDFS的数据块多副本分散存储设计,确保即使某节点故障也不会导致数据丢失。 2. **读取到的数据...
在HDFS中,文件通常以块(Block)的形式存储在各个DataNode上,这些块是以明文形式存在的。任何人都可以通过操作系统直接访问Block所在的目录,并使用如`cat`命令查看文件内容,这对于敏感数据来说存在极大风险。 #...
文件的读取过程是指Client通过NameNode,获取文件的 Block信息,然后通过DataNode,读取文件数据。文件的写入过程是指Client通过NameNode,获取文件的 Block信息,然后将文件数据写入到DataNode中。 HDFS编程实践是...
2. 分布式文件系统:NameNode将文件分配到多个DataNode上,客户端可以从多个DataNode上读取文件。 3. 新的流失文件:客户端请求读取文件,DataNode返回文件的block信息。 4. 文件读写:客户端可以对文件进行读写操作...
在实际读取过程中,HDFS会优先选择地理位置上最近的DataNode进行数据读取,以此减少网络延迟,提高读取速度。同时,HDFS支持预读取机制,即在读取当前数据块的同时,客户端可以预先加载后续数据块的部分数据,进一步...
当读取文件时,NameNode根据Block的位置信息指导Client到相应的DataNode读取数据。 习题答案: 1. HDFS的架构设计主要采用主从结构,包括一个NameNode作为主节点,多个DataNode作为从节点,同时有...
HDFS的读取过程涉及三个主要组件:客户端(Client)、名称节点(NameNode)和数据节点(DataNode)。读取文件的步骤如下: 1. 客户端首先调用get方法获取HDFS文件系统的实例(FileSystem),然后通过该实例的open...
3. **客户端读取文件**:客户端直接从DataNode读取文件内容。 #### 数据冗余与可靠性 为了确保数据的安全性和可靠性,HDFS采用了数据块副本机制。每个数据块默认会有三个副本,分布如下: - 第一个副本位于...
* Client向DataNode上传一个Block,DataNode1向其他子节点冗余文件 2. HDFS读取文件的步骤 HDFS读取文件的步骤可以分为以下六步: * Client向NameNode请求下载某文件 * NameNode向Client返回文件的元数据 * ...
当`DFSClient`调用`NameNode.getBlockLocations`时,NameNode返回一个`LocatedBlocks`对象,包含了文件的所有块信息,包括每个块的`Block`对象,块在文件中的偏移量以及存储这些块的`DataNode`列表。 2. **NameNode...
- 大量随机读:HDFS更适合顺序读取,随机读取效率较低。 - 需要频繁修改文件:HDFS支持一次写入多次读取的模型,对于需要频繁修改的文件不是最佳选择。 #### 三、HDFS概念 **HDFS的关键概念包括**: - **NameNode...
- **Block传播:**DataNode01接收Block后,再将其传给DataNode02,DataNode02继续传给DataNode03。 - **完成Block上传:**当Block01完全传输到所有三个DataNode后,客户端再次请求NameNode上传第二个Block,重复上述...
Block Reader主要用于处理从DataNode读取数据块的过程。它通过与DataNode之间的网络连接发送读取数据块的请求,并根据DataNode返回的数据构建BlockReader对象。 - **构造Block Reader**:创建Block Reader时需要...
读操作时,客户端会向 NameNode 发送读取请求,NameNode 会将文件的元信息返回给客户端,然后客户端会根据元信息来访问对应的 DataNode。写操作时,客户端会将文件切分成多个 block,然后将 block 发送到 NameNode,...
文件“hdfs_design.pdf”很可能是HDFS设计的详细解读,涵盖了HDFS的架构、数据复制策略、故障恢复机制、NameNode和DataNode的角色以及客户端API等内容。这部分内容将帮助你深入理解HDFS的内部工作原理,如Block和...
- Client直接从DataNode读取数据。 4. NameNode本地磁盘确实保存了Block的位置信息,这是因为DataNode周期性地向NameNode报告Block信息。 5. DataNode通常通过长连接与NameNode保持通信,以便实时更新Block状态。...