• 大数据_HDFS原理


    目录

    一、什么是HDFS

    二、HDFS架构角色

    三、HDFS工作流程

    四、HDFS的优缺点


    一、什么是HDFS

    1、定义

    HDFS即Hadoop分布式文件系统(Hadoop Distributed Filesystem),以流式数据访问模式来存储超大文件,它和现有的分布式文件系统有很多共同点。但同时,它和其他的分布式文件系统的区别也是很明显的。HDFS是一个高度容错性的系统,适合部署在廉价的机器上。HDFS能提供高吞吐量的数据访问,非常适合大规模数据集上的应用。HDFS放宽了一部分POSIX约束,来实现流式读取文件系统数据的目的。HDFS在最开始是作为Apache Nutch搜索引擎项目的基础架构而开发的。

    2、特点

    ① 保存多个副本,且提供容错机制,副本丢失或宕机自动恢复。默认存 3 份。

    ② 运行在廉价的机器上。

    ③ 适合大数据的处理。多大?多小?HDFS 默认会将文件分割成 block,64M 为 1 个 block。然后将block按键值对存储在HDFS上,并将键值对的映射存到内存中(namenode)。 如果小文件太多,那内存的负担会很重。

    二、HDFS架构角色

    个HDFS集群包含一个单独的NameNode和多个DataNode。HDFS采用一种称为rack-aware的策略。Rack1、Rack2....

    NameNode是 Master 节点,是管理者。管理数据块映射;处理客户端的读写请求;配置副本策略;管理 HDFS 的名称空间;NameNode 保存的 metadata 包括文件 ownership 和 permission文件包含的 block 信息。Block 保存在那些 DataNode 节点上(数据并非保存在 NameNode 磁 盘上的,它是在 DataNode 启动时上报给 NameNode 的,NameNode 接收到之后 将这些信息保存在内存中)NameNode 的 metadata 信息在 NameNode 启动后加载到内存中,Metadata 存储到磁盘上的文件名称为 fsimage,Block 的位置信息不会保存在 fsimage 中,Edits 文件记录了客户端操作 fsimage 的日志,对文件的增删改等。用户对 fsimage 的操作不会直接更新到 fsimage 中去,而是记录在 edits 中。

    SecondaryNameNode分担 namenode 的工作量;是 NameNode 的冷备份;合并 fsimage 和 fsedits 然后再发给 namenode。

         合并fsimage和fsedits文件,然后发送并替换NameNode的fsimage文件, 同时自己留下一个副本。这个副本可供 NameNode 毁灭之后的部分文件恢复。

    1. 可以通过配置 fs.checkpoint.period 修改合并间隔时间,默认 1 小时
    1. 也可以通过配置 edits 日志文件的大小,fs.checkpoint.size 规定 edits 文 件的最大值,来让 SecondaryNameNode 来知道什么时候该进行合并操作了。 默认是 64M

    DataNodeSlave 节点,奴隶,干活的。负责存储 client 发来的数据块 block;执行数据 块的读写操作。

    热备份:b 是 a 的热备份,如果 a 坏掉。那么 b 马上运行代替 a 的工作。

    冷备份:b 是 a 的冷备份,如果 a 坏掉。那么 b 不能马上代替 a 工作。但是 b 上存储 a 的 一些信息,减少 a 坏掉之后的损失。

    fsimage:元数据镜像文件(文件系统的目录树。)

    edits:元数据的操作日志(针对文件系统做的修改操作记录)

    namenode 内存中存储的是=fsimage+edits。

    SecondaryNameNode 负责定时默认 1 小时,从 namenode 上,获取 fsimage 和 edits 来 进行合并,然后再发送给 namenode。减少 namenode 的工作量。

    三、HDFS工作流程

    备份数据的存放:备份数据的存放是HDFS可靠性和性能的关键。HDFS采用一种称为rack-aware的策略来决定备份数据的存放。通过一个称为Rack Awareness的过程,NameNode决定每个DataNode所属rack id。缺省情况下,一个block块会有三个备份,一个在NameNode指定的DataNode上,一个在指定DataNode非同一rack的DataNode上,一个在指定DataNode同一rack的DataNode上。这种策略综合考虑了同一rack失效、以及不同rack之间数据复制性能问题。

    示例写入流程:

    1. 将 64M 的 block1 按 64k 的 package 划分;
    2. 然后将第一个 package 发送给 host2;
    3. host2 接收完后,将第一个 package 发送给 host1,同时 client 想 host2 发送第 二个 package;
    4. host1 接收完第一个 package 后,发送给 host3,同时接收 host2 发来的第二个 package。
    5. 以此类推,如图红线实线所示,直到将 block1 发送完毕。
    6. host2,host1,host3向NameNode,host2向Client发送通知,说“消息发送完了”。 如图粉红颜色实线所示。
    7. client 收到 host2 发来的消息后,向 namenode 发送消息,说我写完了。这样就 真完成了。如图黄色粗实线
    8. 发送完 block1 后,再向 host7,host8,host4 发送 block2,如图蓝色实线所示。
    9. 发送完 block2 后,host7,host8,host4 向 NameNode,host7 向 Client 发送通 知,如图浅绿色实线所示。
    10. client 向 NameNode 发送消息,说我写完了,如图黄色粗实线。。。这样就完 毕了。

    分析,通过写过程,我们可以了解到:

    ①写 1T 文件,我们需要 3T 的存储,3T 的网络流量带宽。

    ②在执行读或写的过程中,NameNode 和 DataNode 通过 HeartBeat 进行保存通信, 确定 DataNode 活着。如果发现 DataNode 死掉了,就将死掉的 DataNode 上的数据,放 到其他节点去。读取时,要读其他节点去。

    ③挂掉一个节点,没关系,还有其他节点可以备份;甚至,挂掉某一个机架,也没关系; 其他机架上,也有备份。

    副本的选择:为了降低整体的带宽消耗和读取延时,HDFS会尽量读取最近的副本。如果在同一个rack上有一个副本,那么就读该副本。如果一个HDFS集群跨越多个数据中心,那么将首先尝试读本地数据中心的副本。安全模式:系统启动后先进入安全模式,此时系统中的内容不允许修改和删除,直到安全模式结束。安全模式主要是为了启动检查各个DataNode上数据块的安全性

    示例读流程:

    读操作就简单一些了,如图所示,client 要从 datanode 上,读取 FileA。而 FileA 由 block1 和 block2 组成。那么,读操作流程为:

    a. client 向 namenode 发送读请求。

    b. namenode 查看 Metadata 信息,返回 fileA 的 block 的位置。

    block1:host2,host1,host3

    block2:host7,host8,host4

    c. block 的位置是有先后顺序的,先读 block1,再读 block2。而且 block1 去 host2 上读取; 然后 block2,去 host7 上读取;这个例子中,client 位于机架外,那么如果 client 位于机架内某个 DataNode 上,例如,client 是 host6。那么读取的时候,遵循的规律是:优先读取本机架上的数据。

    四、HDFS的优缺点

    1HDFS 优点

    高容错性

    数据自动保存多个副本

    副本丢失后,自动回复

    适合批处理

    移动的计算和操作

    数据位置暴漏给计算框架

    适合大数据处理

    GB、TB、PB 甚至更大

    百万规模以上的文件数量

    10K+节点

    可构建在廉价的机器上

    通过副本提高可靠性

    提供了容错和恢复机制

    低延迟数据访问

    毫秒级读取

    低延迟与高吞吐量

    2HDFS 缺点

    小文件存取

    占用 NameNode 内存空间

    寻址时间超过读取时间

    并发写入、文件随即修改

    一个文件同时只能由一个写入者

    仅支持 append

  • 相关阅读:
    地理信息系统的发展趋势——网格GIS
    vhost dpdk 共享内存
    web前端-javascript-逻辑运算符(! 非取反,短路的&& 与,短路的|| 或,&& || 非布尔值的情况,对于非布尔值进行与或运算时,会先将其转换为布尔值,然后再运算,并且返回)
    程序员该如何理解javascript的单线程?
    南京市玄武区委常委、组织部部长任宁一行率企业家研修班莅临麒麟信安调研交流
    Docker自定义镜像
    吴恩达机器学习笔记:第 8 周-13 聚类(Clustering)13.1-13.2
    欧科云链OKLink受邀为恒生银行带来反洗钱实践分享
    Coredump-X: 遇到一例单例模式,lazy-mode;多线程
    第一个ARM程序裸板点灯
  • 原文地址:https://blog.csdn.net/wanghaiping1993/article/details/127138478