Hadoop_HDFS


Hadoop基础

Hadoop

Hadoop主要分为三大模块,分别是 HDFS(文件分布系统), MapReduce(分布式计算框架),YARN(资源调度管理)。

HDFS

HDFS的组成

HDFS的组成

NameNode

主要作用

  • 存储数据

存储对应的元数据,其中元数据包括:目录结构树,文件,数据块和副本的映射关系(不是数据信息,是映射关系)

  • 存储位置

内存和磁盘

包含的文件

  • fsimage:元数据镜像文件,存储某一时段NameNode内存元数据信息即保存了最新的元数- 据checkpoint
  • edits:操作日志文件。
  • fstime:保存最近一次checkpoint的时间。

1、NameNode 为了保证交互速度,会在内存中保存这些元数据信息,但同时也会将这些信息保存到硬盘上进行持久化存储;

2、fsimage文件是内存中的元数据在硬盘上的checkpoint,它是一种序列化的格式,不能直接修改。

3、Hadoop在重启时就是通过fsimage+edits来状态恢复,fsimage相当于一个checkpoint,首先将最新的checkpoint的元数据信息从fsimage中加载到内存,然后逐一执行edits修改日志文件中的操作以恢复到重启之前的最终状态。

4、Hadoop的持久化过程是将上一次checkpoint以后最近一段时间的操作保存到修改日志文件edits中。

SecondaryNameNode
  • 主要作用

作为NameNode的冷备份;合并fsimage(元数据镜像文件(文件系统的目录树))和fsedits然后再发给Namenode,分担NameNode的一部分工作。

1、edits:元数据的操作日志(针对文件系统做的修改操作记录)

2、Namenode内存中存储的是fsimage+edits

操作方式

  • SecondaryNameNode节点 的主要功能是周期性将元数据节点的命名空间镜像文件(fsimage)和修改日志(edits)进行合并,以防edits日志文件过大。下面来看一看合并的流程:

1、SecondaryNameNode节点 需要合并时,首先通知NameNode节点生成新的日志文件,以后的日志都写到新的日志文件中。

2、SecondaryNameNode节点 用http getNameNode节点获得fsimage文件及旧的edits日志文件。

3、SecondaryNameNode节点 将 fsimage 文件加载到内存中,并执行日志文件中的操作,然后生成新的fsimage文件。

4、SecondaryNameNode节点将新的fsimage文件用http post传回NameNode节点上。

5、NameNode 节点可以将旧的fsimage文件及旧的日志文件,换为新的fsimage文件和新的日志文件(第一步生成的),然后更新fstime文件,写入此次checkpoint的时间。

6、这样NameNode 节点中的fsimage文件保存了最新的checkpoint的元数据信息,日志文件也重新开始,不会变的很大了。

  • 注意:

1、这种机制有个问题:因edits存放在NameNode中,当NameNode挂掉,edits也会丢失,导致利用Secondary NameNode恢复Namenode时,会有部分数据丢失。

2、HDFS设置了两种机制进行条件合并(hdfs-site.xml):

第一种:当时间间隔大于或者等于dfs.namenode.checkpoint.period配置的时间是做合并(默认一小时)。

第二种:当最后一次往journalNode写入的TxId(这个可以在Namenode日志或者50070界面可以看到)和最近一次做checkpointTxId的差值大于或者等于dfs.namenode.checkpoint.txns配置的数量(默认1000000)时做一次合并。

配置

引用的博客:参考资料

DataNode
  • 主要作用

主要负责存储对应的文件(这里的文件是对应的数据块,Hadoop2.x以后默认大小为128M),备份对应的文件(副本数目可在配置里设置dfs.replication)。

HDFS的优点和缺点

HDFS优点

1、可构建在廉价机器上。

2、高容错性。

3、适合批处理。

4、适合大数据处理。

5、流式文件访问。

HDFS缺点

1、低延迟数据访问。

2、小文件存取。

3、并发写入、文件随机修改。

*HDFS文件系统为什么不适用于存储小文件? *

这和HDFS系统底层设计实现有关系的,HDFS本身的设计就是用来解决海量大文件数据的存储。当数据被HDFS存储的时候,它会被切割成多个的独立的数据块,而这些数据块的信息会被存储在元数据中。如果文件越小,对应的元数据里内存空间就会被占用,从而造成性能上的浪费。

如何解决?

  • 1、采用HAR的归档方式。

