0%

HDFS

HDFS

HDFS是分布式的文件系统,其借鉴了GFS(Google File System),用于存储文件,通过目录树来定位文件,作为Hadoop的数据存储部分,采用了主从(Master/Slave)结构模型,一个HDFS集群是由一个NameNode(nn)和若干个DataNode(dn)以及Secondary NameNode(2nn)组成的。其中NameNode作为主服务器,管理文件系统的命名空间和客户端对文件的访问操作;集群中的DataNode管理存储的数据。

HDFS的场景:适用于一次写入,多次读出,且不支持修改

为什么要有HDFS

HDFS是为了解决大数据的存储问题,那么是什么问题导致了HDFS的出现呢?

由于大数据存储数据量是海量的,如果存储在硬盘上,硬盘是没有足够的空间来将海量的数据进行存储下来的;而且如果硬盘损坏的话导致所有数据的丢失,数据不安全

解决硬盘不够大

一块硬盘不够,就无限的加硬盘

解决数据安全

同样的数据存储多份

结构

数据块概念

HDFS中的数据块(block)默认是128MB,小于一个块大小的文件不会占据整个块的空间(如1M大小的文件存储在128M的块中,文件只使用了1M的磁盘空间,而不是128M)。设置块的目的是为了最小化寻址开销。如果块足够大,从磁盘传输数据的时间会明显大于定位这个块开始位置所需的时间,所以传输一个由多个块组成的大文件的时间取决于磁盘传输速率。

HDFS集群包含一个NameNode和一些DataNode

NameNode

NameNode在整个HDFS中只部署一个实例,提供元数据服务,管理文件系统的命名空间,维护着每个文件名称到对应的文件分块的映射,以及每个文件分块对应的机器列表,如文件名,文件目录,文件属性,以及每个文件的块列表和块所在的DataNode。每个文件在NameNode都要建立一个索引,索引大小大约150byte,会消耗大量的内存,且map task的数量由spilts来决定,所以MapReduce处理大量的小文件时,会产生过多的map task,线程管理开销会增加作业时间,所以应该避免太多的小文件

小文件过多,一方面占用NameNode内存,一方面索引文件过大,索引速度变慢

其在FsImage文件中存储所有关于文件系统名称空间的信息,此文件和一个包含所有事务的记录文件(EditLog)存储在NameNode的本地文件系统上

整个HDFS可存储的文件数受限于NameNode的内存大小

作用:

  • 管理HDFS的名称空间
  • 配置副本策略
  • 管理数据块(Block)映射信息
  • 处理客户端读写请求

DataNode

DataNode部署在HDFS集群中其他所有服务器上,提供真正的数据存储服务,DataNode是在本地文件系统存储文件块数据,以及块数据的检验和,存储在HDFS中的文件被分成块,然后这些块被复制到多个DataNode中

作用:

  • 存储实际的数据块
  • 执行数据块的读写命令
  • 启动时会向NameNode报告当前存储的数据块信息,后续也会定时报告修改信息
  • DataNode之间会进行通信,复制数据块,保证数据的冗余性

Secondary NameNode

由于NameNode很重要,如果NameNode所在机器毁坏,文件系统上所有文件将会丢失,因为我们不知道如何根据DataNode的块重建文件,所以需要对NameNode进行容错,也就出现了Secondary NameNode。

Secondary NameNode用来监控HDFS状态的辅助后台程序,每隔一段时间获取HDFS元数据的快照。

当NameNode挂掉时,并不能马上替换NameNode并提供服务

作用:

  • 辅助NameNode,分担其工作量,如定期合并Fsimages和Edits,并推送给NameNode
  • 保存合并后的Fsimages副本
  • 在紧急情况下,可辅助恢复NameNode

Client

客户端

作用:

  • 进行文件切分,文件上传HDFS时,Client将文件切分成一个一个的Block,然后进行上传
  • 与NameNode进行交互,获取文件的位置信息
  • 与DataNode进行交互,读取或写入数据
  • Client提供命令来管理HDFS,以及通过一些命令来访问HDFS

配置文件的优先级: 客户端代码中设置Configuration > classpath下自定义的配置文件 > 集群中的配置文件

欢迎关注我的其它发布渠道