【Hadoop】(一)分布式文件系统 HDFS

简介: 【Hadoop】(一)分布式文件系统 HDFS

文章目录


一、Hadoop简介

二、Hadoop的核心

三、Hadoop的特点


四、HDFS的架构

存储模型

NameNode(NN)

1.简介

2.NameNode的工作特点

3.NameNode主要功能

4.NameNode保存metadata信息包括

5.NameNode持久化

6.DataNode(DN)


SecondaryNameNode(SNN)


1.SNN执行合并时机

2.SNN执行流程图

3.过程介绍


Block的副本放置策略


五、HDFS的读写流程(重点)

==HDFS写流程==

==HDFS读流程==


六、hadoop2.x新特性

七、NameNode和SecondaryNameNode(详解)

八、DataNode(详解)


一、Hadoop简介


Hadoop被公认是一套行业大数据标准开源软件,在分布式环境下提供了海量数据的处理能力。几乎所有主流厂商都围绕Hadoop开发工具、开源软件、商业化工具和技术服务。今年大型IT公司,如EMC、Microsoft、Intel、Teradata、Cisco都明显增加了Hadoop方面的投入。


二、Hadoop的核心


1.HDFS: Hadoop Distributed File System 分布式存储系统

提供了高可靠性、高扩展性和高吞吐率的数据存储服务的分布式存储系统


2.YARN: Yet Another Resource Negotiator 资源管理调度系统

负责集群资源的管理和调度


3.Mapreduce:分布式运算框架(计算向数据移动)

具有易于编程、高容错性和高扩展性等优点。

三、Hadoop的特点


扩容能力(Scalable):能可靠地(reliably)存储和处理千兆字节(PB)数据。


成本低(Economical):可以通过普通机器组成的服务器群来分发以及处理数据。这些服务器群总计可达数千个节点。


高效率(Efficient):通过分发数据,hadoop可以在数据所在的节点上并行地(parallel)处理它们,这使得处理非常的快速。


可靠性(Reliable):hadoop能自动地维护数据的多份副本,并且在任务失败后能自动地重新部署(redeploy)计算任务。


四、HDFS的架构


20191207000351118.png


1.文件元数据 MetaData

文件数据 . 元数据 :数据本身


2.HDFS具有主从架构

(主)NameNode 节点保存文件元数据:单节点 posix

(从)DataNode 节点保存文件Block数据:多节点


3.结构模型关系介绍

DataNode与NameNode保持心跳,提交Block列表

HdfsClient与NameNode交互元数据信息

HdfsClient与DataNode交互文件Block数据


其中:


namenode负责:


接收用户操作请求


维护文件系统的目录结构


管理文件与block之间关系,block与datanode之间关系


持久化(fsimage,eidts log)不会持久化block的位置信息(不保存到镜像,关闭后即消失)


block:偏移量,因为block不可以调整大小,hdfs不支持修改文件 , 偏移量不会改变


datanode负责:


存储文件


文件被分成block块存储在磁盘上


为保证数据安全,文件会有多个副本


Secondary NameNode负责:


合并fsimage和edits文件来更新NameNode的metedata


存储模型


以后我们看到块要立即反应到偏移量、位置信息


20191207002851185.png

NameNode(NN)


基于内存存储 :不会和磁盘发生交换


1.简介


namenode 是整个文件系统的管理节点。他维护着整个文件系统的文件目录树,文件/目录的元信息和每个文件对应的数据块列表。接收用户的操作请求。


文件包括:


fsimage:元数据镜像文件。存储某一时段NameNode内存元数据信息。


edits:操作日志文件。


fstime:保存最近一次checkpoint的时间。


2.NameNode的工作特点


NameNode始终在内存中保存metedata,用于处理“读请求”,到有“写请求”到来时,NameNode首先会写editlog到磁盘,即向edits文件中写日志,成功返回后,才会修改内存,并且向客户端返回。


Hadoop会维护一个人fsimage文件,也就是NameNode中metedata的镜像,但是fsimage不会随时与NameNode内存中的metedata保持一致,而是每隔一段时间通过合并edits文件来更新内容。Secondary NameNode就是用来合并fsimage和edits文件来更新NameNode的metedata的。


3.NameNode主要功能


接受客户端的读写服务

收集DataNode汇报的Block列表信息


4.NameNode保存metadata信息包括


文件owership和permissions文件大小

时间(Block列表:Block偏移量),位置信息,Block每副本位置(由DataNode上报)


5.NameNode持久化


NameNode的metadate信息在启动后会加载到内存

metadata存储到磁盘文件名为” fsimage ”

Block的位置信息不会保存到fsimage

edits记录对metadata的操作日志


6.DataNode(DN)


