HDFSDATANODE数据传输详解

news2024/12/24 21:38:35

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

独立站原文

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

鸿蒙Harmony应用开发—ArkTS声明式开发(容器组件:SideBarContainer)

提供侧边栏可以显示和隐藏的侧边栏容器,通过子组件定义侧边栏和内容区,第一个子组件表示侧边栏,第二个子组件表示内容区。 说明: 该组件从API Version 8开始支持。后续版本如有新增内容,则采用上角标单独标记该内容的起…

鸿蒙Harmony应用开发—ArkTS声明式开发(基础手势:TextTimer)

通过文本显示计时信息并控制其计时器状态的组件。 说明: 该组件从API Version 8开始支持。后续版本如有新增内容,则采用上角标单独标记该内容的起始版本。 子组件 无 接口 TextTimer(options?: TextTimerOptions) 参数: 参数名参数类型…

数据仓库数据分层详解

数据仓库中的数据分层是一种重要的数据组织方式,其目的是为了在管理数据时能够对数据有一个更加清晰的掌控。以下是数据仓库中的数据分层详解: 原始数据层(Raw Data Layer):这是数仓中最底层的层级,用于存…

【老旧小区用电安全谁能管?】安科瑞智慧用电安全管理系统解决方案

行业背景 电气火灾指由电气故障引发的火灾。每年以30%的比例高居各类火灾原因之首。以50%到80%的比例高居重特大火灾之首。已成为业界重点关注的对象并为此进行着孜孜不倦的努力。 国务院安委会也于2017年5月至2020年4月年开展了为期3年的电气火灾综合治理工作。在各界努力的…

主干网络篇 | YOLOv8更换主干网络之ShuffleNetV2

前言:Hello大家好,我是小哥谈。ShuffleNetV2是一种轻量级的神经网络架构,用于图像分类和目标检测任务。它是ShuffleNet的改进版本,旨在提高模型的性能和效率。ShuffleNetV2相比于之前的版本,在保持模型轻量化的同时&am…

LeetCode刷题小记 八、【回溯算法】

1.回溯算法 文章目录 1.回溯算法写在前面1.1回溯算法基本知识1.2组合问题1.3组合问题的剪枝操作1.4组合总和III1.5电话号码的字母组合1.6组合总和1.7组合总和II1.8分割回文串1.9复原IP地址1.10子集问题1.11子集II1.12非递减子序列1.13全排列1.14全排列II1.15N皇后1.16解数独 写…

WanAndroid(鸿蒙版)开发的第三篇

前言 DevEco Studio版本:4.0.0.600 WanAndroid的API链接:玩Android 开放API-玩Android - wanandroid.com 其他篇文章参考: 1、WanAndroid(鸿蒙版)开发的第一篇 2、WanAndroid(鸿蒙版)开发的第二篇 3、WanAndroid(鸿蒙版)开发的第三篇 …

三级等保技术建议书

1信息系统详细设计方案 1.1安全建设需求分析 1.1.1网络结构安全 1.1.2边界安全风险与需求分析 1.1.3运维风险需求分析 1.1.4关键服务器管理风险分析 1.1.5关键服务器用户操作管理风险分析 1.1.6数据库敏感数据运维风险分析 1.1.7“人机”运维操作行为风险综合分析 1.2…

EPICS和Arduino Uno之间基于串行文本协议的控制开发

Arduino Uno的串口服务程序设置如文本的串口通信协议设计以及在Arduino上的应用-CSDN博客中所示。通过在串口上发送约定的文本协议,它实现的功能如下: 实现功能: 读取三路0.0V~5.0V模拟量输入,读取端口A0~A2设置三路0.0V~5.0V的模…

Github 2024-03-16 开源项目日报Top10

根据Github Trendings的统计,今日(2024-03-16统计)共有10个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量Python项目5非开发语言项目2TypeScript项目1C++项目1Lua项目1Swift项目1《Hello 算法》:动画图解、一键运行的数据结构与算法教程 创建周期:4…

