简介

一句话(官方):分布式存储系统HDFS( Hadoop Distributed File System)。 其实就是一个文件系统,类似于linux的文件系统。有目录,目录下可以存 储文件。但它又是一个分布式的文件系统。

基本原理

  1. 将文件切分成等大的数据块,分别存储到多台机器上。
  2. 每个数据块存在多个备份。 将数据切分、容错、负载均衡等功能透明化。
  3. 可将HDFS看成是一个巨大、具有容错性的磁盘。

优点

  1. 处理超大文件。
  2. 流式的访问数据。
  3. 运行于廉价的商用机器集群上 。

缺点

  1. 不适合存储大量小文件。
  2. 不适合低延迟数据访问 。
  3. 不支持多用户写入及任意修改文件 。

HDFS实现原理

数据块

  1. 每个磁盘都有默认的数据块大小,这是磁盘进行数据读/写的最小单位。构建于单个磁盘之 上的文件系统通过磁盘块来管理该文件系统中的块,该文件系统块的大小可以是磁盘块的整数倍。
  2. HDFS 同样也有块 (block) 的概念,但是大得多,默认为 128 MB 。与单一磁盘上的文件系统相似, HDFS 上的文件也被划分为块大小的多个分块 (chunk) ,作为独立的存储单元。但与其他 文件系统不同的是, HDFS 中小于一个块大小的文件不会占据整个块的空间。
优点
  1. 一个大文件不用存储于整块磁盘上,可以分布式存储。

  2. 使用块抽象而非整个文件作为存储单元,大大简化了存储子系统的设计。这对于故障种类繁 多的分布式系统尤为重要。

  3. 与磁盘管理相似,HDFS提供了fsck命令可以显示块信息。

    hdfs fsck / -files -blocks
    

NameNode

NameNode是HDFS架构中的主节点。 功能

  1. 管理各个从节点的状态(DataNode)。
  2. 记录存储在HDFS上的所有数据的元数据信息。例如:block存储的位置,文件大小,文件权限,文件层级等等。这些信息以两个文件形式永久保存在本地磁盘上。
    1. 命名空间镜像文件(FsImage): fsimage是HDFS文件系统存于硬盘中的元数据检查点,里面记录 了自最后一次检查点之前HDFS文件系统中所有目录和文件的序列化信息
    2. 编辑日志(edit-logs)文件:保存了自最后一次检查点之后所有针对HDFS文件系统的操作,比如: 增加文件、重命名文件、删除目录等等。
  3. 记录了存储在HDFS上文件的所有变化,例如文件被删除,namenode会记录到editlog中。
  4. 接受DataNode的心跳和各个datanode上的block报告信息,确保DataNode是否存活。
  5. 负责处理所有块的复制因子。
  6. 如果DataNode节点宕机,NameNode会选择另外一个DataNode均衡复制因子,并做负载均衡。

Sencondary NameNode

SNameNode是NameNode的助手,不要将其理解成是NameNode的备份。Secondary NameNode 的整个目的在HDFS中提供一个Checkpoint Node,所以也被叫做checkpoint node。

功能
  1. 定时的从NameNode获取EditLogs,并更新到FsImage上。

  2. 一旦它有新的fsimage文件,它将其拷贝回NameNode上,NameNode在下次重启时会使用这个新的fsimage文件,从而减少重启的时间。

  3. 关于NameNode是什么时候将改动 写到edit logs中的?

    这个操作实际上是由 DataNode的写操作触发的,当我们往 DataNode写文件时,DataNode会跟 NameNode通信,告诉NameNode什么文 件的第几个block放在它那里,NameNode 这个时候会将这些元数据信息写到edit logs文件中。

DataNode

DataNode是HDFS架构的从节点,管理各自节点的Block信息。

功能
  1. 多个数据实际是存储到DataNode上面。
  2. DataNode分别运行在独立的节点上。
  3. DataNode执行客户端级别的读写请求。
  4. 向NameNode发送心跳(默认是3s),报告各自节点的健康状况。

复制因子

HDFS为我们提供了可靠的存储,就是因为这个复制因子。默认复制因子是3。

复制因子是每个block备份的数目,nameNode保证每个block在集群中有复制因子数目的备份,不多也不少。每个block的备份分在不同的dataNode中。

机架感知

机架内的机器之间的网络速度通常都会高于跨机架机 器之间的网络速度,并且机架之间机器的网络通信通常受到上层交换机间网络带宽的限制。所以会在同机架之间传输和备份