本地磁盘目录存储数据(Block),文件形式 . 同时存储Block的元数据信息文件

启动DN时会向NN汇报block信息, 通过向NN发送心跳保持与其联系(3秒一次),

如果NN 10分钟没有收到DN的心跳,则认为其已经lost,并copy其上的block到其它DN


SecondaryNameNode(SNN)


它不是NN的备份(但可以做备份),它的主要工作是帮助NN合并edits log,减少NN启动时间。


1.SNN执行合并时机


根据配置文件设置的时间间隔fs.checkpoint.period 默认3600秒

根据配置文件设置edits log大小 fs.checkpoint.size 规定edits文件的最大值默认是64MB,一旦超过这个值则强制checkpoint,不管是否到达最大时间间隔。


2.SNN执行流程图


fsimage文件 : 其实是Hadoop文件系统元数据的一个永久性的检查点,

其中包含Hadoop文件系统中的所有目录和文件idnode的序列化信息;

edits文件 : 存放的是Hadoop文件系统的所有更新操作的路径,

文件系统客户端执行的写操作首先会被记录到edits文件中。


20191207004900550.png


3.过程介绍


1.在 PNN(Primary NameNode) 合并之前,会将 edits 和 fsimage 文件发送给 SNN,然后 PNN 创建一个新的 edits.new 文件继续记录 PNN 的操作。


2.PNN 将之前的 edits 和 fsimage 发送给 SNN 后,SNN 会将 fsimage 加载到内存,edits 也加载到内存根据 edits 中操作记录执行相应的指令,当 edits 的所有操作记录对应的指令执行完毕,会生成一个新的 fsimage.ckpt 快照。


3.将新生成的 fsimage.ckpt 再发送给 PNN ,这时 PNN 就拥有 edits.new 创建之前的快照记录,若 PNN 发生了宕机,可以根据 fsimage 和 edits.new 恢复到宕机前的状态


Block的副本放置策略


Rack :服务器机架


20191207173011950.png


这样选择很好地平衡了可靠性、读写性能


可靠性:Block分布在两个机架上

写带宽:写入管道的过程只需要跨越一个交换机

读带宽:可以从两个机架中任选一个读取


五、HDFS的读写流程(重点)


HDFS写流程


20191207011206873.png


1.客户端通过调用 DistributedFileSystem 的create方法,创建一个新的文件。


2.DistributedFileSystem 通过 RPC(远程过程调用)调用 NameNode,去创建一个没有blocks关联的新文件。创建前,NameNode 会做各种校验,比如文件是否存在,客户端有无权限去创建等。如果校验通过,NameNode 就会记录下新文件,否则就会抛出IO异常。


3.前两步结束后会返回 FSDataOutputStream 的对象,和读文件的时候相似,FSDataOutputStream 被封装成 DFSOutputStream,DFSOutputStream 负责处理namenode和datanode之间的通信。客户端开始写数据DFSOutputStream,DFSOutputStream会把数据切成一个个小packet(64k),然后排成队列 data queue。 使用管道 与 切割成packet的理由:并行存储,增加效率。


4.DataStreamer 会去处理接受 data queue,它先问询 NameNode 这个新的 block 最适合存储的在哪几个DataNode里,比如重复数是3,那么就找到3个最适合的 DataNode,把它们排成一个 pipeline。DataStreamer 把 packet 按队列输出到管道的第一个 DataNode 中,第一个 DataNode又把 packet 输出到第二个 DataNode 中,以此类推。


5.DFSOutputStream 还有一个队列叫 ack queue,也是由 packet 组成,等待DataNode的收到响应,当pipeline中的所有DataNode都表示已经收到的时候,这时akc queue才会把对应的packet包移除掉。


6.客户端完成写数据后,调用close方法关闭写入流。


7.DataStreamer 把剩余的包都刷到 pipeline 里,然后等待 ack 信息,收到最后一个 ack 后,通知 DataNode 把文件标示为已完成。


注意:如果数据节点(datanode)在写入的过程中失败,关闭管线(pipeline),确认队列中的任何包都会被添加回数据队列的前面,当前的数据块在已经写入的数据节点中被元数据节点赋予新的标示,则错误节点重启后能够察觉其数据块是过时的,会被删除。失败的数据节点从管线(pipeline)中移除,另外的数据块则写入pipeline中的另外两个数据节点。元数据节点则被通知此数据块是复制块数不足,将来会再创建第三份备份。


总结:这一方法不仅提供了很好的稳定性(数据块存储在两个机架中)并实现很好的负载均衡,包括写入带宽(写入操作只需要遍历一个交换机)、读取性能(可以从两个机架中选择读取)和集群中块的均匀分布(客户端只在本地机架上写入一个块)。


HDFS读流程


