hadoop文件系统HDFS

Hadoop家族成员: HDFS Map/Reduce zookeeper Hive Hbase 这些事必学的,属于hadoop家族。

Flume 和 mahout sqoop虽然不属于Hadoop家族,但是也很重要,也是必须的。

HDFS

HDFS优点:

一、高容错性
1、数据自动保存了多个副本
2、副本丢失后,自动恢复
二、适合批处理
1、移动计算而非数据
2、数据位置暴漏给计算框架
三、适合大数据处理
1、GB、TB甚至PB级别的数据
2、百万规模以上的文件数量
10K+节点
四、可以构建在廉价机器上
1、通过多副本来提高可靠性
2、提供容错性和恢复机制

HDFS缺点

一、低延迟数据访问
1、比如毫秒级
2、低延迟与高吞吐率

二、小文件存取
1、占用NameNode大量内存
2、寻道时间超过读取时间

三、并发写入、文件随机修改
1、一个文件只能有一个写者(不能够进行修改)
2、仅支持append

NameNode

1、存储元数据
2、元数据保存在内存中
3、保存文件block、datanaode之间的映射关系

什么是元数据:
除去文件内容之外的文件数据,比如:文件大小,名称等属性

DataNode

1、存储文件内容
2、文件内容保存在磁盘中
3、维护了block id到datanode本地文件的映射关系

HDFS运行机制:

1、一个名字节点和多个数据节点
2、数据复制(冗余机制)
存放的位置,机架感知策略

故障检测:

一、数据节点
1、心跳包(检测是否宕机)
2、块报告(安全模式下检测)
3、数据完整性检测(校验和比较)

二、名字节点(日志文件、镜像文件)

HDFS架构

《hadoop文件系统HDFS》 Paste_Image.png

HDFS数据存储单元(block)

一、文件被切分成固定大小的文件块
1、默认数据大小为64MB,可配置
2、若文件大小不到64MB,则单独存储为一个block
二、一个文件存储方式
1、按大小被切分为若干个block、存储在不同的节点上
2、默认情况下每个block都有三个副本

注意 Block大小和副本数通过client端上传文件时设置、文件上传成功后副本数可以变更,Block Size不可变更
Block大小一旦设置不能再变更了,但是Block存储的副本数可以不断改变。

HDFS的设计思想

《hadoop文件系统HDFS》 Paste_Image.png

一、NameNode
1、NameNode主要功能:接受客户端的读写服务
2、NameNode保存metadate信息包括:
1、文件owership和permissions
2、文件包含哪些块
3、Block保存在哪个DataNode(由DataNode启动时上报)
二、NameNode的metadate信息在启动后会加载到内存
1、metadata存储到磁盘文件名为:“fsimage”
2、Block的位置信息不回保存到fsimage(启动时,datanode会进行上报)
3、edits记录对metadata的操作日志

当新增一个数据或者删除一个数据时,会首先在内存中修改,然后写入到fsimage中,注意,在写入fsimage之前,首先会写入到edits日志文件中。每隔一段一段时间内,把edits文件和fsimage文件合并。

metadata就是元数据,除文件内容之外的数据都是元数据,datanode上没有文件名,只是一个block。

Secondary NameNode(SNN)

一、这SNN不是namenode的备份(但可以做备份),这个SNN的主要工作是帮助NN(NameNode)合并edits log,减少NN启动时间
二、SNN执行合并的时机
1、根据配置文件设置的时间间隔进行合并 fs.checkpoint.period默认是3600秒
** 2、根据配置文件设置edits log大小 fs.checkpoint.size规定edits文件的默认值默认是64MB**

如果达到以上两个条件,就进行合并。

Secondary NameNode不是nameNode的备份,可以作为数据备份
主要工作:是帮助NameNode合并edits合并文件

合并的时候会有大量的IO操作,把edits中删除的在fsimage中删除, 把edits中新增的在fsimage中增加,NameNode不做这个事情,NameNode把主要精力放在用户的读写服务上,Secondary NameNode才会去做这个事情。合并会消耗大量的IO。

