本文详细讲解作为 HBase 底层存储的分布式文件系统 HDFS 的原理。

HDFS ( Hadoop Distributed File System)即 Hadoop 分布式文件系统,它的设计目标是把超大数据集存储到集群中的多台普通商用计算机上,并提供高可靠性和高吞吐量的服务。

HDFS 是参考 Google 公司的 GFS 实现的,不管是 Google 公司的计算平台还是 Hadoop 计算平台,都是运行在大量普通商用计算机上的,这些计算机节点很容易出现硬件故障,而这两种计算平台都将硬件故障作为常态,通过软件设计来保证系统的可靠性。

例如,HDFS 的数据是分块地存储在每个节点上,当某个节点出现 故障时,HDFS 相关组件能快速检测节点故障并提供容错机制完成数据的自动恢复。

HDFS 的基本架构

HDFS 主要由 3 个组件构成,分别是 NameNode、SecondaryNameNode 和 DataNode。

HDFS 是以 Master/Slave 模式运行的,其中,NameNode 和 SecondaryNameNode 运行在 Master 节点 上,而 DataNode 运行在 Slave 节点上,所以 HDFS 集群一般由一个 NameNode、一个 SecondaryNameNode 和许多 DataNode 组成,其架构如下图所示。

在 HDFS 中,文件是被分成块来进行存储的,一个文件可以包含许多个块,每个块存储在不同的 DataNode 中。从上图中可知,当一个客户端请求读取一个文件时,它需要先从 NameNode 中获取文件的元数据信息,然后从对应的数据节点上并行地读取数据块。

下面介绍 HDFS 架构中 NameNode、SecondaryNameNode 和 DataNode 的功能。

NameNode

NameNode 是主服务器,负责管理文件系统的命名空间以及客户端对文件的访问。当客户端请求数据时,仅仅从 NameNode 中获取文件的元数据信息,具体的数据传输不经过 NameNode,而是直接与具体的 DataNode 进行交互。

这里文件的元数据信息记录了文件系统中的文件名和目录名,以及它们之间的层级关系,同时也记录了每个文件目录的所有者及其权限,甚至还记录每个文件由哪些块组成,这些元数据信息记录在文件 fsimage 中,当系统初次启动时,NameNode 将读取 fsimage 中的信息并保存到内存中。

这些块的位置信息是由 NameNode 启动后从每个 DataNode 获取并保存在内存当中的,这样既减少了 NameNode 的启动时间,又减少了读取数据的查询时间,提高了整个系统的效率。

SecondaryNameNode

从字面上来看,SecondaryNameNode 很容易被当作是 NameNode 的备份节点,其实不然。可以通过下图看 HDFS 中 SecondaryNameNode 的作用。

NameNode 管理着元数据信息,元数据信息会定期保存到 edits 和 fsimage 文件中。其中的 edits 保存操作日志信息,在 HDFS 运行期间,新的操作日志不会立即与 fsimage 进行合并,也不会存到 NameNode 的内存中,而是会先写到 edits 中。

当 edits 文件达到一定域值或间隔一段时间后触发 SecondaryNameNode 进行工作,这个时间点称为 checkpoint。

SecondaryNameNode 的角色就是定期地合并 edits 和 fsimage 文件,其合并步骤如下。

  1. 在进行合并之前,SecondaryNameNode 会通知 NameNode 停用当前的 editlog 文件, NameNode 会将新记录写入新的 editlog.new 文件中。
  2. SecondaryNameNode 从 NameNode 请求并复制 fsimage 和 edits 文件。
  3. SecondaryNameNode 把 fsimage 和 edits 文件合并成新的 fsimage 文件,并命名为 fsimage.ckpto
  4. NameNode 从 SecondaryNameNode 获取 fsimage.ckpt,并替换掉 fsimage,同时用 edits.new 文件替换旧的 edits 文件。
  5. 更新 checkpoint 的时间。

最终 fsimage 保存的是上一个 checkpoint 的元数据信息,而 edits 保存的是从上个 checkpoint 开始发生的 HDFS 元数据改变的信息。

DataNode

DataNode 是 HDFS 中的工作节点,也是从服务器,它负责存储数据块,也负责为客户端提供数据块的读写服务,同时也响应 NameNode 的相关指令,如完成数据块的复制、删除等。

另外, DataNode 会定期发送心跳信息给 NameNode,告知 NameNode 当前节点存储的文件块信息。当客户端给 NameNode 发送读写请求时,NameNode 告知客户端每个数据块所在的 DataNode 信息,然后客户端直接与 DataNode 进行通信,减少 NameNode 的系统开销。

当 DataNode 在执行块存储操作时,DataNode 还会与其他 DataNode 通信,复制这些块到其他 DataNode 上实现冗余。

HDFS 的分块机制和副本机制

在 HDFS 中,文件最终是以数据块的形式存储的,而副本机制极大程度上避免了宕机所造成的数据丢失,可以在数据读取时进行数据校验。