HDFS采用的是“一次写入多次读取”的文件访问模型。一个文件经过创建、写入和关闭之后就不需要改变。这一假设简化了数据一致性问题,并且使高吞吐量的数据访问成为可能。


20191207152247972.png


1.首先客户端调用FileSystem对象的open方法在HDFS中打开要读取的文件,其实获取的是一个DistributedFileSystem的实例。


2.DistributedFileSystem通过RPC(远程过程调用)来调用namenode,确定文件起始块的位置,即获得文件的第一批block的locations,同一block按照重复数会返回多个locations,这些locations按照hadoop拓扑结构排序,距离客户端近的排在前面。


3.前两步会返回一个支持文件定位的输入流 FSDataInputStream对象,该对象会被封装成 DFSInputStream对象(存储着文件起始几个块的datanode地址),DFSInputStream可以方便的管理datanode和namenode数据流。客户端调用read方法,DFSInputStream就会找出离客户端最近的datanode并连接datanode。


4.数据从datanode源源不断的流向客户端。


5.如果第一个block块的数据读完了,就会关闭指向第一个block块的datanode连接,接着读取下一个block块。这些操作对客户端来说是透明的,从客户端的角度来看只是读一个持续不断的流。


6.如果第一批block都读完了,DFSInputStream就会去namenode拿下一批blocks的location,然后继续读,如果所有的block块都读完,这时就会关闭掉所有的流。


注意:在读取的时候,如果client与datanode通信时遇到一个错误,那么它就会去尝试对这个块来说下一个最近的块。它也会记住那个故障节点的datanode,以保证不会再对之后的块进行徒劳无益的尝试。client也会确认datanode发来的数据的校验和。如果发现一个损坏的块,它就会在client试图从别的datanode中读取一个块的副本之前报告给namenode。


总结:这个设计的一个重点是,client直接联系datanode去检索数据,并被namenode指引到块中最好的datanode。因为数据流在此集群中是在所有datanode分散进行的。所以这种设计能使HDFS可扩展到最大的并发client数量。同时,namenode只不过提供块的位置请求(存储在内存中,十分高效),不是提供数据。否则如果客户端数量增长,namenode就会快速成为一个“瓶颈”。


六、hadoop2.x新特性


引入了NameNode Federation,解决了横向内存扩展


引入了Namenode HA,解决了namenode单点故障(SPOF: Single Point Of Failure)


引入了YARN,负责资源管理和调度


增加了ResourceManager HA解决了ResourceManager单点故障


七、NameNode和SecondaryNameNode(详解)


思考:NameNode中的元数据是存储在哪里的?


首先,我们做个假设,如果存储在NameNode节点的磁盘中,因为经常需要进行随机访问,还有响应客户请求,必然是效率过低。因此,元数据需要存放在内存中。但如果只存在内存中,一旦断电,元数据丢失,整个集群就无法工作了。因此产生在磁盘中备份元数据的FsImage。


这样又会带来新的问题,当在内存中的元数据更新时,如果同时更新FsImage,就会导致效率过低,但如果不更新,就会发生一致性问题,一旦NameNode节点断电,就会产生数据丢失。因此,引入Edits文件(只进行追加操作,效率很高)。每当元数据有更新或者添加元数据时,修改内存中的元数据并追加到Edits中。这样,一旦NameNode节点断电,可以通过FsImage和Edits的合并,合成元数据。


但是,如果长时间添加数据到Edits中,会导致该文件数据过大,效率降低,而且一旦断电,恢复元数据需要的时间过长。因此,需要定期进行FsImage和Edits的合并,如果这个操作由NameNode节点完成,又会效率过低。因此,引入一个新的节点SecondaryNamenode,专门用于FsImage和Edits的合并。


20191210184034792.png


第一阶段:NameNode启动

(1)第一次启动NameNode格式化后,创建Fsimage和Edits文件。如果不是第一次启动,直接加载编辑日志和镜像文件到内存。

(2)客户端对元数据进行增删改的请求。

(3)NameNode记录操作日志,更新滚动日志。

(4)NameNode在内存中对数据进行增删改。


第二阶段:Secondary NameNode工作

(1)Secondary NameNode询问NameNode是否需要CheckPoint。直接带回NameNode是否检查结果。

(2)Secondary NameNode请求执行CheckPoint。

(3)NameNode滚动正在写的Edits日志。

(4)将滚动前的编辑日志和镜像文件拷贝到Secondary NameNode。

(5)Secondary NameNode加载编辑日志和镜像文件到内存,并合并。

(6)生成新的镜像文件fsimage.chkpoint。

(7)拷贝fsimage.chkpoint到NameNode。

(8)NameNode将fsimage.chkpoint重新命名成fsimage。


八、DataNode(详解)


