HDFS架构简介

Hadoop特点

  • 扩容能力: 能可靠地存储和处理PB级的数据
  • 成本低: 可以通过普通机器组成的服务器集群来分发以及处理数据。这些服务器总计可以达到千个节点。
  • 高效率: 通过分发数据,Hadoop可以在数据所在节点上并行处理,速度非常快。
  • 可靠性: Hadoop能自动地维护数据的多份副本,并且在任务失败后重新自动部署计算任务

Hadoop 2.0时期的架构图

Hadoop的核心组件: HDFS(分布式文件系统)、MapReduce(分布式编程框架)、YARN(运算资源调度系统)


  • 整个Hadoop的体系结构主要是通过HDFS(Hadoop分布式文件系统)来实现对分布式存储的底层支持,并通过MR来实现对分布式并行任务处理的程序支持。
  • HDFS是Hadoop体系中数据存储管理的基础。它是一个高度容错的系统,能检测和应对硬件故障,用于在低成本的通用硬件上运行。

HDFS组成

  • HDFS采用主从(Master/Slave)结构模型,一个HDFS集群是由一个NameNode和若干个DataNode组成的。NameNode作为主服务器,管理文件系统命名空间和客户端对文件的访问操作。DataNode管理存储的数据。HDFS支持文件形式的数据。
  • 从内部来看,文件被分成若干个数据块,这若干个数据块存放在一组DataNode上。NameNode执行文件系统的命名空间,如打开、关闭、重命名文件或目录等,也负责数据块到具体DataNode的映射。DataNode负责处理文件系统客户端的文件读写,并在NameNode的统一调度下进行数据库的创建、删除和复制工作。NameNode是所有HDFS元数据的管理者,用户数据永远不会经过NameNode。

HDFS特点

优点

  • 高容错: 数据自动保存多个副本、某一个副本丢失以后,它可以自动恢复
  • 批处理: 它是通过移动计算而不是移动数据、它会把数据位置暴露给计算框架。
  • 规模大: 处理PB级数据、百万规模以上的文件数据量、高达10K的节点
  • 流式文件访问: 一次写入,多次读取,一旦写入不能修改,只能追加
  • 廉价: 计算机最廉价的就是硬盘

缺点

  • 低延时访问不行,无法做到毫秒级的读写
  • 小文件存储不合适,存储大量小文件(小文件指小于HDFS系统的Block大小的文件:默认64M)的话,它会占用 NameNode大量的内存来存储文件、目录和块信息。这样是不可取的,因为NameNode的内存总是有限的。小文件存储的寻道时间也会超过读取时间,它违反了HDFS的设计目标。
  • 并发写入、文件随机修改不合适。一个文件只能有一个写,不允许多个线程同时写。仅支持数据 append(追加),不支持文件的随机修改。

HDFS组件

HDFS 采用Master/Slave的架构来存储数据,这种架构主要由四个部分组成,分别为HDFS Client、NameNode、DataNode和Secondary NameNode。

  • Client: 上传大文件时先自行切成Block、与NameNode交互获取元数据、与DataNode读取或者写入数据、通过命令管理和访问HDFS。
  • NameNode,它维护着HDFS文件系统中最重要的两个关系:
    ◇: 维护整个系统的文件目录树,以及文件的数据块索引,即每个文件对应的数据块列表。
    ◇: 数据块和数据节点的对应关系,即某一块数据块保存在哪些数据节点的信息。
  • DataNode: 也称slave节点,存储实际的数据、执行数据块的读写、汇报存储信息给NameNode。
  • Secondary NameNode: NameNode的冷备份。
    ◇: 定期合并 fsimage和fsedits,并推送给NameNode。
    ◇: 在紧急情况下,可辅助恢复 NameNode。
    ◇: 热备份, B是A的热备份,A挂掉之后,B立马能顶替A工作。
    ◇: 冷备份: B是A的冷备份,A挂掉之后,不能里面顶替A工作,但是能让A恢复某个时间段前的状态。