HDFS读写流程-写数据

  1. client将数据分片

  2. client请求namenode,要将多个块写入到HDFS。例如这里的Block A和Block B。

  3. NameNode会给client赋予写权限,并为client提供可以写入数据的DataNode的IP地址。Namenode在选

    择可写入数据的dataNode的规则是结合了DN的健康状态、复制因子、机架感知等因素随机选择的DN。

    假如复制因子是3(默认值),那么会为每个block返回三个IP地址。例如NN为client提供了以下的IP地

    址列表。

  4. 在写入数据之前,client首先 要确认namenode提供的ip列表 是否准备好了接收数据。Client通过连接各个块的ip列表来为 每个块创建流水线。(传递的方式)

  5. 流水线建立好以后,client将 会向流水线中写入数据(block 是并行写入的)。Client只会将block A向 DN1复制。其他节点复制是在DN 之间完成的。

  6. 当数据复制到所有的DN完成之 后,按照ip地址列表相反的方 向,依次反馈写入成功的信息。

  7. DN1将确认信息反馈给client,client再将确认信息反馈给NN, NN更新元数据信息,client关 闭pipline。

HDFS读写流程-文件读取

  1. Client请求namenode要读取exaple. txt文件。
  2. NN根据自己的元数据信息,反馈给 client一个DataNode的列表(存储B lock A和B)。
  3. Client连接DN,读取BlockA,Block B的数据。
  4. Client合并block A和Block B的数 据。

HDFS balancer

集群磁盘数据不均衡导致的原因有很多情况。

  1. 添加新的DataNode节点。

  2. 人为干预,修改block副本数。

  3. 各个机器磁盘大小不一致。

  4. 长时间运行大量的delete操作等。

    为什么delete会导致不平衡?

HDFS快照

  1. 是一个只读的基于时间点文件系统拷贝。快照可以是整个文件系统的也可以是一部分。常用来作为数据备 份,防止用户错误和容灾。
  2. 在datanode 上面的blocks 不会复制,做Snapshot 的文件是纪录了block的列表和文件的大小,但是没有数据的复制 Snapshot 并不会影响HDFS 的正常操作:
  3. 修改会按照时间的反序记录,这样可以直接读取到最新的数据。
  4. 快照数据是 当前数据减去修改的部分计算出来的。
  5. 快照会存储在snapshottable的目录下。snapshottable下存储的snapshots 最多为65535个。没有限制snapshottable目录 的数量。管理员可以设置任何的目录成为snapshottable。如果snapshottable里面存着快照,那么文件夹不能删除或者 改名。

Hadoop 配额设置

什么是配额

Hadoop 分布式文件系统(HDFS)允许管理员为每个目录设置配额。新建立的目录没有配额。最 大的配额是 Long.Max_Value。配额为 1 可以强制目录保持为空。

目录配额是对目录树上该目录下的名字数量做硬性限制。如果创建文件或目录时超过了配额, 该操作会失败。重命名不会改变该目录的配额;如果重命名操作会导致违反配额限制,该操作 将会失败。如果尝试设置一个配额而现有文件数量已经超出了这个新配额,则设置失败。

所有超出配额的操作都会失败

配额和 fsimage 保持一致。当启动时,如果 fsimage 违反了某个配额限制(也许 fsimage 被偷 偷改变了),则启动失败并生成错误报告。设置或删除一个配额会创建相应的日志记录。

设置配额有什么用

在多人共用 HDFS 的环境下,配额设置非常重要。特别是在 Hadoop 处理大量资料 的环境,如果没有配额管理,很容易把所有的空间用完造成别人无法存取。Hdfs 的配额设定是针对目标而不是针对账号,所有在管理上最好让每个账号仅操作某一 个目录,然后对目录设置配置。

配额种类

  1. Name Quotas:设置某一个目录下文件总数

    从文件数目上限制

  2. Space Quotas:设置某一个目录下可使用空间大小

    从空间上限制

    注意:这里需要特别注意的是“Space Quota”的设置所看的不是 Hdfs 的文件大小,而是写入 Hdfs 所有 block 块的大小。包含备份的部分,而且不足一个块也要按照一个块计算

hdfs 的配额管理是跟着目录走,如果目录被重命名,配额依然有效。 麻烦的是,在设置完配额以后,如果超过限制,虽然文件不会写入到 hdfs,但是文件名依然会存在,只是文件 size 为 0。当加大配额设置后,还需要将之前的空文件删除才能进一步写入。如果新设置的 quota 值,小于该目录现有的 Name Quotas 及 Space Quotas,系统并不会给 出错误提示,但是该目录的配置会变成最新设置的 quota。

怎么设置

  1. 启用设定:hadoop dfsadmin -setQuota 10000 /user/seamon

    清除設定: hadoop dfsadmin -clrQuota /user/seamon

  2. 可以使用m,g,t 代表 MB,GB,TB
    启用设定: hadoop dfsadmin -setSpaceQuota 1g /user/seamon/ 清除設定: hadoop dfsadmin -clrSpaceQuota /user/seamon

Logo

更多推荐