HAR为构建在其它文件系统上用于文件存档的文件系统,通常将hdfs中的多个文件打包成一个存档文件,减少Namenode内存的使用,可以直接使用hadoop archive命令创建HAR文件。创建HAR的过程是在运行一个mr作业。

HAR在对小文件进行存档后,原文件不会被删除,且创建之后不能改变,文件名中也不能有空格存在,否则会报异常

  • 2、采用CombineFileInputFormat

CombineFileInputFormat是一种新的inputformat,用于将多个文件合成一个单独的split,而且它还可以考虑数据的存储位置。

  • 3、开启JVM重用。

JVM重用可以使得JVM实例在同一个job中重新使用N次,N的值可以在hadoop的mapred-site.xml文件中进行配置,通常在10-20之间。如果没有小文件,不要开启JVM重用,因为会一直占用使用到的task卡槽,直到任务完成才释放。

HDFS的其它功能

心跳机制和重新复制

每个DataNode 定期向 NameNode 发送心跳消息,(DataNodeNameNode汇报的信息有2点,一个是自身DataNode的状态信息,另一个是自身DataNode所持有的所有的数据块的信息。)如果超过指定时间没有收到心跳消息,则将DataNode 标记为死亡。NameNode 不会将任何新的IO 请求转发给标记为死亡的DataNode,也不会再使用这些 DataNode 上的数据。 由于数据不再可用,可能会导致某些块的复制因子小于其指定值,NameNode 会跟踪这些块,并在必要的时候进行重新复制。

副本放置策略

第一副本:放置在上传文件的DataNode上;如果是集群外提交,则随机挑选一台磁盘不太慢、CPU不太忙的节点上;

第二副本:放置在于第一个副本不同的机架的节点上;

第三副本:与第二个副本相同机架的不同节点上;

如果还有更多的副本:随机放在节点中;

HDFS的读写流程

HDFS的写操作

说明:以下内容引入:Hadoop-HDFS之读写流程

准备工作
HDFS写操作01

1、HDFS client先会去询问NameNode,看哪些DataNode可以存储文件。文件的拆分是在HDFS client中完成的,比如拆分成ABC

2、NameNode查看它的元数据信息,发现DataNode 127上有空间可以存储Block A,于是将此信息告诉HDFS Client

3、HDFS Client接到NameNode返回的DataNode列表信息后,它会直接联系第一个DataNode1,让它准备好接收Block A(建立TCP连接)。

4、在DataNode1建立好TCP连接后它会把HDFS Client要写Block A的请求顺序传给DataNode2(在与HDFS Client建立好TCP连接后从HDFS Client获得的DataNodel1信息),同理传递给DataNode7

5、当DataNode7准备好后,会回传信息过来,HDFS Client接到信息后表示都准备好了,就可以写数据了。

写入数据
HDFS写数据02

1、HDFS Client开始往DataNode1写入Block A数据。同准备工作一样,当DataNode1接收完Block A数据后,它会顺序将Block A数据传输给ataNode2,然后DataNode2再传输给DataNode7

2、每个DataNode在接收完Block A数据后,会发消息给NameNode,告诉它Block数据已经接收完毕。

3、NameNode同时会根据它接收到的消息更新它保存的文件系统元数据信息。

4、当Block A成功写入3个DataNode之后,DataNode1会发送一个成功信息给HDFS Client,同时HDFS Client也会发一个Block A成功写入的信息给NameNode。之后,HDFS Client才能开始继续处理下一个Block-Block B

HDFS读数据操作

HDFS读取文件

1、HDFS Client会先去联系NameNode,询问file.txt总共分为几个Block而且这些Block分别存放在哪些DataNode上。

2、由于每个Block都会存在几个副本,所以NameNode会把file.txt文件组成的Block所对应的所有DataNode列表都返回给HDFS Client

3、然后HDFS Client会选择DataNode列表里的第一个DataNode去读取对应的Block。比如由于Block A存储在DataNode127,那么HDFS Client会到DataNode1去读取Block ABlock C存储在DataNode789,那么HDFS Client就回到DataNode7去读取Block C

补充

漫画详解HDFS的存储原理

说明:以下图片引用自博客:翻译经典 HDFS 原理讲解漫画

HDFS写数据原理

01
02
03

HDFS读数据原理

01

HDFS故障类型和其检测方法

01
02

读写故障的处理

01

DataNode 故障处理

01

副本布局策略

01


文章作者: L Q
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 L Q !
  目录