Hadoop HDFS 简介

Hadoop 分布式文件系统,一个高度容错性的文件系统,适合部署在廉价的机器上
HDFS 能提供高吞吐量的数据访问,适合那些有着超大数据集的应用程序

 

设计特点
– 支持超大数据文件,非常适合几百MB/GB甚至TB级别的大文件的存储
– 文件分块存储,HDFS 会将一个完整的大文件平均分块存储到不同计算器上,读取文件时可以同时从多个主机取不同区块的文件,多主机读取比单主机读取效率要高得多
流式数据访问,程序能够以流式访问数据集,适合大规模数据的批量处理。注重吞吐量而不是访问速度
– 简化的一致性模型,一次写入多次读写,跟传统文件不同,不支持动态改变文件内容,而是要求让文件一次写入就不做变化,要变化也只能在文件末添加内容。有利于提高吞吐量
处理硬件故障,大规模集群中,硬件故障是常见的问题。HDFS 认为所有计算机都可能会出问题,为了防止某个主机失效读取不到该主机的块文件,它将同一个文件块副本分配到其它某几个主机上,如果其中一台主机失效,可以迅速找另一块副本取文件

 

不适用 HDFS 的场景
低延迟的数据访问,如交互式应用。可以考虑 HBase
大量的小文件,NameNode 的内存大小决定了 HDFS 可以保存的文件数量,大量的小文件占用 NameNode 的空间,影响性能
多用户写入、修改文件,HDFS 文件只有一个写入者,且不支持修改。

HDFS 采用 Master-Slave 的结构

 

主要模块有 Namenode、SecondaryNamenode(冷备份)、Datanode 和 Client 这几个角色
热备份:b是a的热备份,如果a坏掉。那么b马上运行代替a的工作
冷备份:b是a的冷备份,如果a坏掉。那么b不能马上代替a工作。但是b上存储a的一些信息,减少a坏掉之后的损失

 

关键元素

– Block:HDFS 将一个文件进行分块存储,默认是64M

使用 Block 的好处:
1. 可以保存比存储节点单一磁盘大的文件
2. 方便容错处理,有利于数据复制。数据块一般会在不同的机器上保留副本(一般为3个)。

 

– Namenode:Master 节点上运行的主要进程,保存和整个文件系统的目录信息、文件信息及分块信息。

这些信息以两种形式存储在本地文件系统:FSImage 和 EditLog。
FSImage 保存某一时刻的 HDFS 目录树、元信息和 Block 索引等信息。
EditLog 保存 FSImage 生成后的后续改动信息。
通过Namenode,Client 可以找到 Block 所在的 Datanode 信息。Namenode 中与 Datanode 相关的信息不保存在本地文件系统,每次启动 Namenode 会动态的重建这些信息。

 

– SecondaryNamenode:Namenode 的冷备份

根据配制的时间间隔,定期合并 Namenode 中的 FSImage 和 EditLog,生成新的 FSImage 并保存,类似 Checkpoint 机制。可以减少 Namenode 故障而丢失数据的风险,但是不支持故障自动恢复。

Hadoop 2.x 开始支持 Activity-Standy 模式如果主 Namenode 失效,启动备用主机运行 Namenode
Hadoop 1.x 所有的元信息存储在单一的 Namenode 节点上,Namenode 的存储空间成为集群的存储瓶颈,Hadoop 2.x 可以配置多个 Namenode(federation cluster)。

 

– Datanode:分布在集群中的每个 Slave 节点的进程,用于读写 Block 块文件。

作为 Slave 节点会不断的向 Namenode 发送心跳信息告知当前状态,并接受来自 Namenode 的指令,创建、移动或删除 Block 块。

 

– Client:与 HDFS 交互的客户端包括:命令行接口、JavaAPI、Thrift 接口等

提供了一套类似 Linux 文件命令行类似的命令行工具,如:hadoop fs -mkdir /dir
文件上传 HDFS 的时候,Client 将文件切分成一个一个的 Block,然后进行存储。
与 Namenode 交互,获取文件的位置信息。
与 Datanode 交互,读取或者写入数据。

 

简化的工作原理

HDFS 配置:分布在三个机架上,分别部署 DataNode
Rack1(DN-master,DN-host2,DN-host6)
Rack2(DN-host1,DN-host3,DN-host7)
Rack3(DN-host5,DN-host4,DN-host8)

 

写操作

有一个文件 FileA,100M大小。通过 Client 将 FileA 写入到 HDFS 上
1. Client 将 FileA 按64M分块。分成两块,block1 和 block2
2. Client 向 Namenode 发送写数据,请求Namenode 节点,记录 block 信息,并返回可用的 Datanode
    block1: host2,host1,host3
    block2: host7,host8,host4
Client 向 Datanode 发送 block1;发送过程是以流式写入
3. 流式写入过程:
    – 将64M的 block1 按64k的 package 划分,然后将第一个 package 发送给 host2
    – host2 接收完后,将第一个 package 发送给 host1,同时 Client 向 host2 发送第二个 package
       以此类推,直到将block1发送完毕
    – host2,host1,host3 向 Namenode 通知,host2 向 Client 发送通知,表示消息发送完成
    – Client 收到 host2 发来的消息后,向 Namenode 发送消息,表示写入完成了
    – 发送完 block1 后,再向 host7,host8,host4 发送 block2,重复之前的动作

 

如果要写1T文件,我们需要3T的存储,3T的网络流量。(hadoop 3.x 引入可擦除编码技术,优化存储)
在执行读或写的过程中,Namenode 和 Datanode 通过 HeartBeat 进行保存通信,确定 Datanode 活着。如果发现 Datanode 死掉了,就将死掉的 Datanode 上的数据,放到其他节点去。读取时,要读其他节点去。
挂掉一个节点,没关系,还有其他节点可以备份;甚至,挂掉某一个机架,也没关系;其他机架上,也有备份

 

读操作

Client 要从 Datanode 上,读取 FileA,由 block1 和 block2 组成
1. Client 向 Namenode 发送读请求
2. Namenode 查看 Metadata 信息,返回 fileA 的 block 的位置
    block1:host2,host1,host3
    block2:host7,host8,host4
3. block 的位置是有先后顺序的,先读 block1,再读 block2。而且 block1 去 host2 上读取;然后 block2,去 host7 上读取
如果 client 位于机架内某个 Datanode 上,例如,client 是 host6。那么读取的时候,遵循的规律是:优先读取本机架上的数据

 

推荐书籍
《Hadoop技术内幕:深入解析Hadoop Common和HDFS架构设计与实现原理》

Tags:,

Add a Comment

电子邮件地址不会被公开。 必填项已用*标注

18 − 10 =