1,HDFS体系结构
··· HDFS是采用master/slaves即主从结构模型来管理数据的。这种模型主要由四部分组成,分别是Client、NameNode、DataNode、SecondaryNameNode。一个HDFS集群包括一个 NameNode(HA除外)和若干个 DataNode以及一个SecondaryNameNode。其中,NameNode是名称节点,负责管理HDFS的文件命名空间和处理client的请求。DataNode负责保存实际的数据,并负责管理客户端的读写请求,在NameNode的调度下进行数据的增删改查和复制;DataNode会定期向NameNode发送心跳包来汇报自己的存活信息和块的信息。用户在使用Client进行 I/O操作时,与使用普通文件系统一样,但是在HDFS内部,HDFS会将存入的文件进行分块并保存在若干个DataNode上。SecondaryNameNode负责帮助把NameNode上的edit文件合并到fsimage文件,再发送给NameNode,实现冷备份。
 
2,HDFS组件
··· NameNode
    · 管理系统的命名空间,并用fsimage和edit来保存。
    · 在内存中保存块的位置信息。
    · 实施副本冗余策略,以及处理客户端的请求。
··· DataNode
    · 保存实际的数据。
    · 提供数据的读写。
    · 心跳机制(3秒)。汇报自身信息和数据信息。
··· SecondaryNameNode
    · 帮助NameNode合并fsimage和edit文件。
    · 实现冷备份。
    · 检查点机制。
··· Client
    · 为用户访问HDFS提供接口。可以不属于HDFS集群。
    · 与NameNode交互,获取文件块的位置。
    · 与DataNode交互,读写数据。
    · 上传时分块,读取时分片。
 
3,HDFS工作机制
··· 心跳机制
    · DataNode通过心跳机制向NameNode汇报自身存活信息(3秒);启动时会汇报数据块信息,此后每隔一个小时汇报一次
    · NameNode通过心跳机制向DataNode发送指令。
    · NameNode启动后会开启一个IPC服务,等待DataNode节点连接。DataNode启动后就会主动连接。
    · 如果主节点长时间没有收到从节点发来的信息,就会认为从节点挂了。
    · 超时时间:2*recheck + 10*heartbeat;recheck默认是5分钟,heartbeat默认是30秒,所以超时时间为10分钟30秒。
··· 检查点机制
    · SecondaryNameNode负责合并fsimage和edit文件;减少edit文件大小,缩短启动时间,更快的推出安全模式。
    · 两个文件的合并周期,称之为检查点机制。
    · 在hdfs-site.xml中配置。默认1个小时合并一次;或者txid执行次数达到100万次,每1小时检查一次txid文件。

 
··· 机架感知
    · 在部署hadoop集群时,节点之间的距离会影响数据备份的速度。
    · 第一个副本在client所在的节点,如果client在集群外,则随机选一个。
    · 第二个副本与第一个副本在不同的机架,节点随机选一个。
    · 第三个副本与第二个副本在同一个机架,但是在不同的节点。
 
4,HDFS启动过程
··· NameNode启动时会将fsimage读入内存,然后执行editLog文件中的各项操作,使内存中的元数据保持最新。然后创建一个新的fsimage文件和一个空的editLog文件,此后的操作都写入新的editLog文件中。在这个过程中NameNode处于安全模式,只能对外提供读操作,不能进行写操作;启动结束后就可以进入正常状态,可读写。
··· 集群模式启动时会启动slaves文件中记录的主机中的DataNode进程。DataNode启动时会主动向NameNode发送自己保存的块的信息,此后每隔一个小时发送一次。
 
