0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

一文解析HDFS架构及读取写入数据流程

姚小熊27 来源:51cto 作者:51cto 2021-01-28 14:04 次阅读

Hadoop到目前为止发展已经有10余年,版本经过无数次的更新迭代,目前业内大家把Hadoop大的版本分为Hadoop1.0、Hadoop2.0、Hadoop3.0 三个版本。

一、Hadoop 简介

Hadoop版本刚出来的时候是为了解决两个问题:一是海量数据如何存储的问题,一个是海量数据如何计算的问题。Hadoop的核心设计就是HDFS和 Mapreduce.HDFS解决了海量数据如何存储的问题, Mapreduce解决了海量数据如何计算的问题。HDFS的全称:Hadoop Distributed File System。

二、分布式文件系统

图片 HDFS其实就可以理解为一个分布式文件系统,可以看如图1所示有4个服务器是不是都有他自己的文件系统都可以进行存储数据,假设每个服务器的存储空间存储10G的数据。假设数据量很小的时候存储10G的数据还是ok的当数据量大于服务器的存储空间时是不是单个服务器就没法存储了。 我们是不是可以在服务器中部署一个Hadoop这样就能构建出一个集群(超级大电脑)。这样就存储 4*10=40G的数据量,这样我们面向用户时是不是只有一台超级大的电脑相当于一个分布式文件系统。

HDFS是一个主从的架构、主节点只有一个NemeNode。从节点有多个DataNode。

三、HDFS 架构

图片 假设我们这里有5台服务器每台服务器都部署上Hadoop,我们随便选择一台服务器部署上NameNode剩下服务器部署上DataNode。

客户端上传文件时假设文件大小为129MHDFS默认切分的大小为128M这时就会产生出2个blkNameNode去通知DataNode上传文件(这里有一定的策略),我们就假设就将这几个文件分别存储在4个服务器上。为什们要进行分别存储在,假设DataNode服务器有一天突然挂掉了我们是不是还可通过DataNode4或2和3进行读取数据,这样是不是就防止数据丢失。

NameNode

管理元数据信息(文件目录树):文件与Block块,Block块与DataNode主机关系 NameNode为快速响应用户操作,所以把元数据信息加载到内存里

DataNode

存储数据,把上传的数据划分固定大小文件块(Block)在Hadoop2.73之前是64M之后改为了128M 为了保证数据安全,每个文件默认都是三个副本

SecondaryNamenode

周期性的到NameNode节点拉取Edtis和fsimage文件,将这两个文件加入到内存进行 然后将这两个文件加入到内存中进行合并产生新的fsimage发送给NameNode。

四、HDFS写入数据流程

客户端会带着文件路径向NameNode发送写入请求通过 RPC 与 NameNode 建立通讯, NameNode 检查目标文件,返回是否可以上传; Client 请求第一个 block 该传输到哪些 DataNode 服务器上; NameNode 根据副本数量和副本放置策略进行节点分配,返回DataNode节点,如:A,B,C Client 请求A节点建立pipeline管道,A收到请求会继续调用B,然后B调用C,将整个pipeline管道建立完成后,逐级返回消息到Client; Client收到A返回的消息之后开始往A上传第一个block块,block块被切分成64K的packet包不断的在pepiline管道里传递,从A到B,B到C进行复制存储 当一个 block块 传输完成之后,Client 再次请求 NameNode 上传第二个block块的存储节点,不断往复存储 当所有block块传输完成之后,Client调用FSDataOutputSteam的close方法关闭输出流,最后调用FileSystem的complete方法告知NameNode数据写入成功

五、HDFS读取数据流程

客户端会先带着读取路径向NameNode发送读取请求,通过 RPC 与 NameNode 建立通讯,NameNode检查目标文件,来确定请求文件 block块的位置信息 NameNode会视情况返回文件的部分或者全部block块列表,对于每个block块,NameNode 都会返回含有该 block副本的 DataNode 地址 这些返回的 DataNode 地址,会按照集群拓扑结构得出 DataNode 与客户端的距离,然后进行排序,排序两个规则:网络拓扑结构中距离 Client 近的排靠前;心跳机制中超时汇报的 DN 状态为 STALE,这样的排靠后; Client 选取排序靠前的 DataNode 调用FSDataInputSteam的read方法来读取 block块数据,如果客户端本身就是DataNode,那么将从本地直接获取block块数据 当读完一批的 block块后,若文件读取还没有结束,客户端会继续向NameNode 获取下一批的 block 列表,继续读取 所有block块读取完成后,Client调用FSDataInputStream.close()方法,关闭输入流,并将读取来所有的 block块合并成一个完整的最终文件

六、HDFS缺陷

注意:早期版本

单点问题 内存受限

总结

上述给大家讲解了简单的HDFS架构,我在最后面留了一个小问题,我会在下期通过画图的方式给大家讲解,我在这里为大家提供大数据的资料需要的朋友可以去下面GitHub去下载,信自己,努力和汗水总会能得到回报的。
责任编辑:YYX

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 数据
    +关注

    关注

    8

    文章

    7067

    浏览量

    89129
  • 存储
    +关注

    关注

    13

    文章

    4320

    浏览量

    85912
  • HDFS
    +关注

    关注

    1

    文章

    30

    浏览量

    9615