NameNode

  • NameNode维护的第一个关系即目录树、元数据、数据块索引信息,这些都会定期持久化到物理硬盘上。实现是保存在命名空间的镜像fsimage和编辑日志edits中。
  • NameNode维护的第二个关系是在NameNode启动后,每个Datanode对本地磁盘进行扫描,将本Datanode上保存的block信息汇报给Namenode,Namenode在接收到每个Datanode的块信息汇报后,将接收到的块信息,以及其所在的Datanode信息等保存在内存中。
  • NameNode为了保证数据的安全性,除了在内存中保存着一份元数据外,在本地磁盘上保存着一份元数据镜像文件,就是fsimage。会由Secondary NameNode定期恢复。
  • NameNode中包含fsimage(元数据镜像文件)、edits(操作日志文件)、fstime(保存最近一次恢复的时间)。
  • 元数据: 比如FileName(文件名)、replicas(副本数量)、block-ids(文件被切割成的区块数量及区块组成),id2host(区块都在哪些DataNode上)等。
  • edits是元数据操作日志
  • 在NameNode启动时候,会先将fsimage中的文件系统元数据信息加载到内存,然后根据eidts中的记录将内存中的元数据同步至最新状态。
  • 由此可看出,这两个文件一旦损坏或丢失,这个可以由Secondary NameNode恢复。
  • fsimage\edits 是序列化后的文件,想要查看或编辑里面的内容,可通过 hdfs 提供的 oiv\oev 命令。
    ◇: 命令: hdfs oiv (offline image viewer) 用于将fsimage文件的内容转储到指定文件中以便于阅读,,如文本文件、XML文件,该命令需要以下参数.
        ◆: -i (必填参数) –inputFile 输入FSImage文件
        ◆: -o (必填参数) –outputFile 输出转换后的文件,如果存在,则会覆盖
        ◆: -p (可选参数) –processor 将FSImage文件转换成哪种格式: (Ls|XML|FileDistribution).默认为Ls
        ◆: 示例:hdfs oiv -i /data1/hadoop/dfs/name/current/fsimage_0000000000019372521 -o /home/hadoop/fsimage.txt
    ◇: 命令:hdfs oev (offline edits viewer 离线edits查看器)的缩写, 该工具只操作文件因而并不需要hadoop集群处于运行状态
        ◆: 示例: hdfs oev -i edits_0000000000000042778-0000000000000042779 -o edits.xml
    小结: NameNode管理着DataNode,接收DataNode的注册、心跳、数据块提交等信息的上报,并且在心跳中发送数据块复制、删除、恢复等指令;同时,NameNode还为客户端对文件系统目录树的操作和对文件数据读写、对HDFS系统进行管理提供支持

DataNode

  • Block: 在HDFS中,每个文件都是采用的分块的方式存储,每个block放在不同的datanode上,每个block的标识是一个三元组(block id, numBytes,generationStamp),其中block id是具有唯一性,具体分配是由namenode节点设置。
    ◇: 若client为DataNode节点,那存储block时,规则为:副本1,同client的节点上;副本2,不同机架节点上;副本3,同第二个副本机架的另一个节点上;其他副本随机挑选。
    ◇: 若client不为DataNode节点,那存储block时,规则为:副本1,随机选择一个节点上;副本2,不同副本1,机架上;副本3,同副本2相同的另一个节点上;其他副本随机挑选。
  • Packet:在DFSclient与DataNode之间通信的过程中,发送和接受数据过程都是以一个packet为基础的方式进行
    ◇: 一个文件被拆成多个block持续化存储
    ◇: 数据通讯过程中一个 block 被拆成 多个 packet。 一个 packet 包含多个 chunk
  • Packet结构与定义: Packet分为两类,一类是实际数据包,另一类是heatbeat包
  • 一个Packet是由Header和Data两部分组成,其中Header部分包含了一个Packet的概要属性信息, header如下:

Secondary NameNode

Secondary NameNode 的作用就是定期合并 fsimage 和 edits 日志,将 edits 日志文件大小控制在一个限度下。
       ● 当满足一定的条件时Secondary NameNode会采用Http get从NameNode下载edits和fsimage文件。
       ● 下载文件前,NameNode会重新生成edits.new,让后续的操作信息都存到这个新的edits文件当中。
       ● Secondary NameNode将这两个文件加载到内存并进行合并,生成新的fsimage.ckpt。
       ● 将fsimage.ckpt推送给NameNode,NameNode去掉fsimage.ckpt的后缀去掉,改成fsimage。
       ● 等到fsimage新的文件替换掉旧的fsimage的时候,旧的edits文件才会被新的edits文件所替换。
       ● 替换fsimage跟edits的过程称为一个检查 点 (checkpoint)。


  • 如何判断一个checkpoint?