spring boot3登录开发-微信小程序用户登录设计与实现

⛰️个人主页: 蒾酒 🔥系列专栏:《spring boot实战》 🌊山高路远,行路漫漫,终有归途 目录 写在前面 登录流程 流程解析 具体实现 相关代码 说明 服务端 小程序端 写在最后 写在前面 本文介绍了springb…

BigDL-LLM 安装指南——在iGPU集成显卡下使用BigDL-LLM大模型库加速LLM

文章目录 iGPU是什么?一、环境准备1.1 Visual Studio 2022 Community 安装1.2 安装或更新最新版本的GPU驱动程序1.3 安装英特尔oneAPI工具包2024.0版本1.4 安装Anaconda 二、BigDL -LLM 安装2.1 创建虚拟环境2.2 激活虚拟环境2.3 安装bigdl-llm[xpu] 三、运行环境配…

Etcd 介绍与使用(入门篇)

etcd 介绍 etcd 简介 etc (基于 Go 语言实现,)在 Linux 系统中是配置文件目录名;etcd 就是配置服务; etcd 诞生于 CoreOS 公司,最初用于解决集群管理系统中 os 升级时的分布式并发控制、配置文件的存储与分…

哔哩哔哩后端Java一面

前言 作者:晓宜 个人简介:互联网大厂Java准入职,阿里云专家博主,csdn后端优质创作者,算法爱好者 最近各大公司的春招和实习招聘都开始了,这里分享下去年面试B站的的一些问题,希望对大家有所帮助…

PLC_博图系列☞基本指令“RESET_BF”复位位域

PLC_博图系列☞基本指令“RESET_BF”复位位域 文章目录 PLC_博图系列☞基本指令“RESET_BF”复位位域背景介绍RESET_BF:复位位域说明类型为 PLC 数据类型、STRUCT 或 ARRAY 的位域参数示例 关键字: PLC、 西门子、 博图、 Siemens 、 RESET_BF 背景…

java 开发工具

新建项目 打开idea选择 New Project 新建一个项目 左边选择 Java项目,右边选择Java版本 接着next 修改项目名称和保存路径,然后点击下面的 Finish 最终页面; 在 src 目录右键,新建一个包 在 src 目录右键,新建java 文件 有时候会需…

Git全套教程一套精通git.跟学黑马笔记

Git全套教程一套精通git.跟学黑马笔记 文章目录 Git全套教程一套精通git.跟学黑马笔记1.版本管理工具概念2. 版本管理工具介绍2.1版本管理发展简史(维基百科)2.1.1 SVN(SubVersion)2.1.2 Git 3. Git 发展简史4. Git 的安装4.1 git 的下载4.2 安装4.3 基本配置4.4 为常用指令配置…

智能工具柜-RFID智能工具柜管理系统

RFID工具柜管理系统是一种便捷化的工具管理系统,它采用RFID技术实现信息化,可以大大提高工具管理的效率和准确性。 日常的工具管理也确实存在一定的管理问题,如工具管理效率低、管理不准确等。因此,采用RFID技术实现信息化已经成…

【深度学习】深度估计,Depth Anything Unleashing the Power of Large-Scale Unlabeled Data

论文标题:Depth Anything Unleashing the Power of Large-Scale Unlabeled Data 论文地址:https://arxiv.org/pdf/2401.10891.pdf 项目主页:https://depth-anything.github.io/ 演示地址:https://huggingface.co/spaces/LiheYoung…

【Elasticsearch】windows安装elasticsearch教程及遇到的坑

一、安装参考 1、安装参考:ES的安装使用(windows版) elasticsearch的下载地址:https://www.elastic.co/cn/downloads/elasticsearch ik分词器的下载地址:https://github.com/medcl/elasticsearch-analysis-ik/releases kibana可视化工具下载…