DataNode工作机制


20191210184302444.png

1)一个数据块在DataNode上以文件形式存储在磁盘上,包括两个文件,一个是数据本身,一个是元数据包括数据块的长度,块数据的校验和,以及时间戳。


2)DataNode启动后向NameNode注册,通过后,周期性(1小时)的向NameNode上报所有的块信息。


3)心跳是每3秒一次,心跳返回结果带有NameNode给该DataNode的命令如复制块数据到另一台机器,或删除某个数据块。如果超过10分钟没有收到某个DataNode的心跳,则认为该节点不可用。


4)集群运行中可以安全加入和退出一些机器。


相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
目录
相关文章
|
7天前
|
分布式计算 Hadoop 大数据
大数据技术与Python:结合Spark和Hadoop进行分布式计算
【4月更文挑战第12天】本文介绍了大数据技术及其4V特性,阐述了Hadoop和Spark在大数据处理中的作用。Hadoop提供分布式文件系统和MapReduce,Spark则为内存计算提供快速处理能力。通过Python结合Spark和Hadoop,可在分布式环境中进行数据处理和分析。文章详细讲解了如何配置Python环境、安装Spark和Hadoop,以及使用Python编写和提交代码到集群进行计算。掌握这些技能有助于应对大数据挑战。
|
5天前
|
分布式计算 Hadoop 测试技术
Hadoop【基础知识 05】【HDFS的JavaAPI】(集成及测试)
【4月更文挑战第5天】Hadoop【基础知识 05】【HDFS的JavaAPI】(集成及测试)
28 8
|
5天前
|
分布式计算 资源调度 Hadoop
Hadoop【基础知识 03+04】【Hadoop集群资源管理器yarn】(图片来源于网络)(hadoop fs + hadoop dfs + hdfs dfs 使用举例)
【4月更文挑战第5天】Hadoop【基础知识 03】【Hadoop集群资源管理器yarn】(图片来源于网络)Hadoop【基础知识 04】【HDFS常用shell命令】(hadoop fs + hadoop dfs + hdfs dfs 使用举例)
31 9
|
6天前
|
分布式计算 Hadoop Shell
Hadoop【基础知识 04】【HDFS常用shell命令】(hadoop fs + hadoop dfs + hdfs dfs 使用举例)
【4月更文挑战第4天】Hadoop【基础知识 04】【HDFS常用shell命令】(hadoop fs + hadoop dfs + hdfs dfs 使用举例)
18 5
|
9天前
|
存储 分布式计算 Hadoop
【Hadoop】HDFS 读写流程
【4月更文挑战第9天】【Hadoop】HDFS 读写流程
|
1月前
|
分布式计算 资源调度 Hadoop
Hadoop分布式
基于Java的分布式计算平台,旨在处理海量数据。【2月更文挑战第19天】
25 2
|
1月前
|
存储 分布式计算 Hadoop
分布式文件系统(HDFS)
分布式文件系统(HDFS)【2月更文挑战第15天】
37 1
|
7天前
|
存储 分布式计算 Hadoop
大数据处理架构Hadoop
【4月更文挑战第10天】Hadoop是开源的分布式计算框架,核心包括MapReduce和HDFS,用于海量数据的存储和计算。具备高可靠性、高扩展性、高效率和低成本优势,但存在低延迟访问、小文件存储和多用户写入等问题。运行模式有单机、伪分布式和分布式。NameNode管理文件系统,DataNode存储数据并处理请求。Hadoop为大数据处理提供高效可靠的解决方案。
30 2
|
9天前
|
SQL 分布式计算 Hadoop
利用Hive与Hadoop构建大数据仓库:从零到一
【4月更文挑战第7天】本文介绍了如何使用Apache Hive与Hadoop构建大数据仓库。Hadoop的HDFS和YARN提供分布式存储和资源管理,而Hive作为基于Hadoop的数据仓库系统,通过HiveQL简化大数据查询。构建过程包括设置Hadoop集群、安装配置Hive、数据导入与管理、查询分析以及ETL与调度。大数据仓库的应用场景包括海量数据存储、离线分析、数据服务化和数据湖构建,为企业决策和创新提供支持。
40 1
|
26天前
|
消息中间件 SQL 分布式计算
大数据Hadoop生态圈体系视频课程
熟悉大数据概念,明确大数据职位都有哪些;熟悉Hadoop生态系统都有哪些组件;学习Hadoop生态环境架构,了解分布式集群优势;动手操作Hbase的例子,成功部署伪分布式集群;动手Hadoop安装和配置部署;动手实操Hive例子实现;动手实现GPS项目的操作;动手实现Kafka消息队列例子等
20 1
大数据Hadoop生态圈体系视频课程

相关实验场景

更多