5,读数据流程
··· 1,client通过FileSystem对象的open方法来打开要读取的文件(编写的代码),对于HDFS来说,这个对象是DistributedFileSystem,他通过RPC调用NameNode,来确定文件起始块的位置。
··· 2,对于每一个块,NameNode会返回存有该块的DataNode的地址,并按照距离client的远近来排序。
··· 3,DistributedFileSystem是的实例会返回一个FSDataInputStream对象给client,以便读取数据;然后client就可以调用FSDataInputStream实例的read方法来获取数据。
··· 4,FSDataInputStream随即连接与第一个块距离最近的DataNode,通过反复调用read方法将数据从DataNode传输到client;当传输到块的末端时,FSDataInputStream关闭与DataNode的连接,并寻找下一个块的最佳DataNode。
··· 5,读取时是按块读取的,当client读取完成时就会调用FSDataInputStream的close方法。
··· 6,如果读取的过程中出现错误,数据损坏,则会到其他DataNode副本上读取数据,并将损坏的DataNode汇报给NameNode。

 
6,写数据流程
··· 1,client通过FileSystem对象的create方法来创建一个新文件;对于hdfs系统,DistributedFileSystem对NameNodeRPC创建一个RPC调用,在文件系统的命名空间中新建一个文件,此时该文件中还没有相应的数据块。
··· 2,NameNode执行各种不同的检查,以确保这个文件不存在,以及客户端有创建文件的权限。如果检查失败则向客户端抛出一个IOException;如果成功,则DistributedFileSystem向客户端返回一个FSDataOutputStream对象,于是客户端就可以开始写数据了。
··· 3,客户端在写入数时,FSOutputStream将它分成一个个数据包(packet),并写入内部的 数据队列(data queue)。DataStreamer线程负责处理数据队列,向NameNode请求上传一个block(0~128M),NameNode这时会为这个文件分配一个数据块,并返回给客户端一组DataNode。
··· 4,以默认3个副本为例,这三个DataNode会构成一个管道;DataStreamer将数据流式传输到管道中的第一个DataNode的内存中,这个DataNode在把数据包写入到本地磁盘的同时,会将这个数据包发送到第二个DataNode;同样,第二个DataNode也会发送给第三个DataNode。DateStreamer在将一个个packet流式传输到第一个DataNode后,还会将此packet移动到 确认队列(ack queue)中。DataNode写入数据成功后,会向ResponseProcessor线程发送一个成功的信息回执,当收到所有DataNode的确认信息后,ResponseProcessor线程会将该数据包从确认队列中删除。
··· 5,如果任何DataNode在写入数据时发生故障。首先会关闭管道,然后把确认队列中的所有数据移动到数据队列中的最前端,以确保故障节点下游DataNode的不会漏掉 任何一个数据包;为一个正常的DataNode的当前数据块创建一个标识,并把该标识传给NameNode,以便故障DataNode在恢复后可以删除保存的部分数据块;删除故障的DataNode,正常的两个DataNode构成新的管道,并把余下的数据写入新的管道中;NameNode发现副本不足,会在一个新的DataNode上创建副本。
 
 

 
7,DataStreamer线程与Packet
··· 1,client会写数据到流内部的一个缓冲区中,然后数据被分成多个packet,每个packet的大小是64k字节;而每个packet又由一组chunk和这组chunk对应得checksum组成,每个chunk大小为512字节,而checksum是对chunk计算的校验和。
··· 2,当client写入的流数据达到一个packet的长度时,这个packet就会被构建出来,然后放入dataQueue队列中;然后DataStreamer会不断的从dataQueue队列中取出packet,发送到DataNode管道中的第一个DataNode,并将该packet从dataQueue队列移动到ackQueue队列。
··· 创建packet:client写数据时,当长度满足一个chunk大小(512B)时,便会创建一个packet对象,然后向packet对象中写checksum和实际数据;每满足一个chunk时就会向packet对象中写入上诉信息;直到    达到一个packet大小(64KB),就会将该packet放入dataQueue队列中,等待DataStreamer线程取出。
 

 
 
注意事项
    · client(客户端)就是我们写代码所在的机器,可以不属于HDFS集群。
    · HDFS中的分块是实际的物理分块,而MapReduce中的分片是逻辑分片。
    · hdfs中不适合存储小文件,因为一个块的元数据大约为150字节,1亿个块无论大小都会占用20G左右的内存。
    · 由于fsimage的访问承受能力有限,所以先把修改操作保存到edit文件,再在空闲时合并到fsimage。
    · hdfs的安全模式相当于维护模式,不允许添加和修改hdfs上的文件。默认是关闭的可以通过hdfs dfsadmin -safemode          enter打开(enter | leave | get | wait)。
    · NameNode的fsimage不会保存块在哪个DataNode,即NameNode不会在磁盘中保存块的位置信息,而是在每次启            动时由DataNode汇报块的信息,然后NameNode将这些信息保存在内存中。

