HDFSDATANODE数据传输详解

news/发布时间2024/5/17 17:57:18

本文主要阐述datanode中一个socket连接接收字节流的构成,帮助datanode的接收与处理数据。注意hadoop版本为3.1.1。

写在前面

Datanode本质上也是TCPServer,一般的TCPServer接到客户端请求以后会分配一个线程处理,对于Datanode而言,这个线程可以叫做Op处理连接。每个OP连接会多次和客户端交互,中间涉及多种packet。

关于proto writeDelimitedTo方法

在整个处理流程中,会非常频繁的使用的到proto.writeDelimitedTo来传递相关proto,简单理解就是要写入proto时,写入总长度,再写入proto。读取proto时,先读取长度,在解析proto。

DataNode连接数据流说明

OpPacket的接收

Op连接第一个包总是来定义Op连接处理那种Op,例如读块op,写块op。这种包简单命名为OpPacket。Packet的结构如下,可以根据下图读取OpPacket。

1851_1.png

DataTransferProtocol.DATA_TRANSFER_VERSION:short,3.1.1版本默认为28。

OpCode:

1851_2.png

OpProto:定义Op是哪种Op。Op在datatransfer.proto定义,包含OpReadBlockProto,OpWriteBlockProto,OpTransferBlockProto,OpReplaceBlockProto,OpCopyBlockProto,OpBlockChecksumProto,OpRequestShortCircuitAccessProto,ReleaseShortCircuitAccessRequestProto。

接下来的是否回应或者直接发数据,都要根据不同的op来处理,后续介绍了write和read。

WriteBlock

当接收完OpPacket以后,需要写入一个BlockOpResponseProto应答。

1851_3.png

当客户端接受BlockOpResponseProto应答后,就会发送数据包,数据包的格式如下

1851_4.png

PktLen:数据包长度,不同于字面意思,这个数值并不是包的总长度,而是4(pktLen所占字节数)+chunkchecksums字节数+chunkdatas字节数。
HeadLen:short,PacketHeaderProto的长度。不同于writeDelimitedTo,这边使用的proto.getSerializedSize。
PktHeadProto:PacketHeaderProto.writeTo。
Chunkchecksums:chunk校验数据。
ChunkData:实际数据。
DataNode接受到数据以后,完成checksum后就把Status.success放入Responder的处理队列。Responder最终会返回PipelineAckProto(PipelineAckProto.writeDelimitedTo)给客户端。

ReadBlock

当接收完OpPacket以后,需要写入一个BlockOpResponseProto应答。

1851_5.png

写完应答以后,立马会发送Block的数据包,数据包的结果如下:

1851_6.png

PktLen:数据包长度,不同于字面意思,这个数值并不是包的总长度,而是4(pktLen所占字节数)+chunkchecksums字节数+chunkdatas字节数。
HeadLen:short,PacketHeaderProto的长度。不同于writeDelimitedTo,这边使用的proto.getSerializedSize。
PktHeadProto:PacketHeaderProto.writeTo。
Chunkchecksums:chunk校验数据。
ChunkData:实际数据。
数据会被分成多个数据包发送,发送完最后一个数据包以后,会发送一个空包(没有数据只有header),空包的PacketHeaderProto会有LastPackctInBlock的标记。空包发送完成后,会接受一个ClientReadStatusProto的包(客户端使用ClientReadStatusProto.writeDelimitedTo写入)。

TransferBlock、ReplaceBlock未分析。

数据流中的sasl

Hadoop使用dfs.data.transfer.protection参数来保证数据流的安全。dfs.data.transfer.protection有三种模式authentication,integrity,privacy,分别对于sasl qop中的auth,auth-int,auth-conf。Auth:流建立需要握手,握手成功以后,后续流就是正常使用。
Auth-int:流握手+后续流都需要通过sasl的wrap unwarp加密解密。
Auth-conf:流握手+后续流都需要通过协商的算法来数据加密解密。

