HDFS认识和介绍

概述

HDFS 是 Hadoop Distribute File System 的简称,意为:Hadoop 分布式文件系统,是一种旨在在商品硬件上运行的分布式文件系统。它与现有的分布式文件系统有许多相似之处。但是,与其他分布式文件系统的区别很明显。HDFS具有高度的容错能力,旨在部署在低成本硬件上。

一句话总结:就是一个支持分布式大数据量存储的文件系统。

适用场景: 适合读多写少不修改的场景。(不支持文件的修改)

优点和缺点

优点

  • 容错性

    支持多副本保存文件

  • 大数据量

    支持TB,PB级别的数据量

    支持百万以上的文件数量

  • 低成本

    对机器的要求不高

缺点

  • 访问数据比较慢

  • 无法高效的对大量小文件存储

    hdfs的设计架构通过nameNode 存储文件目录信息,如果存储大量的小文件,将会让NameNode的数据量剧增,造成查找文件的时间变长,寻址时间会超过读取文件时间

  • 不支持并发写入,文件修改

    同一个文件只能一个写入操作。

    数据不能修改,只能对数据在末尾追加操作。

HDFS 架构

HDFS中的角色

  • Client 客户端操作读写操作

    Client 可以对文件执行读写操作,也可以访问NameNode 获取文件元信息

    文件上传的时候,Client 将文件进行切分成一个一个的Block然后进行上传。

  • NameNode 存储文件的元数据信息,名称,地址等

  • DataNode 数据节点 ,存储文件数据 内部由一个一个的Blocks组成

  • Secondary NameNode

    ​ 分担NameNode工作量,定期合并Fsimage和Edits,并推送给NameNode

    紧急情况下,帮助恢复NameNode

在NameNode挂了的情况下,Secondary NameNode 并不会切换成NameNode

hdfs 写入数据流程

  1. 客户端请求NameNode 请求是否可以执行上传请求
  2. NameNode 做权限校验和目录是否存在等操作 然后响应客户端是否可以执行上传
  3. 客户端对文件进行切块,首先请求第一个block信息
  4. NameNode 根据副本数等信息,返回block 要写入的DataNode信息,假如返回的是 n1 n2 n3
  5. 客户端 使用FsDataOutPutStream 模块 将流写入一个DataNode上,比如写入n1 ,n1 在收到数据会依次向后续其他需要写入的节点传递数据。
  6. 所有写入节点逐级应答客户端
  7. 客户端向n1写入一个block数据,先从磁盘读取数据到一个本地内存缓存,以packet为单位,每个节点只要获取到一个packet就传递到下一个节点。
    并不是第一个节点接收完数据后才向下一个节点传递的,可以近似的理解为是一个多个节点一起同步的过程。
  8. 当第一个block写完后,接着再请求第二个block的请求操作。循环直到写完所有的block

hdfs 读取数据流程

  1. 客户端请求NameNode执行下载请求,NameNode 获取到文件所在的文件块的地址返回。
  2. 挑选一台DataNode(就近原则,然后随机)服务器,获取数据。
  3. DataNode 传输数据给客户端,从磁盘中以packet为单位读取和检验
  4. 客户端以packet为单位接收数据,先在本地缓存数据,然后写入目录文件

注意读取 请求 Block1 和block2 是串行执行的,即使不在同一个节点上也是执行完一个再执行另一个

块的大小

默认的块的大小是 128M. 可以通过dfs.blocksize 来设置.

一般机械硬盘设置为128M,固态硬盘设置为256M 即可。

设置太小,会增加寻址时间,设置太大,会增加数据传输,因为请求到块上,需要处理块的数据。