HDFS介绍

起初,随着数据量的越来越大,通过纵向扩展(在一台机器中加磁盘)的形式已经不能满足需要,所以开始横向扩展(用多台机器进行数据存储)。为了方便管理和维护,分布式文件存储管理系统应运而生,HDFS就是其中之一。

HDFS架构原理

架构图如下图所示

hdfs存图片 spark 图像识别 hdfs存储图片方案_大数据


分布式文件系统的存储特点:切块存储

HDFS主要由两部分组成

  • namenode
  • datanode

namenode

  • 主要是用来管理整个分布式文件系统的元数据信息,比如文件名、文件大小、文件块数、每个块大小、每个块的存储位置以及块id等。
  • 通过RPC心跳机制来检测datanode节点的状态信息

secondary namenode

  • 并不是namenode的热备,当namenode宕机时并不能立刻代替namenode进行工作

关于seconddary namenode可以看下面这篇文章
Secondary NameNode:它究竟有什么作用?

datanode

  • 为了实现数据的可靠性,引入副本冗余机制,副本数量不易过多,因为副本数量越多,整个集群的磁盘利用率就会越低。比如:2副本策略:50%,3副本策略:33.3%

关于HDFS的比较详细的原理解释可以看下面这篇文章
HDFS核心技术详解

-----------------------------------------------以下内容更新于2020-02-10学习内容补充

知识点

  1. HDFS的来源,来源于《Google File System》
  2. HDFS是一个分布式的,可扩展,可靠的文件系统。
  3. HDFS的namenode称为名字节点,主要职责:
    ①管理HDFS的元数据信息(meta data),文件名,文件大小,被切成几块,每一个块的副本数量,块id,块大小,以及块存储在哪台datanode上
  4. hdfs存图片 spark 图像识别 hdfs存储图片方案_分布式存储_02

  5. ②通过RPC心跳机制来检测datanode节点的状态。
  6. namenode会将元数据信息存储到namenode服务器的内存中一份,目的是供用户快速查询。此外,因为元数据信息特别重要,所以namenode还会把元数据持久化到本地磁盘上。
  7. 元数据持久化的目录路径,是由core-site.xml的dfs.tmp.dir属性来决定的。此参数如果不配置,默认是放在/tmp,所以必须要配。
  8. namenode用两个文件来存储元数据信息:
    ①Edits文件 =>存储HDFS的操作记录
    ②Fsimage文件 =>存储是整个HDFS的状态(相当于快照文件)
    Edits和Fsimage会定期合并,合并周期是3600s(1小时),即Fsimage文件存储的是HDFS的元数据信息。
    这两个文件的查看路径:hadoop-2.7.1/tmp/dfs/name/current
  9. 格式化指令:hadoop namenode -format
    这个指令在初次使用HDFS时,需要执行一次。需要注意:此指令非常危险,因为会清空之前所有的元数据信息。
    一般会通过配置文件的方式让这个指令失效。
  10. HDFS的启动指令:
    ① start-dfs.sh =>启动所有和HDFS相关的进程,比如namenode,datanode,secondarynamnode
    ②hadoop-daemon.sh start secondarynamenode | namnode | datanode
  11. 停止指令:
    ①stop-dfs.sh
    ②hadoop-daemon.sh stop secondarynamenode | namnode | datanode
    ③kill -9 进程id
  12. SNN的作用不仅仅是namenode的备用节点,还承担了namenode的元数据文件的合并。通过这种机制,可以使得NN和SNN都具有元数据信息。就NN宕机后,SNN可以接替NN继续工作。
    注意:SNN这种元数据的合并机制,是存在问题的。因为可能会早元数据丢失的情况。SNN机制是Hadoop1.0机制。Hadoop2.0已经弃用。
    如果是Hadoop2.0的伪分布式,还是会看到SNN进程
    如果是Hadoop2.0的完全分布式,SNN机制已经舍弃
    总结:SNN机制存在问题在于它没有达到元数据实时热备,会造成元数据丢失。所以Hadoop1.0的namenode还是存在单点故障问题。
  13. hdfs存图片 spark 图像识别 hdfs存储图片方案_hdfs存图片 spark 图像识别_03

  14. 无论是Hadoop1.0还是2.0,当HDFS启动,namenode会做一次Edits和Fsimage合并的操作。这样做的目的是确保fsimage里的元数据更新。
  15. 可以通过指令手动合并:hadoop dfsadmin -rollEdits
  16. 当HDFS启动时,每个datanode会向namenode汇报自身的存储的信息,比如存储了哪些文件块,块大小,块id等。namenode收到这些信息之后,会做汇总和检测,检测数据是否完整,副本数量是否达到要求,如果检测出现问题,HDFS会进入安全模式,在安全模式做数据或副本的复制,直到修复完成后,安全模式自动退出。
  17. 如果HDFS处于安全模式,只能对外读服务,不能写服务。
  18. 如果是伪分布式模式,副本只能配置1个,因为如果>1,会导致HDFS一致安全模式而不能退出
  19. HDFS存储数据的方式是块存储。
    Hadoop1.0 切块大小 64MB
    Hadoop2.0 切片大小 128MB
    例子:1.txt(100MB) 2.txt(100kb) 3.txt(257MB) ,设定副本数量=1
    问HDFS集群上总的文件块?
    1.txt=1块(100MB)
    2.txt=1块(100kb)
    3.txt=1块(128MB) 2块(128MB) 3块(1MB)
    注意:切块是以文件为单位,不同的文件不能共用一个文件块。此外,块多大,在磁盘上占多大。
  20. 存储文件块的服务器叫datanode(数据节点),存储数据块的目录:tmp/dfs/data/current/BP-1998993700-192.168.150.137-1537051327964/current/finalized/subdir0/subdir0
  21. 当把一个文件上传到HDFS之后,是不允许修改文件的,因为修改操作属于随机写操作。
  22. HDFS的适用场景 :once-write-many-read
  23. Hadoop2.0,允许追加文件数据,注意:追加操作不同于修改。
  24. 问:HDFS是否适合存储海量小文件?
    答案是:不适合。
    每当上传一个文件,namenode就会用一条元数据来管理。根据经验,一条元数据大约150字节,所以,当上传海量小文件时,会占用namenode的内存资源。