HDFS读文件

  • 首先调用FileSystem对象的open方法,其实获取的是一个DistributedFileSystem的实例。
  • DistributedFileSystem通过RPC(远程过程调用)获得文件的第一批block的locations,同一block按照重复数会返回多个locations,这些locations按照hadoop拓扑结构排序,距离客户端近的排在前面。
  • 前两步会返回一个FSDataInputStream对象,该对象会被封装成 DFSInputStream对象,DFSInputStream可以方便的管理datanode和namenode数据流。DFSInputStream就会找出离客户端最近的datanode并连接datanode。
  • 数据从datanode源源不断的流向客户端。
  • 如果第一个block块的数据读完了,就会关闭指向第一个block块的datanode连接,接着读取下一个block块。
  • 如果第一批block都读完了,DFSInputStream就会去namenode拿下一批blocks的location。
  • Client读取某个区块是否成功,依靠CRC32校验和机制,原理是:每个文件的每个区块都有一个原始的校验和值,我们在把这个文件上传到HDFS系统的时候元数据便保存了这个初始值,如果后续这个文件的某个区块发生任何变化,那么这个校验和的值便会发生变化,那么当Client读取这个文件的这个区块的时候如果发现校验和已经发生了改变,那么说明这个文件很可能已经被损坏了。
  • 小结:先连接NameNode获取BlockLocation,然后一批一批、一块一块的read data

HDFS写文件

  • client通过调用 DistributedFileSystem 的create方法,创建一个新的文件。
  • DistributedFileSystem 通过 RPC(远程过程调用)调用 NameNode,去创建一个没有blocks关联的新文件。创建前,NameNode 会做各种校验,比如文件是否存在,客户端有无权限去创建等。
  • 前两步结束后会返回 FSDataOutputStream 的对象,FSDataOutputStream 被封装成 DFSOutputStream。客户端开始写数据到DFSOutputStream,DFSOutputStream会把数据切成一个个小packet,然后排成 data queue。
  • DataStreamer 会去处理接受 data queue,它先问询 NameNode 这个新的 block 最适合存储的在哪几个DataNode里,把它们排成一个 pipeline。DataStreamer 把 packet 按队列输出到管道的第一个 DataNode 中,第一个 DataNode又把 packet 输出到第二个 DataNode 中,以此类推。
  • DFSOutputStream 还有一个队列叫 ack queue,也是由 packet 组成,等待DataNode的收到响应,当pipeline中的所有DataNode都表示已经收到的时候,这时akc queue才会把对应的packet包移除掉。
  • 客户端完成写数据后,调用close方法关闭写入流。 DataStreamer 把剩余的包都刷到 pipeline 里,然后等待 ack 信息,收到最后一个 ack 后,通知 DataNode 把文件标示为已完成。
  • 小结: client从NameNode得知location后,将data分成Block[j],比如64M的Block[0]切分成1000个64k的package,package[0]发给node[1], node[1]传给node[2],然后再传package[j]。全部写完后,client向NameNode发送消息表示写完毕。
    图片.png

HDFS启动

[root@itcast01 ~]# cd /usr/local/hadoop-2.9.1/sbin
[root@itcast01 sbin]#   ../bin/hdfs namenode -format
[root@itcast01 sbin]#  ./start-dfs.sh,    

#启动之后可以看到三个java进程: NameNode、SecondaryNameNode、DataNode

[root@itcast01 sbin]# jps
3369 Jps
2918 NameNode
3266 SecondaryNameNode
3008 DataNode
[root@itcast01 sbin]# 

参考资料

https://blog.csdn.net/u012453843/article/details/52463165
https://www.cnblogs.com/wujing-hubei/p/6005354.html
https://www.cnblogs.com/codeOfLife/p/5375120.html
http://hadoop.apache.org/docs/stable/hadoop-project-dist/hadoop-common/SingleCluster.html

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,445评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,889评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,047评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,760评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,745评论 5 367
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,638评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,011评论 3 398
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,669评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,923评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,655评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,740评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,406评论 4 320
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,995评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,961评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,197评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,023评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,483评论 2 342