大数据--hadoop生态--HDFS学习总结
作者:互联网
目录
一:HDFS主要组件及其功能
包括NameNode, SecondaryNmaeNode , DataNode.
其中,名称节点(NameNode)负责管理分布式文件系统的命名空间,保存了两个核心的数据结构,FsImage和EditLog。
FsImage:用于维护文件系统树以及文件树中的所有的文件和文件夹的元数据。
操作系统日志EditLog: 记录了所有针对文件的创建,删除,重命名等操作。
名称节点记录了各个块所在的数据节点的位置信息。
FsImage文件包含文件系统中
的所有目录和文件inode的序列化形式。每个inode是一个文件或者目录的元数据的内部访问。
二:SecondaryNameNode工作情况
1)SecondaryNameNode会定期和NameNode通信,请求其停止使用EditLog文件,暂时将新的写操作写到一个新的文件上来。
2)SecondaryNameNode通过http get方式从NameNode上获取FsImage和EditLog文件,并下载到本地的相应目录下。
3)SecondaryNameNode将下载下 来的FsImage载入到内存,然后一条一条地 执行EditLog文件中的各项更新操作,使得 内存中的FsImage保持最新;这个过程就是 EditLog和FsImage文件合并
4)SecondaryNameNode执行完(3 )操作之后,会通过post方式将新的 FsImage文件发送到NameNode节点上
5)NameNode将从SecondaryNameNode接受到新的FsImage替换旧的EditLog文件,这个过程EditLog就变小了。
secondaryNameNode作用:
名称节点保存了所有的元数据信息,其中最核心的两大数据结构是FsImage和EditLog.如果这两个文件发生损坏,那么整个HDFS实例将失效。因此HDFS设置了备份机制,把这些核心文件同步复制到备份服务器SecondaryNameNode上。当名称节点出错时候,就可以根据备份服务器SecondaryNameNode上的FsImage和EditLog数据进行恢复。
专门用于FsImage和Edits的合并
三:HDFS的数据存储原理
3.1 冗余数据保存
HDFS作为一个分布式文件系统,为了保证系统的容错性和可用性,HDFS采用了多副本方式对数据进行冗余存储,通常一个数据块的多个副本会被分布到不同的数据节点上。
这种多副本保存方式优点:
- 加快数据传输速度
- 容易检查数据错误
- 保证数据可靠性
3.2 数据存取策略
数据存放:
- 第一个副本:放置在上传文件的数据节点;如果是集群外提交,则随机挑选一台磁盘不太满,cpu不太忙的节点
- 第二个副本,放置在与第一个副本不同的机架的节点上;
- 第三个副本,放置在与第一个副本相同机架的其他节点上。
- 更多副本:随机节点
数据读取:
HDFS提供了一个API可以确定一个数据节点所属的机架ID,客户端也可以调用API获取自己所属的机架ID。
当客户端读取数据时候,从名称节点获得得数据块不同副本得存放位置列表,列表中包含了副本所在得数据节点,可以调用API来确定客户端和这些数据节点所属得机架ID。当发现某个数据块副本对应得机架ID和客户端对应机架ID相同时候,就优先选择该副本读取数据,如果没有发现,就随机选择一个副本读取数据。
数据错误与恢复:
HDFS具有较高的容错性,可以兼容廉价的硬件,它把硬件出错看作一种常态,而不是异常,设计了相应的机制检测数据错误和进行自动恢复,主要包括:名称节点出错,数据节点出错和数据出错。
- 名称节点出错:名称节点保存了所有元数据信息,其中,最核心的两个数据结构是FsImage和EditLog,如果这两个文件发生损坏,那么整个HDFS实例将会失效。因此,HDFS设置了备份机制,把这些核心文件同步复制到备份服务器SecondaryNameNode上。当名称节点出错时候,就可以根据备份服务器SecondaryNameNode中的FsImage和EditLog进行恢复。
- 数据节点出错:每个数据节点会定期向名称节点发送“心跳”信息,向名称节点报告自己的状态。当数据节点发送故障,或者网络发生断网时候,名称节点就无法收到来自一些数据节点的心跳信息,这时候,这些数据节点就会被标记为“宕机”,节点上的所有数据都会被标记为“不可读”,名称节点就不会发生任何I/O请求。名称节点会定时检查这种情况,一旦发现某个数据块的副本数量小于冗余因子,就会启动数据冗余复制,为它生成新的副本。
- 数据出错:网络传输和磁盘错误等因素,都会造成数据错误。当客户端读取文件的时候,会先读取该信息文件,然后利用该信息文件,对每个读取的数据块进行校验,如果校验出错,客户端就会请求到另外一个数据节点读取该文件块,并且向名称节点报告这个文件块有错误,名称节点会定期检查并且重新复制这个块。
四:HDFS数据读写过程
4.1 HDFS读数据过程(重点)
首先介绍几个相关概念:
- FileSystem:是一个通用文件系统的基类,可以被分布式文件系统继承,所有可能使用hadoop文件的代码都需要使用这个类。
- DistributedFileSystem:是FileSystem在HDFS中的实现。
- open()方法:FileSystem的open()方法返回的是一个输入流FSDataInputStream对象,在HDFS中具体的输入流就是DFSInputStream;
- create()方法:FileSystem中的create()方法返回的是一个输出流FSDataOutputStream对象,在HDFS中输出流就是DFSOutputStream.
读数据过程:
- 客户端通过FileSystem.open()打开文件,相应地,在HDFS中DistributedFileSystem具体实现了FileSystem.调用open()方法后,DistributedFileSystem会创建DFSInputStream.
- 输入流远程调用名称节点,获得文件开始部分数据块的保存位置。对于该数据块,名称节点返回保存该数据块的所有数据数据节点的地址,同时根据距离客户端的远近对数据节点进行排序;DistributedFileSystem会利用DFSInputStream来实例化FSDataInputStream,并返回给客户端,同时返回数据块的数据节点地址
- 获得输入流FSDataInputStream后,客户端调用read()方法开始读取数据。输入流根据前面的排序结果,选择距离客户端最近的数据节点建立连接并读取数据。
- 数据从该数据节点读取到客户端;当该数据块读取完毕时,FSDataInputStream关闭和该数据节点的连接。
- 输入流通过getBlockLocations()方法查找下一个数据块。
- 找到该数据块的最佳数据节点,读取数据。
- 当客户端读取完数据的时候,调用FSDataInputStream的close()方法,关闭输出流。
4.2 HDFS写数据的过程
写数据过程:
- 客户daunt调用FileSystem.create()创建文件,相应的,在HDFS中DistributedFileSystem具体实现FileSystem.调用create()方法后,会创建输出流DFSOutputStream.
- DistributedFileSystem通过RPC远程调用名称节点,在文件系统的命名空间中创建一个新的文件。名称节点会执行一些检查:比如文件是否已经存在,客户端是否有权限创建文件等。远程方法调用结束后,会实例化FSDOutputStream,并返回给客户端,客户端使用这个输出流写入数据。
- 获得输出流DFSOutputStream以后,客户端调用输出流的write()方法向HDFS中对应的文件写入数据。
- 客户端向输出流FSDOutputStream中写入的数据首先会被分成一个个分包,这些分包放在DFSOutputStream对象的内部队列里面。输出流会向名称节点申请保存文件和副本数据块的若干数据节点,这些数据节点形成一个数据流通道。
- 因为各个数据节点位于不同的机器上,数据需要通过网络发送。因此,为了保证所有数据都是准确的,接收到数据的数据节点要向发送者发送确认包(ACK packet).
- 客户端调用close()方法关闭输出流。
五:HDFS的HA(高可用)原理
相对于HDFS1.0 , HDFS2.0增加了HDFS HA和HDFS 联邦等新特性。
5.1 HDFS HA来源
为了解决单点故障问题。单点故障问题:在HDFS1.0中,只存在一个名称节点,一旦这个唯一的名称节点发生故障,就会导致整个集群变得不可用。即使hdfs1.0中有secondaryNameNode,可以周期型从名称节点获取命名空间镜像文件(FsImage)和修改日志(EditLog),进行合并后发送给名称节点,替换原来的FsImage,以防止EditLog过大,导致名称节点失败恢复时需要消耗过长时间。合并后的命名镜像文件FsImage在第二名称节点中也会保存一份,当名称节点失效时,可以使用第二名称节点中的FsImage进行恢复。但是第二名称节点无法提供“热备份”功能,即在名称节点发生故障的时候,系统无法实时切换到第二名称节点立即对外提供服务,依然需要进行停机恢复。
5.2 HDFS HA采用的方法
HDFS 2.0采用高可用(HA)架构,在一个典型的HA集群中,一般设置两个名称节点,其中一个名称节点处于“活跃”状态,另外一个处于“待命”状态。也就是说处于待命状态的名称节点提供了“热备份”,一旦活跃节点出现故障,就可以立即切换到待命名称节点。不会影响系统的对外服务。
5.3 HDFS 待命名称节点工作原理
活跃名称节点的状态信息必须实时同步到待命名称节点。状态同步借助于一个共享存储系统例如zookeeper.活跃名称节点将更新数据写入共享存储系统,待命名称节点会一直监听该系统,一旦发现有新的写入,就立即从公共存储系统读取这些数据加载自己内存中,从而保证与活跃节点状态完全同步。注意:zookeeper可以保证任意时刻只有一个名称节点提供对外服务。
六:HDFS常用命令
hdfs dfs -ls / 查看hdfs根目录
put命令
hdfs dfs -put file1.txt /user/hive/warehouse (首先在Linux系统上进入file1.txt所对应的目录下面,然后执行该命令)
get命令
hdfs dfs -put /user/hive/warehouse/test.db (此时hdfs上面的文件会导出到当前目录下面)
标签:HDFS,--,hadoop,FsImage,名称,数据,节点,客户端 来源: https://blog.csdn.net/yezonghui/article/details/117436747