vlambda博客
学习文章列表

HDFS知识点汇总(含读、写、删流程)

------------ 本文来自 阿P官方博客

思考1:HDFS的作用?思考2:HDFS的意义?思考3:HDFS的优缺点?tips:学习HDFS重点学会读、写、删流程。概念性的东西,看看就好。

一、思考

 
   
   
 
  1. 1:为什么Hadoop要引入HDFS进行分布式存储,为什么不使用传统方式进行(1台主机)存储?

  2. 一台主机承受的并发能力有限。

  3. 一台主机存储量有限,一般来说8TB应该是没有问题的。

  4. 2HDFS分布式的存储,怎么写入、怎么读取?

  5. 利用NameNode节点管理DataNode

  6. 利用DataNode节点存储数据。

  7. 3:如果客户端发送给NameNode单条数据时,数据量非常大,一个DataNode无法存储,如何存储?

  8. 存储数据时,HDFS会将数据切块(block),分别存储到不同的DataNode上。

  9. 4:如果某个DataNode宕机,数据块丢失,如何处理?

  10. 数据备份策略(复本策略)。默认复本数量为3(该数据块存储3份)。

二、块(block)

 
   
   
 
  1. 1.blockHDFS基本存储单元。

  2. 2.Hadoop2.x版本上,默认block128M

  3. 3.如果文件大小<128M,文件不会分块。

  4. 4.id:用来标记复本。相同复本id一样

  5. 5.由于block的存储,HDFS更适合存储超大文件、快速备份。

三、管理节点(NameNode)

 
   
   
 
  1. 1.概述

  2. HDFS的最核心内容

  3. 1.x中,最多设置1

  4. 2.x以上,最多可以设置2个。如果设置两个,不能设置SecondaryNameNode

  5. 2.用处:

  6. 用于管理DataNode

  7. 记录元数据Meta

四、NameNode元数据

 
   
   
 
  1. 1.元数据内容

  2. 记录切块数量

  3. 记录数据库存储位置

  4. 记录数据库复本数量

  5. 记录文件权限

  6. 元数据存储

  7. 内存:可快速查找

  8. 磁盘:可进行崩溃恢复。

  9. 磁盘存储位置:{hadoop.tmp.dir}/dfs/current/name

  10. 2.edits_…*文件:记录写操作

  11. 3.fsimage_…*文件:记录元数据。一般称为检查点(注意:与内存中的元数据,并不是同步的)

  12. 4.工作机制

  13. 客户端请求写入HDFS

  14. HDFSNameNode节点生成一个edits*文件。

  15. 每次客户端写入HDFS,都会更新一次edits*文件。

  16. edits*达到以下任一条件,会更新到fsimage*下

  17. 空间维度。达到指定大小,默认64M时。在core-site.xml中指定。

  18. 时间维度。达到指定时间,默认1h时。在core-site.xmk中指定。

  19. NameNode重启时。

  20. 强制重启。

  21. 注意:上步骤的更新过程由NameNode从节点进行。

  22. 5.此工作机制可以节省节点内存和CPU。不会造成浪费。

五、NameNode管理DataNode流程

 
   
   
 
  1. 1.心跳机制:DataNode每隔一段时间,会发生给NameNode一条信息。默认3s

  2. 当前节点状态(以下四种状态):

  3. In Service

  4. Dead(官方给的是Lost)

  5. Prepare Service

  6. 退役

  7. block信息

  8. 2.NameNode长时间没有收到DataNode的信息,那么就认为DataNode信息丢失。默认10分钟(一般200次左右)。

  9. 3.DataNode信息丢失,NameNode会将DataNode的数据再次备份到其他DataNode,以保证复本数量。

  10. 4.NameNode重启或启动时:

  11. edits*中的操作重新写入fsimage*。

  12. fsimage*元数据加载到内存中

  13. 5.安全模式

  14. 在启动或者DataNode块损坏太多,HDFS会进入安全模式,安全模式无法进行任何操作

  15. DataNode心跳都成功或者失败的DataNode可进行修复,则自动退出安全模式。

  16. 若等待很久,数据可能无法恢复。此时可以强制退出安全模式(这件事在生产环境下不要做或者少做!!!)

  17. tips14000~5000节点时,安全模式一般是30min~1h

  18. tips2:因为有安全模式的问题,伪分布式下,复本数量必须为1

六、复本放置策略

 
   
   
 
  1. 1.Hadoop2.7版本以前

  2. 客户端不是当前DataNode

  3. 上传数据时,NameNode选择相对空闲的节点,存放第一个复本。

  4. 客户端是当前DataNode

  5. 上传数据时,第一个复本为当前节点。

  6. 第二个复本放在和第一个复本不同机架的节点上。

  7. 第三个复本放在和第二个复本相同机架的节点上。

  8. 超过三个复本,随机放

  9. 2.Hadoop2.7版本以后

  10. 第一个复本放置策略不变

  11. 第二个复本放在和第一个复本相同机架的节点上

  12. 第三个复本放在和第二个复本不同机架的节点上

  13. 超过三个复本,随机放。