收藏 人收藏

    评论

    相关推荐

    芯片封测架构和芯片封测流程

    在此输入导芯片封测芯片封测是个复杂且精细的过程,它涉及多个步骤和环节,以确保芯片的质量和性能。本文对芯片封测架构和芯片封测流程进行概述。     1 芯片封测 芯片封测,即芯片封装测试,是芯片制造
    的头像 发表于 12-31 09:15 231次阅读
    芯片封测<b class='flag-5'>架构</b>和芯片封测<b class='flag-5'>流程</b>

    使用STM32的spi与AFE4400通信,每写入读取数据都需要等待几百微秒后才能继续操作否则读取数据都是0,为什么?

    使用STM32的spi与AFE4400通信,每写入读取数据都需要等待几百微秒后才能继续操作,否则读取
    发表于 12-13 06:13

    使用ads1219这款模数转换器,读写流程和使用single-shot模式和continuous的区别是什么?

    ,如果我是使用continuous模式,是不是我开始只要把配置好的数据和START/SYNC写进去,就可以开始continuous转换了? 针对我这个读取单端两路模拟信号,我设计的I2C写读的
    发表于 12-10 06:12

    请问TLV320AIC3254EVM-K怎么读取音频数据流

    您好,我在学习TLV320AIC3254EVM-K开发板的过程中碰到个这样的问题,TI提供的软件是否具备读取I2S的音频数据流的功能,或者是否有PC机软件可以读取音频
    发表于 10-31 06:14

    日志数据流

    日志数据流图 日志系统数据流图 系统进行日志收集的过程可以分为三个环节: (1)日志收集和导入ElasticSearch (2)ElasticSearch进行索引等处理 (3)可视化操作,查询等
    的头像 发表于 08-21 15:00 321次阅读
    统<b class='flag-5'>一</b>日志<b class='flag-5'>数据流</b>图

    自动售货机MDB协议中文解析(六)MDB-RS232控制硬币器的流程解析

    自动售货机MDB协议中文解析(六)MDB-RS232控制硬币器的流程解析
    的头像 发表于 08-19 15:53 679次阅读
    自动售货机MDB协议中文<b class='flag-5'>解析</b>(六)MDB-RS232控制硬币器的<b class='flag-5'>流程</b>和<b class='flag-5'>解析</b>

    ESP32可以直接写入RX的高低电平,和直接读取TX的高低电平吗?

    如果串口的rx和tx的高低电平都是通过代码得到的状态,想把这个高低电平的变化解析成串口数据流,在不占用IO的情况下能否解析数据? 也就是在includesocuart_struct
    发表于 06-07 08:20

    请问如何从APPL_InputMapping和APPL_OutputMapping读取数据

    我有个简介,如下所示、 我可以读取写入 0x6000 和 0X7000 的数据,但无法读取
    发表于 05-21 08:19

    STM32F030 FLASH存储,第二次或者多次写入或者擦除的时候读取不到数据是为什么?

    最新在用STM32F030 因为没有外部存储设备,现在用的是芯片的FLASH来当存储,现在遇到的问题是刷次程序后,第读取可以读取到,当第二次或者多次
    发表于 04-10 07:34

    解析DARM工艺流程

    DRAM(动态随机存取存储器)的工艺流程包括多个关键步骤。
    发表于 04-05 04:50 5539次阅读
    <b class='flag-5'>一</b><b class='flag-5'>文</b><b class='flag-5'>解析</b>DARM工艺<b class='flag-5'>流程</b>

    交换芯片架构设计

    交换芯片的架构设计是网络设备性能和功能的关键。个高效的交换芯片架构能够处理大量的数据流量,支持高速数据传输,并提供先进的网络功能。
    的头像 发表于 03-21 16:28 555次阅读

    空指针区域写入数据会hardfault,为什么测试时读取却不会hardfault?

    空指针区域写入数据会hardfault,这个大家都知道, 但是测试时发现读取时却不会,这是为什么?有人知道吗?
    发表于 03-14 08:20

    PLC从HTTP服务端获取JSON文件,解析数据到寄存器

    文件提交给HTTP的服务端; 服务端有返回的JSON,或者GET命令获取到的JSON,网关进行解析后将数据写入到PLC寄存器。 本文主要描述通过GET命令获取数据
    发表于 01-24 09:47

    MB96F346RSBPMC如何向闪存读取/写入数据

    对于 MB96F346RSBPMC,我不知道如何向闪存读取/写入数据。 有人可以指定用于读/写编程的编程引脚和接口吗?
    发表于 01-19 06:27

    怎么简单实现由Labview读取的串口数据自增写入mysql5.7数据库中?

    怎么简单实现由Labview读取的串口数据自增写入mysql5.7数据库中? 已实现:串口数据的接收处理 mysql5.7的安装(已测试
    发表于 01-11 22:05