`

HDFS Client如何从Datanode读取block

阅读更多
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
分享到:
评论

相关推荐

    第2讲_分布式文件系统HDFS.pdf

    DataNode是HDFS的Slave节点,负责存储Block和数据校验和执行客户端发送的读写操作。它与NameNode交互,获取Block列表信息,并执行客户端发送的读写操作。 Block Block是HDFS的最小存储单元。文件写入HDFS时,会被...

    Hadoop学习总结之一:HDFS简介

    数据流是指客户端(client)读取文件的过程。客户端用 FileSystem 的 open() 函数打开文件,然后向元数据节点请求文件的元数据信息。元数据节点返回文件的元数据信息,客户端则根据元数据信息读取数据块。

    大数据面试题,唬住50k.pdf

    client通过hdfs的api并发读取数据。 3. 关闭连接。 1. 举⼀个简单的例⼦说明mapreduce是怎么来运⾏的 ? wordcount的例⼦ 1. 1. ⽤mapreduce来实现下⾯需求? 现在有10个⽂件夹,每个⽂件夹都有1000000个url.现在让你...

    大数据面试题-.docx

    NameNode 负责管理 metadata,client 端每次读写请求,它都会从磁盘中读取或则会写入 metadata 信息并反馈 client 端。( ) 21. NameNode 本地磁盘保存了 Block 的位置信息。( ) 22. DataNode 通过长连接与 NameNode...

    大数据面试题.doc

    NameNode 负责管理 metadata,client 端每次读写请求,它都会从磁盘中读取或则会写入 metadata 信息并反馈 client 端。( ) 21. NameNode 本地磁盘保存了 Block 的位置信息。( ) 22. DataNode 通过长连接与 NameNode...

    大数据面试题(1).doc

    NameNode 负责管理 metadata,client 端每次读写请求,它都会从磁盘中读取或则会写入 metadata 信息并反馈 client 端。( ) 21. NameNode 本地磁盘保存了 Block 的位置信息。( ) 22. DataNode 通过长连接与 NameNode...

    大数据面试题.docx

    NameNode 负责管理 metadata,client 端每次读写请求,它都会从磁盘中读取或则会写入 metadata 信息并反馈 client 端。( ) 21. NameNode 本地磁盘保存了 Block 的位置信息。( ) 22. DataNode 通过长连接与 NameNode...

    大数据面试题(1).docx

    NameNode 负责管理 metadata,client 端每次读写请求,它都会从磁盘中读取或则会写入 metadata 信息并反馈 client 端。( ) 21. NameNode 本地磁盘保存了 Block 的位置信息。( ) 22. DataNode 通过长连接与 NameNode...

    大数据开发技术.pdf

    挑选一台 datanode(就近原则,然后随机)服务器,请求建立 socket 流 3.datanode 开始发送数据(从磁盘里面读取数据放入流, 以 packet 为单位来做校验)4.客户端以 packet 为单位接收,先在 本地缓存,然后写入...

    hadoop练习题--带答案-ec053bc6ad02de80d4d840e3.docx

    18. NameNode 负责管理 metadata,client 端每次读写请求,它都会从磁盘中读取或则会写入 metadata 信息并反馈 client 端。答案:否。 知识点:NameNode 负责管理 metadata,但它不会每次读写请求都从磁盘中读取或...

Global site tag (gtag.js) - Google Analytics