分块机制

HDFS 中数据块大小默认为 64MB,而一般磁盘块的大小为 512B,HDFS 块之所以这么大,是为了最小化寻址开销。

如果块足够大,从磁盘传输数据的时间会明显大于寻找块的地址的时间,因此,传输一个由多个块组成的大文件的时间取决于磁盘传输速率。

随着新一代磁盘驱动器传输速率的提升,寻址开销会更少,在更多情况下 HDFS 使用更大的块。当然块的大小不是越大越好,因为 Hadoop 中一个 map 任务一次通常只处理一个块中的数据,如果块过大,会导致整体任务数量过小,降低作业处理的速度。

HDFS 按块存储还有如下好处。

1) 文件可以任意大,不会受到单个节点的磁盘容量的限制。理论上讲,HDFS 的存储容量是无限的。

2) 简化文件子系统的设计。将系统的处理对象设置为块,可以简化存储管理,因为块大小固定,所以每个文件分成多少个块,每个 DataNode 能存多少个块,都很容易计算。同时系统中 NameNode 只负责管理文件的元数据,DataNode 只负责数据存储,分工明确,提高了系统的效率。

3) 有利于提高系统的可用性。HDFS 通过数据备份来提供数据的容错能力和高可用性,而按照块的存储方式非常适合数据备份。同时块以副本方式存在多个 DataNode 中,有利于负载均衡,当某个节点处于繁忙状态时,客户端还可以从其他节点获取这个块的副本。

副本机制

HDFS 中数据块的副本数默认为 3,当然可以设置更多的副本数,这些副本分散存储在集群中,副本的分布位置直接影响 HDFS 的可靠性和性能。

一个大型的分布式文件系统都是需要跨多个机架的,如下图中,HDFS 涉及两个机架。

如果把所有副本都存放在不同的机架上,可以防止机架故障从而导致数据块不可用,同时在多个客户端访问文件系统时很容易实现负载均衡。如果是写数据,各个数据块需要同步到不同机架上,会影响写数据的效率。

在 HDFS 默认 3 个副本情况下,会把第一个副本放到机架的一个节点上,第二副本放在同一 个机架的另一个节点上,第三个副本放在不同的机架上。

这种策略减少了跨机架副本的个数,提高了数据块的写性能,也可以保证在一个机架出现故障时,仍然能正常运转。

HDFS 的读写机制

前面讲到,客户端读、写文件是与 NameNode 和 DataNode 通信的,下面详细介绍 HDFS 中读写文件的过程。

读文件

HDFS 通过 RPC 调用 NameNode 获取文件块的位置信息,并且对每个块返回所在的 DataNode 的地址信息,然后再从 DataNode 获取数据块的副本。

HDFS 读文件的过程如图所示。

操作步骤如下:

  1. 客户端发起文件读取的请求。
  2. NameNode 将文件对应的数据块信息及每个块的位置信息,包括每个块的所有副本的位置信息(即每个副本所在的 DataNode 的地址信息)都传送给客户端。
  3. 客户端收到数据块信息后,直接和数据块所在的 DataNode 通信,并行地读取数据块。

在客户端获得 NameNode 关于每个数据块的信息后,客户端会根据网络拓扑选择与它最近的 DataNode 来读取每个数据块。当与 DataNode 通信失败时,它会选取另一个较近的 DataNode,同时会对出故障的 DataNode 做标记,避免与它重复通信,并发送 NameNode 故障节点的信息。

写文件

当客户端发送写文件请求时,NameNode 负责通知 DataNode 创建文件,在创建之前会检查客户端是否有允许写入数据的权限。通过检测后,NameNode 会向 edits 文件写入一条创建文件的操作记录。

HDFS 中写文件的过程如图所示。

操作步骤如下:
1) 客户端在向 NameNode 发送写请求之前,先将数据写入本地的临时文件中。

2) 待临时文件块达到系统设置的块大小时,开始向 NameNode 请求写文件。

3) NameNode 在此步骤中会检查集群中每个 DataNode 状态信息,获取空闲的节点,并在检查客户端权限后创建文件,返回客户端一个数据块及其对应 DataNode 的地址列表。列表中包含副本存放的地址。

4) 客户端在获取 DataNode 相关信息后,将临时文件中的数据块写入列表中的第一个 DataNode,同时第一个 DataNode 会将数据以副本的形式传送至第二个 DataNode,第二个节点也会将数据传送至第三个 DataNode。

DataNode 以数据包的形式从客户端接收数据,并以流水线的形式写入和备份到所有的 DataNode 中,每个 DataNode 收到数据后会向前一个节点发送确认信息。 最终数据传输完毕,第一个 DataNode 会向客户端发送确认信息。

5) 当客户端收到每个 DataNode 的确认信息时,表示数据块已经持久化地存储在所有 DataNode 当中,接着客户端会向 NameNode 发送确认信息。如果在第(4 )步中任何一个 DataNode 失败,客户端会告知 NameNode,将数据备份到新的 DataNode 中。

