HDFS上传下载

HDFS上传下载

1.HDFS文件块

HDFS中的文件在物理上是分块存储(block),块的大小可以通过配置参数 dfs.blocksize来规定,默认大小在hadoop2.x版本中是128M,老版本中是64M。

1.1.详解128M

文件块的大小有两处矛盾点:

块的容量设置的小

容量设置的小的话,块的数量就会变多,这会导致:

  1. 块的数量增多导致块的寻址变慢.

  2. 每一个块在NameNode的内存里都会存储一份元数据,块的数量增多会增加NameNode内存压力。

块的容量设置的大

容量设置的大的话,每一个块的传输时间就会变长,这会导致:

  1. 网络不稳定时,重传成本较大(块越大重传的就越多)。
  2. hdfs存储的数据是给mapreduce任务使用的,块的容量变大,map任务的加载时间就会变长,不利于map任务失败后的重试执行。

1.2.如何设置合适的块大小

最终经过经验和统计分析,得到两个数据:

  1. hdfs平均寻址时间为10ms。
  2. 寻址时间占传输时间1%时,效果最好。

所以传输时间为10ms*100=1s,也就是说block块的大小设置为磁盘一秒的读写量最好。

大部分磁盘的读写速度为100M/s左右,block大小默认为最接近100M/s的128M/s(要取2进制整数)。

也就是说如果你的磁盘是高I/O盘,比如读写速度在200M/s,那么你可以修改你的block块大小为256M,通过修改参数 dfs.blocksize实现。

2.HDFS上传文件

2.1.上传流程

简单说一下hdfs客户端是如何上传文件的。

举个栗子:现在需要通过客户端向HDFS上传一个文件,在HDFS的路径是**/log/audit_4_17.zip**,文件大小为200M

block块大小为128M,所以需要拆分成两个block上传:block1(128M),block2(72M)

副本数为3,文件**/log/audit_4_17.zip**会存储3份

Client NameNode DataNode1 DataNode2 DataNode3 1.请求上传/log/audit_4_17.zip 2.ack: 校验权限、允许上传 3.请求上传block1(128M) 4.返回适合上传的三个数据节点: DataNode1 2 3(地址) 5.请求建立上传通道 5.请求建立上传通道 5.请求建立上传通道 6.DataNode3允许上传 6.DataNode2允许上传 6.DataNode1允许上传 7.传输block1(128M) 并行同步block1(128M) 并行同步成功, 返回ack packet 并行同步block1(128M) 并行同步成功, 返回ack packet par [Client ->> DataNode1上传block1] [DataNode1 ->> DataNode2同步block1] [DataNode2 ->> DataNode3同步block1] 8.数据块已成功存储和复制 9.传输成功 Client NameNode DataNode1 DataNode2 DataNode3

1)客户端向namenode请求上传文件。

2)namenode检查目标文件是否已存在,父目录是否存在, 客户端是否有权限…, 检查通过返回允许上传。

3)客户端申请上传第一个 block。

4)namenode返回3个datanode节点的地址,分别为DataNode1、DataNode2、DataNode3。

5)客户端向DataNode1申请上传数据,DataNode1收到后申请会继续调用DataNode2,然后DataNode2调用DataNode3,将这个通信管道建立完成

6)DataNode1、DataNode2、DataNode3逐级应答客户端

7)客户端开始往dn1上传第一个block(先从磁盘读取数据放到一个本地内存缓存),以packet为单位,DataNode1收到一个packet就会传给DataNode2,DataNode2传给DataNode3;每个DataNode同步一个packet成功后,会返回一个ack packet,并放入ack queue

8)DataNode1向NameNode响应block1传输成功

8)当一个block传输完成之后,客户端再次请求namenode上传第二个block。(重复执行3-8步)

2.2.block和packet

block

文件存储在HDFS中时需要分块,这个块就是block,一般为128MB,它是HDFS的存储单元。

packet

向HDFS传输block时需要将block拆分成若干个packet包去传输,packet是client和DataNode1,众DataNode之间传输的数据单元,默认大小64KB。

拆分的目的是为了并行同步,DataNode1收到packet1后,可以立刻向DataNode2同步packet1

2.3.数据同步Pipline

回顾上传流程

当packet成功接收后,接收方返回确认消息至发送方,即:

  1. DataNode1接收并成功写入后,它会向下一个DataNode(例如DataNode2)发送数据。
  2. DataNode2在接收并成功写入后,会向DataNode1发送确认消息(一个ACK)。
  3. DataNode1在收到DataNode2的ACK后,会向客户端发送一个ACK。这意味着,只有当所有的DataNode都成功接收并写入packet,客户端才会收到含有所有确认信息的ACK。

为此HDFS在DataNode设计了两个线程,对于DataNode1而言:一个线程用于接收数据并写入本地,一个线程用于接收DataNode2返回的ack信息。这使得数据的传输和确认得以并发执行。