3,HDFS原理的更多相关文章

  1. HDFS原理介绍

    HDFS(Hadoop Distributed File System )Hadoop分布式文件系统.是根据google发表的论文翻版的.论文为GFS(Google File System)Googl ...

  2. HDFS 原理、架构与特性介绍--转载

    原文地址:http://www.uml.org.cn/sjjm/201309044.asp 本文主要讲述 HDFS原理-架构.副本机制.HDFS负载均衡.机架感知.健壮性.文件删除恢复机制 1:当前H ...

  3. Hadoop之HDFS原理及文件上传下载源码分析(上)

    HDFS原理 首先说明下,hadoop的各种搭建方式不再介绍,相信各位玩hadoop的同学随便都能搭出来. 楼主的环境: 操作系统:Ubuntu 15.10 hadoop版本:2.7.3 HA:否(随 ...

  4. Hadoop之HDFS原理及文件上传下载源码分析(下)

    上篇Hadoop之HDFS原理及文件上传下载源码分析(上)楼主主要介绍了hdfs原理及FileSystem的初始化源码解析, Client如何与NameNode建立RPC通信.本篇将继续介绍hdfs文 ...

  5. 【Hadoop】HDFS原理、元数据管理

    1.HDFS原理 2.元数据管理原理

  6. HDFS 原理、架构与特性介绍

    本文主要讲述 HDFS原理-架构.副本机制.HDFS负载均衡.机架感知.健壮性.文件删除恢复机制 1:当前HDFS架构详尽分析  HDFS架构  •NameNode  •DataNode  •Senc ...

  7. HDFS原理及操作

    1 环境说明 部署节点操作系统为CentOS,防火墙和SElinux禁用,创建了一个shiyanlou用户并在系统根目录下创建/app目录,用于存放 Hadoop等组件运行包.因为该目录用于安装had ...

  8. hadoop学习之HDFS原理

    HDFS原理 HDFS包括三个组件: NameNode.DataNode.SecondaryNameNode NameNode的作用是存储元数据(文件名.创建时间.大小.权限.与block块映射关系等 ...

  9. 读Hadoop3.2源码,深入了解java调用HDFS的常用操作和HDFS原理

    本文将通过一个演示工程来快速上手java调用HDFS的常见操作.接下来以创建文件为例,通过阅读HDFS的源码,一步步展开HDFS相关原理.理论知识的说明. 说明:本文档基于最新版本Hadoop3.2. ...

  10. 【转载】经典漫画讲解HDFS原理

    分布式文件系统比较出名的有HDFS  和 GFS,其中HDFS比较简单一点.本文是一篇描述非常简洁易懂的漫画形式讲解HDFS的原理.比一般PPT要通俗易懂很多.不难得的学习资料. 1.三个部分: 客户 ...

随机推荐

  1. 不止开源,不止跨平台。微软的 .NET Core 还有哪些强大之处值得我们学习?

    自从 2016 年微软发布了 .NET Core 1.0,至今 4 年的时间里,.NET Core 历经 7 个正式版本和几十个 Preview 版本..NET Core 作为最通用的框架,和其他软件 ...

  2. 18年第一弹射 和网络有关; 艾曲塞嗯诶系列篇 two

    35: 华为AR G3系列路由器可以通过FTP和TFTP更新系统文件,AR G3系列路由器可以作为FTP Client , FTP Server ,TFTP Client 36: 两台路由器间通过串口 ...

  3. 投入OJ的怀抱~~~~~~~~~~

    OpenJudge C20182024 信箱(1) 账号 修改设定 退出小组 管理员 frank 林舒 Dzx someone 李文新 公告 11-05 程序设计与算法(大学先修课) 成员(61910 ...

  4. NOI4.6 1455:An Easy Problem

    描述 As we known, data stored in the computers is in binary form. The problem we discuss now is about ...

  5. Linux 系统常用管理命令(精简笔记)

    Linux是一套免费使用和自由传播的类Unix操作系统,下面的笔记是我从鸟菜中摘抄出来的重要命令,并进行了一定的排版,摒弃了一些用不到的乱七八糟的命令,目的是在生产环境中能够快速的定位并查询需要命令的 ...

  6. iOS开发tip-图片方向

    概述 相信稍微接触过iOS图片相关操作的同学都遇到过图片旋转的问题,另外使用AVFoundation进行拍照的话就会遇到前后摄像头切换mirror问题就让人更摸不着头脑了.今天就简单和大家聊一下iOS ...

  7. 几种常见的排序方法总结(Python)

    几种常见的排序算法总结(Python) 排序算法:是一种能将一串数据依照特定顺序进行排序的一种算法. 稳定性:稳定排序算法会让原本有相等键值的记录维持相对次序.也就是如果一个排序算法是稳定的,当有两个 ...

  8. mysql安装教程linux

    https://www.cnblogs.com/YangshengQuan/p/8431520.html 设置sql远程访问

  9. Future、Callback、Promise

    推荐下边两篇,写的很棒 https://juejin.im/post/5b126065e51d4506bd72b7cc https://www.cnkirito.moe/future-and-prom ...

  10. 吉哥系列故事——恨7不成妻(数位dp)

    吉哥系列故事--恨7不成妻 传送门 Problem Description 单身! 依然单身! 吉哥依然单身! DS级码农吉哥依然单身! 所以,他生平最恨情人节,不管是214还是77,他都讨厌! 吉哥 ...