七、机架感知策略

 
   
   
 
  1. 1.前文所说的机架并不是物理结构,而是逻辑结构。

  2. 2.通俗一点说,就是一个简单的ip=>name的映射。

  3. 3.实际使用中,一般会将一个物理机架上的所有节点,放到一个逻辑机架上。

  4. 4.为什么这么放置?

  5. 防止同属一个物理机架的服务器宕机,导致我们的HDFS块文件丢失。这也是HDFS安全可靠的原因之一

八、数据节点(DataNode)

 
   
   
 
  1. 1.概念

  2. DataNode存储数据,以block的形式存储

  3. 磁盘存储位置(参考):{hadoop.tmp.dir}/dfs/data/current/BP-419704509-127.0.0.1-1588068492492/current/finalized/subdir0/subdir0

  4. 2.DataNode会通过心跳机制发送给NameNode信息。心跳机制通过RPC方式发送信息。

十、NameNode从节点(Secondary NameNode)

 
   
   
 
  1. 1.NameNode并不是严格意义上的主从关系。仅用来辅助NameNode进行元数据合并,不能做到和NameNode实时热备。

  2. 2.对集群影响不大,能起到一定的备份作用。

  3. 3.Hadoop2.0以上,为了NameNode的热备,舍弃了Secondary NameNode

十一、HDFS命令

 
   
   
 
  1. 1.hadoop fs

  2. -rmdir {dir}:删除

  3. -get {file}:下载

  4. -cat {file}:查看

  5. -ls {file}:查看子目录

  6. -tail {file}:查看文件最后1k字节的数据

  7. -mv {file} {file1}:file剪切、重命名到file1

  8. -cp {file} {file1}:file复制到file1

  9. -rm {file}:删除文件(默认情况,不可恢复。可通过配置回收站机制,让其可以恢复)

  10. 2.开启回收站功能的配置

  11. vim core.site.xml:加入以下内容

  12. `

  13. <property>

  14. <name>fs.trash.interval</name>

  15. <value>1440</value><!--存储时间:分钟-->

  16. </property>

  17. `

十二、hdfs目录说明

 
   
   
 
  1. 1.存放目录:{hadoop.tmp.dir}

  2. 2.创建时机:在NameNode被格式化的时候产生

  3. 3.子目录

  4. nameNameNode节点才会有

  5. ./in_use.lock:标记NameNode是否使用

  6. dataDataNode节点才会有

  7. namesecondorySecondoryNameNode节点才会有

  8. 4.流程

  9. HDFS在启动后,会将写操作记录到edits_inprogress

  10. 而这个文件大小固定位1M。若超过1M,则每次容量会增加1M(扩容)。

十四、HDFS流程

 
   
   
 
  1. 1.读流程

  2. 客户端发送请求(RPC)到NameNode

  3. NameNode收到请求后,进行以下几步校验

  4. 校验文件存在与否

  5. tips1:利用网络拓扑来计算距离远近:离公共节点的距离

  6. tips2:若最近的节点宕机,则会从新选择最近节点。

  7. 读完一个block,会依次读取下一个。直到所有block都读完。

  8. tips:若文件足够大(几TB),NameNode会分几次返回block

  9. 为了提高并发量和吞吐量。

  10. NameNode要管理所有DataNode,降低NameNode工作任务,可以提高集群的稳定性。

  11. 2.写流程

  12. 客户端发起RPC请求到NameNode

  13. 该请求包含对文件信息的描述

  14. NameNode收到请求后,进行以下几步校验

  15. 用户是否权限

  16. 检查是否有同名文件

  17. tips1:在写的时候,复本如何放置,见前文所说的`复本放置策略`

  18. tips2:一个block默认三个复本,只有所有复本都返回正确的ACK信号,才会进行下一个block的复本放置

  19. 当写完所有的block都放置成功后,客户端通知NameNode关流,同时将该文件更改为不可再写。

  20. 3.删流程

  21. 客户端发起请求(RPC)到NameNode

  22. NameNode收到请求后,进行以下几步校验

  23. 校验文件存在与否

  24. 校验客户端是否有删除权限

  25. 将操作记录到edits_inprogess

  26. 删除内存中记录,并返回ACK信号,表示删除成功。

  27. 等待DataNode的心跳,如果该DataNode存在要删除的数据,则对该节点发送指令进行删除。

十五、HDFS特点

 
   
   
 
  1. 1.存储超大文件 - 分块

  2. 2.快速应对和检测故障 - 心跳

  3. 3.保证数据高可靠 - 复本

  4. 4.简易的一致性模型 - 一次写入,多次读取。在Hadoop2.0开始,允许追加。

  5. 5.支持横向扩展 - 能够另一些低廉的设备进行横向扩展

  6. 纵向:数量不变,提高性能

  7. 横向:增加数目,提高性能

  8. 6.不建议存储大量小文件

  9. 7.不支持低延迟访问

  10. 8.不支持事务