Ack Queue负责存储ack消息,是一个阻塞队列,存储的是packet。当pipeline中的所有datanode都表示已经收到的时候,ack quene才会把对应的packet包移除掉。

这个机制确保每个packet的传输都得以成功,而且传输失败后也能方便重传。

2.4.传输失败后的重传

如果在写的过程中某个datanode发生错误,会采取以下几步:

  1. pipeline被关闭掉;
  2. 为了防止防止丢包ack quene里的packet会同步到data quene里;
  3. 把产生错误的datanode上当前在写但未完成的block删掉;
  4. block剩下的部分被写到剩下的两个正常的datanode中;
  5. namenode找到另外的datanode去创建这个块的复制。当然,这些操作对客户端来说是无感知的。

2.5.机架感知

HDFS存储文件时,为了保证可靠性,会复制文件的block,存储到多个节点中,以保障可靠性。

HDFS是如何规划block应该落在哪个DataNode的呢。

举个栗子,现在有两个集,每个集群有两个机架,每个机架有2节点。现在有个block1需要存储,HDFS会把他安排在哪些节点呢?

低版本
集群1
机架1.1
节点1.1.1
第一个block1
节点1.1.2
blockx
机架1.2
节点1.2.1
第二个block1
节点1.2.2
第三个block1
集群2
...

第一个副本在client所处的节点上。如果客户端在集群外,随机选一个。

第二个副本和第一个副本位于不相同机架的随机节点上。

第三个副本和第二个副本位于相同机架,节点随机。

高版本
集群1
机架1.1
节点1.1.1
第一个block1
节点1.1.2
第二个block1
机架1.2
节点1.2.1
blocky
节点1.2.2
第三个block1
集群2
...

第一个副本在client所处的节点上。如果客户端在集群外,随机选一个。

第二个副本和第一个副本位于相同机架,随机节点。

第三个副本位于不同机架,随机节点。

3.HDFS读取数据流

假设要从HDFS读取文件,文件路径为/log/audit_4_17.zip,流程如下:

Client NameNode DataNode1 DataNode2 1.请求下载/log/audit_4_17.zip 2.查询元数据,返回datanode地址DataNode1 2 3 3.请求读取数据 4.传输packet1 ......千年之后...... 4.传输packetn 缓存、组装packet Client NameNode DataNode1 DataNode2

1)客户端向namenode请求下载文件,namenode通过查询元数据,找到文件块所在的datanode地址。
2)挑选一台datanode(就近原则,然后随机)服务器,请求读取数据。
3)datanode开始传输数据给客户端(从磁盘里面读取数据放入流,以packet为单位来做校验)。
4)客户端以packet为单位接收,先在本地缓存,然后写入目标文件。

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

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

相关文章

BGP边界网关路由实验(华为)

一,技术简介 BGP(边界网关路由协议)是一种自治系统(AS)间的协议,主要用于在不同的AS之间交换路由信息。AS是一个由一组网络设备和路由器组成的网络集合,这些设备可以在一个共同的管理域中协同工…

Netty-NioServerSocketChannel与NioSocketChannel

NioServerSocketChannel NioServerSocketChannel是netty服务端的channel。在ServerbootStrap的bind方法中,通过反射,实例化对象NioServerSocketChannel。   NioServerSocketChannel对象实例化的过程中。 AbstractChannel中实例化channel的id&#xff…

【QT进阶】Qt Web混合编程之QWebEngineView基本用法

往期回顾 【QT入门】Qt自定义控件与样式设计之自定义QTabWidget实现tab在左,文本水平的效果-CSDN博客【QT进阶】Qt Web混合编程之CEF、QCefView简单介绍-CSDN博客 【QT进阶】Qt Web混合编程之VS2019 CEF的编译与使用-CSDN博客 【QT进阶】Qt Web混合编程之QWebEngi…

通过Idea部署Tomcat服务器

1.在idea中创建项目 有maven构建工具就创建maven,没有就正常创建一个普通的java程序 创建普通java项目 2.添加框架 3.配置 Tomcat 注意:创建web项目后我们需要配置tomcat才能运行,下面我们来进行配置。 4.添加部署 回到服务器 5.完善配置 6…

EFK环境搭建(基于K8S环境部署)

目录 一.环境信息二.安装nfs供应商三.安装elasticsearch四.安装kibana组件五.安装fluentd 一.环境信息 1.服务器及k8s版本 IP地址主机名称角色版本192.168.40.180master1master节点1.27192.168.40.181node1node1节点1.27192.168.40.182node2node2节点1.27 2.部署组件版本 序…

Python 数据结构和算法实用指南(二)

原文:zh.annas-archive.org/md5/66ae3d5970b9b38c5ad770b42fec806d 译者:飞龙 协议:CC BY-NC-SA 4.0 第四章:列表和指针结构 我们已经在 Python 中讨论了列表,它们方便而强大。通常情况下,我们使用 Python…