SNN新生成一个fsimage推送给NN,进行覆盖NN的fsimage

Secondary NameNode合并流程

《hadoop文件系统HDFS》 Paste_Image.png

如上图,再SNN往NN拷贝的时候,NN会首先创建一个edits.new文件,这是内存中正在合并的时间内,用户的合并日志。
然后SNN进行合并,合并完成以后,就会把fsimage.ckpt推送给NN,默认的edits.new每隔3600秒产生一次,因为每次合并就要产生一个edits.new文件,等到下次合并的时候,只合并edits.new这个文件。合并完成以后edits.new变为edits,下次合并继续拿这个edits在SNN上进行合并。

这些文件都在磁盘上记性存储。

当NN挂掉以后,上次合并的fsimage.ckpt还在SNN上,但是NN上的edits相当于这段时间内新增的操作,无法找回了,只能找到上次edits合并之前的。所以SNN还是有一定备份作用的。如上说的NN挂掉以后只磁盘不可恢复。

DataNode(NN)

1、存储数据(block)
2、启动DN线程的时候会向NN汇报block信息
3、通过向NN发送心跳保持与其联系(3秒一次),如果NN在10分钟没有收到DN的心跳,则认为这个DN丢失了,并copy其上的block到其它的机器上。

Block的副本放置策略

  1、第一个副本:放置在上传文件的DN;如果是集群外提交,则随机挑选一台磁盘不太满,CPU不太忙的节点。
  2、第二个副本:放置在于第一个副本不同的机架上(因为一般一个机架共用一个电源,这样可以排除供电挂掉,副本都受到影响的情况)
  3、第三个副本:放置在与第二个副本相同机架的节点上。
  4、如果设置了更多的副本:后面的节点会随机放置。

一个机架一般也在一个交换机,一个交换机内速度会比较快一点。
hadoop如何知道机架信息??? 在配置的时候,会把相关的支架信息告诉hadoop。

HDFS读流程

《hadoop文件系统HDFS》 Paste_Image.png

open是一个函数,
通过FSDataInputStream找一个对应的DataNode进行读,同时其他的block也可以并发的读。

HDFS写流程

《hadoop文件系统HDFS》 Paste_Image.png

如何写?
首先由客户端上报文件名,文件大小,NN会返回切分的文件大小和每个DataNode的存放位置,然后客户端去执行写操作,首先写第一个副本,
当写完第一个副本以后,由第一个DataNode创建线程,自动把文件写到其他DataNode上,这个动作完成以后,会返回给客户端,然后客户端再返回给NameNode,整个过程就是这样!

HDFS文件权限

一、与Linux文件权限类似
1、r:read w:write x:execute ,权限x对于文件忽略,对于文件夹表示是否允许访问其内容
二,如果Linux系统用户tt使用hadoop命令创建一个文件,那么这个文件在HDFS中ower就是tt。
三、HDFS的权限目的:HDFS相信,你告诉我是谁

Hadoop 安全模式

什么叫做安全模式时间段?
系统刚刚启动,datanode的数据节点位置信息要上报给namenode,这时候还不能写、重命名和删除。这个时间段处于安全模式下。

一、namenode启动的时候,首先将映射文件(fsimage)载入内存,并执行编辑日志(edits)中的各项操作
二、一旦内存中成功建立文件系统元数据的映射,则创建一个新的fsimage文件(这个操作不需要SecondaryNameNode)和一个空的编辑日志
三、此时namenode运行在安全模式下。即namenode的文件系统对于客户端来说是只读的。(显示目录,显示文件内容等。写、删除、重命名都会失败)
四、在此阶段Namenode收集各个datanode的报告,当数据块达到最小副本数以上时,会被认为是“安全”的,在一定比例(可设置)的数据块被确定为“安全”后,再过若干时间,安全模式结束
五、当检测到副本数不足的数据块时,该块会被复制直到达到最小副本数,系统中数据块的位置并不是由namenode维护的,而是以块列表的形式存储在datanode中。

    原文作者:topwqp
    原文地址: https://www.jianshu.com/p/5f00ec80a13c
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