怎么设置某个用户生成hdfs文件的权限_HDFS简明入门教程相关推荐

  1. 服务器上reportqueue文件夹,Reportqueue文件夹有什么用?如何设置电脑不生成Reportqueue文件...

    ‍ 电脑系统在运行的过程中如果出现一些问题后,会默认生成系统日志报告,而这些日志文件就保存在系统中的Reportqueue文件夹.有部分用户希望能够关闭这个功能,节省这部分系统文件占用的系统空间.可按 ...

  2. 用户身份与文件的权限(普通权限、特殊权限、隐藏权限和文件控制列表ACL)

    用户身份 root用户是存在于所有类UNIX操作系统中的超级用户,它拥有最高的系统所有权.root用户的用户身份号码UID为0,UID相当于用户的身份证号码一样,具有唯一性.管理员用户(超级用户)UI ...

  3. oracle查询用户的概要文件,Oracle用户、概要文件、权限及角色实例

    用户.概要文件.权限及角色实例 1.创建角色change SQL> create role  change identified by zhubajie; Role created SQL> ...

  4. linux中,项目生成的文件的权限为-rw-r-----

    前言 centos7.6 tomcat8.5 springboot 2.0.3.RELEASE 项目生成的文件的权限为-rw-r----- 项目中有个定时器,负责每分钟静态化一次首页,即每分钟生成一次 ...

  5. IAR建立CC2530工程的设置问题及生成.hex文件

    这篇是转载过来的,其实设置都差不多: 利用IAR建完一个工程后,进行设置如下:这里以CC2430为例子,CC2530设置也差不多. 选择 Project 菜单下的Options 配置与 CC2430 ...

  6. Linux用户和HDFS和Hive权限关系

    1.Linux用户组和用户新建    1)用户组      新建:$groupadd hphs      删除命令:groupdel;      属性修改:groupmod;    2)用户:     ...

  7. linux用户没有创建文件的权限设置密码,Linux学习第五章用户身份与文件权限

    一.用户身份与能力 Linux系统中一共有三种用户 第一种:管理员  root  UID =0 第二种:系统用户 不需要登录系统  负责单一服务的运行  UID = 0-1000 第三种:普通用户 日 ...

  8. 使用Gerber文件生成CNC文件。亚克力,PCB切割教程

    前言 雕刻机通常可以定义为三轴数控铣床,它的通用性其实是几种机床中比较优秀的 有时候我们会决定使用自己的雕刻机来雕刻电路板或者外壳,虽然请别人代工是一个好主意,不过自己的机器制作也同样有趣 如果导出生 ...

  9. linux给普通用户赋予scp权限,关于linux新建用户并赋予文件夹权限和scp权限的问题...

    当前用户是aaa,新建用户bbb: $adduser bbb 赋予sudo权限(即把用户bbb添加到sudo组): $usermod -a -G sudo bbb 切换到bbb: $su - bbb ...

最新文章

  1. 数据结构实验指导书(朱素英)
  2. linux下syscall函数,SYS_gettid,SYS_tgkill
  3. python代码编码成jni_python 设置文件编码格式的实现方法
  4. 释放囚犯(洛谷-P1622)
  5. 收藏:PCWorld:火狐浏览器已宣告死亡
  6. Android 系统(169)---Android 7.0 插卡后APN信息的加载流程
  7. css实现居中的各种方法
  8. 【工业控制】基于matlab多变量动态矩阵预测控制(DMC)【含Matlab源码 1499期】
  9. SAS-配对设计资料秩和检验
  10. 用Python写个「倒计时」软件
  11. 信息技术外包:中小企业信息化之道
  12. Bootstrap全部知识点总结
  13. Git工作模式_繁星漫天_新浪博客
  14. linux php环境搭建教程,linux php环境搭建教程
  15. 蓝牙(BLE)传输数据的吞吐量
  16. Python人工智能
  17. 模拟CMOS集成电路设计入门学习(0)
  18. 暗影精灵dns服务器未响应,惠普WASD暗影精灵实战中土世界暗影魔多
  19. 华为、联想等名企笔试题总汇
  20. [C++]-Windows下获取CPU、内存利用率

热门文章

  1. LeetCode_每日一题今日份_剑指Offer11.旋转数组的最小数字
  2. 全闪存阵列的“五十度黑”
  3. 如何给网红变现?Instagram正在尝试一种全新的方式
  4. Linux 网卡信息查看
  5. Java异常处理终结篇——如何进行Java异常处理设计
  6. [ROBOT] python library 如何能获取到ROBOT框架里面的全局变量,例如${OUTPUT DIR}等
  7. 【More Effective C#】Lambda表达式优化
  8. 1-Dimensional Heightfield Visibility Query
  9. 网站down掉后,自动发信的shell
  10. java 乘法 位移_java 位移运算与乘法运算