近端安全互联样例使用指导

样例介绍 本样例基于rk3568开发板,通过封装openharmony安全子系统deviceauth组件提供的能力,实现了一组可用于设备间快速建立可信认证和连接的接口,通过预先定义关系网,在设备初始化阶段完成端端设备间的认证,构建安全…

ES源码四:网络通信层流程

听说ES网络层很难?今天来卷它😄 前言 ES网络层比较复杂,分为两个部分: 基于HTTP协议的REST服务端基于TCP实现的PRC框架 插件化设计的网络层模块(NetworkModule) 入口还是上一章的创建Node构造方法的地方…

目标检测应用场景—数据集【NO.31】布匹数据集目标检测数据集

写在前面:数据集对应应用场景,不同的应用场景有不同的检测难点以及对应改进方法,本系列整理汇总领域内的数据集,方便大家下载数据集,若无法下载可关注后私信领取。关注免费领取整理好的数据集资料!今天分享…

uniapp picker 多列选择器用法

uniapp picker 多列选择器联动筛选器交互处理方法, uniapp 多列选择器 mode"multiSelector" 数据及筛选联动交互处理, 通过接口获取数据,根据用户选择当前列选项设置子列数据,实现三级联动效果, 本示例中处…

【honggfuzz学习笔记】honggfuzz的基本特性

本文架构 1.动机2.honggfuzz的基本概念官网描述解读 3. honggfuzz的反馈驱动(Feedback-Driven)软件驱动反馈(software-based coverage-guided fuzzing)代码覆盖率代码覆盖率的计量单位 代码覆盖率的统计方式 硬件驱动反馈( hardware-based co…

IDEA 安装、基本使用、创建项目

文章目录 下载基本使用修改颜色主题Keymap插件 创建项目创建模块新建 Java 类运行新建 Package打包 Jar运行 jar 包 查看文档 下载 官方下载地址:https://www.jetbrains.com/zh-cn/idea/download/?sectionmac 这里我下载 macOS 社区版,IDEA 2024.1 (C…

60道计算机二级模拟试题选择题(含答案和解析)

点击下载《60道计算机二级模拟试题选择题(含答案和解析)》 1. 前言 本文设计了一份针对计算机二级考试的选择题,旨在考察考生对计算机基础知识和应用技能的掌握情况。试题涵盖了计算机基础知识、操作系统、办公软件、计算机网络等多个方面&…

【学习】Jmeter、postman、python如何与数据库相互配合

在当今数字化时代,数据库已经成为我们日常生活中不可或缺的一部分。无论是购物、社交还是工作,数据库都在默默地为我们提供着高效、稳定的服务。而在众多的技术工具中,Jmeter、Postman和Python成为了操作数据库的三大主流技术。今天&#xff…

虚拟机vm桥接模式linux(centos,ubuntu)联网

台式机网线 查看宿主机网络 编辑虚拟机—>虚拟网络编辑器–>更改设置 选择,确定 进入linux系统 输入ip addr找到自己的网卡 我的是eno16777736 centos: 编辑 HWADDR"00:0C:29:54:CE:B8" TYPE"Ethernet" BOOTPROTO"…

刷题。。。。。。

1.ezmd5 根据题目提示 我们知道应该是要上传两张md5值相同的图片 根据原文链接:cryptanalysis - Are there two known strings which have the same MD5 hash value? - Cryptography Stack Exchange 把保存下来的图片上传一下 得到flag 2.ezhttp 根据原文链接&…

LeetCode36: 有效的数独(Java)

题目: 请你判断一个 9 x 9 的数独是否有效。只需要 根据以下规则 ,验证已经填入的数字是否有效即可。 数字 1-9 在每一行只能出现一次。数字 1-9 在每一列只能出现一次。数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次。(请参考示例…

适配器模式【结构型模式C++】

1.概述 适配器模式是一种结构型设计模式, 又称为变压器模式、包装模式(Wrapper) 将一个类的接口变换成客户端所期待的另一种接口,从而使原本因接口不匹配而无法在一起工作的两个类能够在一起工作。 2.结构 Target:适配…

美创科技19周年数据安全案例展

2005-2024 践行“让数据更安全,更有价值”的使命 美创19年砌垒,与不同行业用户 一同筑牢数字之基 美创19周年案例展 走进这段时间长廊 探索美创与各行业伙伴的数据安全实践 #1 数据安全体系化建设 浙江省,数字化改革先行地。以数字化…

Java面试八股之fail-fast和fail-safe的区别

简述fail-fast和fail-safe的区别 定义与基本概念 fail-fast: 定义:fail-fast是一种迭代器机制,当集合在迭代过程中被结构上修改(如添加、删除元素),会立即抛出ConcurrentModificationException异常&…