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
分享到:
相关推荐
DataNode是HDFS的Slave节点,负责存储Block和数据校验和执行客户端发送的读写操作。它与NameNode交互,获取Block列表信息,并执行客户端发送的读写操作。 Block Block是HDFS的最小存储单元。文件写入HDFS时,会被...
数据流是指客户端(client)读取文件的过程。客户端用 FileSystem 的 open() 函数打开文件,然后向元数据节点请求文件的元数据信息。元数据节点返回文件的元数据信息,客户端则根据元数据信息读取数据块。
client通过hdfs的api并发读取数据。 3. 关闭连接。 1. 举⼀个简单的例⼦说明mapreduce是怎么来运⾏的 ? wordcount的例⼦ 1. 1. ⽤mapreduce来实现下⾯需求? 现在有10个⽂件夹,每个⽂件夹都有1000000个url.现在让你...
NameNode 负责管理 metadata,client 端每次读写请求,它都会从磁盘中读取或则会写入 metadata 信息并反馈 client 端。( ) 21. NameNode 本地磁盘保存了 Block 的位置信息。( ) 22. DataNode 通过长连接与 NameNode...
NameNode 负责管理 metadata,client 端每次读写请求,它都会从磁盘中读取或则会写入 metadata 信息并反馈 client 端。( ) 21. NameNode 本地磁盘保存了 Block 的位置信息。( ) 22. DataNode 通过长连接与 NameNode...
NameNode 负责管理 metadata,client 端每次读写请求,它都会从磁盘中读取或则会写入 metadata 信息并反馈 client 端。( ) 21. NameNode 本地磁盘保存了 Block 的位置信息。( ) 22. DataNode 通过长连接与 NameNode...
NameNode 负责管理 metadata,client 端每次读写请求,它都会从磁盘中读取或则会写入 metadata 信息并反馈 client 端。( ) 21. NameNode 本地磁盘保存了 Block 的位置信息。( ) 22. DataNode 通过长连接与 NameNode...
NameNode 负责管理 metadata,client 端每次读写请求,它都会从磁盘中读取或则会写入 metadata 信息并反馈 client 端。( ) 21. NameNode 本地磁盘保存了 Block 的位置信息。( ) 22. DataNode 通过长连接与 NameNode...
挑选一台 datanode(就近原则,然后随机)服务器,请求建立 socket 流 3.datanode 开始发送数据(从磁盘里面读取数据放入流, 以 packet 为单位来做校验)4.客户端以 packet 为单位接收,先在 本地缓存,然后写入...
18. NameNode 负责管理 metadata,client 端每次读写请求,它都会从磁盘中读取或则会写入 metadata 信息并反馈 client 端。答案:否。 知识点:NameNode 负责管理 metadata,但它不会每次读写请求都从磁盘中读取或...