Sasl握手:
Sasl的mech为DIGEST-MD5,serviceName为0,protocol(c中的username)为hdfs。通过此信息可以创建saslclient,saslserver。DIGEST-MD5的callback的本质上就是验证用户名密码。数据流的用户密码来源与blocktoken。
关于sasl中协商的包结构为DataTransferEncryptorMessageProto,写入使用writeDelimitedTo。

message DataTransferEncryptorMessageProto {enum DataTransferEncryptorStatus {SUCCESS = 0;ERROR_UNKNOWN_KEY = 1;ERROR = 2;}required DataTransferEncryptorStatus status = 1;optional bytes payload = 2;optional string message = 3;repeated CipherOptionProto cipherOption = 4;
}

Payload就是token,message只有status为error才使用,为errmsg。Server发生异常都会发送错误,并关闭这个流。

流程图:

1851_7.png

  1. client发送sasl_Version,为4byte

SASL_TRANSFER_MAGIC_NUMBER = 0xDEADBEEF;server接收并验证。

  1. client发送第一个saslMessage,Status为success,payload为byte[0]。

  2. Server就收到包以后使用saslserver.evaluateResponse(c中为gsasl_setup)来处理payload。

Server发送应答saslMessage,Status为success,payload为算出来的token。

  1. client接收到包以后,使用saslclient.evaluateChallenge(c中为gsasl_setup)来出来payload。

client发送第二个saslMessage,Status为success,payload为算出来的token。

  1. Server就收到包以后使用saslserver.evaluateResponse(c中为gsasl_setup)来处理payload。

这时候如果payload没问题,saslserver会complete。Server发送应答saslMessage,Status为success,payload为算出来的token。

  1. client接收到包以后,使用saslclient.evaluateChallenge(c中为gsasl_setup)来出来payload。

这时候如果payload没问题,saslclient会complete。

独立站原文

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.ulsteruni.cn/article/58612517.html

如若内容造成侵权/违法违规/事实不符,请联系编程大学网进行投诉反馈email:xxxxxxxx@qq.com,一经查实,立即删除!

相关文章

读算法的陷阱:超级平台、算法垄断与场景欺骗笔记12_移动平台(上)

读算法的陷阱:超级平台、算法垄断与场景欺骗笔记12_移动平台(上)1. 广告 1.1. 广告收入的来源 1.1.1. 向客户推荐广告投放网址 1.1.2. 提供有效提高产品广告点击率的咨询服务 1.1.3. 从合作伙伴的广告收入中捞上一笔 1.2. 对于广告主来讲,他们无意于与各家网站逐一谈判 1.2…

思元370芯片系列芯片概述

思元370芯片系列芯片概述基于7nm制程工艺,思元370是寒武纪首款采用chiplet(芯粒)技术的AI芯片,集成了390亿个晶体管,最大算力高达256TOPS(INT8),是寒武纪第二代产品思元270算力的2倍。凭借寒武纪最新智能芯片架构MLUarch03,思元370实测性能表现更为优秀。思元370也是国内…

毕设进度3.14

为后端和前端添加参数校验 明日计划找找之前功能的漏洞

baremetal bsp工程管理

参考学习:https://www.bilibili.com/video/BV1yE411h7uQ?p=20&vd_source=432ba293ecfc949a4174ab91ccc526d6便于bsp工程管理,将工程进行分类管理,如下图Makefile编译脚本文件 bsp文件夹存所写的bsp驱动 imx6ul文件夹存放imx6ull官方sdk文件 imx6ul.lds是链接脚本 obj文…

【Python使用】python高级进阶知识md总结第4篇:静态Web服务器-命令行启动动态绑定端口号,html 的介绍【附代码文档】

python高级进阶全知识知识笔记总结完整教程(附代码资料)主要内容讲述:操作系统,虚拟机软件,Ubuntu操作系统,Linux内核及发行版,查看目录命令,切换目录命令,绝对路径和相对路径,创建、删除文件及目录命令,复制、移动文件及目录命令,终端命令格式的组成,查看命令帮助…