HDFSDATANODE数据传输详解

本文主要阐述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。

,Status为success,payload为算出来的token。

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

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

独立站原文

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

npm、nodejs和vue之间关系和区别介绍

本文讲解npm、Node.js和Vue.js这三者之间的关系和区别,以及它们各自的特点。 首先,让我们来了解一下Node.js。 **Node.js** 是一个开源的服务器端运行环境,它允许开发者使用JavaScript来编写服务器端的代码。在传统的Web开发中&#…

[ROS 系列学习教程] rosbag Python API

ROS 系列学习教程(总目录) 本文目录 1. 构造函数与关闭文件2. 属性值3. 写bag文件内容4. 读bag文件内容5. 将bag文件缓存写入磁盘6. 重建 bag 文件索引7. 获取bag文件的压缩信息8. 获取bag文件的消息数量9. 获取bag文件记录的起止时间10. 获取话题信息与消息类型 rosbag 的 Pyt…

【Java探索之旅】运算符解密 位运算,移位运算

🎥 屿小夏 : 个人主页 🔥个人专栏 : Java入门到精通 🌄 莫道桑榆晚,为霞尚满天! 文章目录 📑前言一、位运算符1.1 按位与 &1.2 按位或 |1.3 按位取反 ~1.4 按位异或^ 二、移位运…

快速排序算法,简洁,易懂

目录 代码实现(java): 一、首元素作为基准值 图: ​编辑 基本思路: 代码: 代码补充说明: 二、中间元素作为基准值 代码: 参考学习文章: 今天我们不刷力扣了,…

Java Web项目—餐饮管理系统Day07-套餐管理(二)

文章目录 1. 套餐的分页查询2. 更新套餐![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/209298cf3b4349c5a2fed56a3d33350e.png)第一步, 依据套餐id查询到套餐的基本信息以及关联菜品信息.第2步, 将请求数据进行保存(更新). 3. 批量的停售启售 这部分开发剩下的部分…

CSS Module

CSS Module的作用:将CSS样式作用域限制在特定的组件范围内,以避免全局样式污染和命名冲突。 Vue中如何实现样式模块…

SVN修改已提交版本的注释

目录 一、需求分析 二、问题分析 三、解决办法 一、需求分析 ​开发过程中,在SVN提交文件后,发现注释写的不完整或不够明确,想再修改之前的注释文字​。 使用环境: SVN服务器操作系统:Ubuntu 20.04.6 LTS SVN版本&…

物理隔离条件下,如何安全高效地进行内外网文件导入导出?

内外网文件导入导出通常指的是在内部网络(内网)和外部网络(外网)之间传输文件的过程。这在企业环境中尤其常见,因为内部网络通常包含敏感数据,而外部网络(如互联网)则允许更广泛的访…

计算机网络实验——学习记录

1. tun/tap模块:为Linux系统提供网络虚拟功能,tun位于网络OSI模型的三层(网络层),tap位于网络的二层(数据链路层)。 1.1 验证是否包含tun/tap模块:modinfo tun; 1.2 验…

8:00面试,8:06就出来了,问的问题有点变态。。。

从小厂出来,没想到在另一家公司又寄了。 到这家公司开始上班,加班是每天必不可少的,看在钱给的比较多的份上,就不太计较了。没想到9月一纸通知,所有人不准加班,加班费不仅没有了,薪资还要降40%…

echarts散点图自定义tooltip,鼠标放上去展示多行数据

先放效果图 如图,就是鼠标悬停在散点上(这里的散点我替换成了图片,具体做法参考这篇文章:echarts散点图的散点用自定义图片替代-CSDN博客)时,可以展示多行数据。之前查找资料的时候,很多用字符串…

封装哈希表

本文旨在讲解哈希表的封装,我们以哈希桶的结构来进行封装unorderedmap/set。要想实现封装哈希表,我们首先得先将哈希表的结构给搭建出来,然后再根据哈希桶的结构进一步封装unorderedmap/set! 下面我们先来实现哈希桶的结构&#x…

12_Linux内核结构

Linux内核结构 1.内核的主要组成部分 Linux 内核主要的 5 个部分:进程调度、内存管理、虚拟文件系统、网络接口、进程通信。在系统移植的时候,它们是内核的基本元素,这 5 个部分之间的关系,如图所示: 进程调度&#…

V-JEPA模型,非LLM另外的选择,AGI的未来:迈向Yann LeCun先进机器智能(AMI)愿景的下一步

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗?订阅我们的简报,深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同,从行业内部的深度分析和实用指南中受益。不要错过这个机会,成为AI领…

小怂爱水洼DFS

分析: 非常明显的搜索问题,当时我在写的时候遇到了两个问题,就一直没过。 1.忘记判断临界条件,x,t不能越界的问题; 2.最后有两个案例一直不能过,就是因为我用的int型的接受结果范围太小了&#…

前端学习从0到1第一天:初见html

阅读须知: 探索者安全团队技术文章仅供参考,未经授权请勿利用文章中的技术资料对任何计算机系统进行入侵操作,由于传播、利用本公众号所提供的技术和信息而造成的任何直接或者间接的后果及损失,均由使用者 本人负责,作者不为此承担任何责任,如…

【C++中日期类的实现】

一路,一路,一路从泥泞到风景............................................................................................... 目录 前言 一、【什么是日期类】 二、【代码实现】 1.【Date.h】部分: 2.【Date.cpp】部分:…

关于ffmpeg height not divisible by 2的错误

在我们线上视频生产过程中,我们用ffmpeg对视频做了resize,讲原有的分辨率resize到1280p,使用了参数 -vf "scale1280:-1",作用是将原始视频宽度缩放成1280,-1是指高度等比例缩放。 之前一直运行的好好的&…

储能技术发展

一、政策背景 “十三五”是我国储能产业化发展的起点。自“十四五”之后,各类储能支持政策更是以极快的速度不断更新完善。 2023年1月17日,工业和信息化部等六部门发布了《关于推动能源电子产业发展的指导意见》,其中明确提出要在2025年实现…

吴恩达prompt 笔记2:迭代提示开发(Iterative Prompt Develelopment)

1 前言 我们很难在初次尝试中就设计出最佳的提示,因此需要根据ChatGPT的反馈进行分析,分析输出具体在哪里不符合期望,然后不断思考和优化提示。如果有条件的话,最好是利用批量的样本来改善提示,这样可以对你的优化结…