Hadoop之HDFS概念

  • HDFS是Hadoop Distribute File System 的简称,意为:Hadoop分布式文件系统。是Hadoop核心组件之一

1. HDFS设计目标

  1. 硬件故障是常态, HDFS将有成百上千的服务器组成,每一个组成部分都有可能出现故障。因此故障的检测和自动快速恢复是HDFS的核心架构目标。
  1. HDFS上的应用与一般的应用不同,它们主要是以流式读取数据。(可以理解为:来一点,处理一点,就象看网络上的黄片一样,你永远不知道下一帧是啥)HDFS被设计成适合批量处理,而不是用户交互式的。相较于数据访问的反应时间,更注重数据访问的高吞吐量。
  2. 典型的HDFS文件大小是GB到TB的级别。所以,HDFS被调整成支持大文件。它应该提供很高的聚合数据带宽,一个集群中支持数百个节点,一个集群中还应该支持千万级别的文件。
  3. 大部分HDFS应用对文件要求的是write-one-read-many(写少读多)访问模型。一个文件一旦创建、写入、关闭之后就不需要修改了。这一假设简化了数据一致性问题,使高吞吐量的数据访问成为可能。
  4. 移动计算的代价比之移动数据的代价低。一个应用请求的计算,离它操作的数据越近就越高效,这在数据达到海量级别的时候更是如此。将计算移动到数据附近,比之将数据移动到应用所在显然更好。
  5. 在异构的硬件和软件平台上的可移植性。这将推动需要大数据集的应用更广泛地采用HDFS作为平台。

2. HDFS重要特性

2.1.主从架构
HDFS采用master/slave架构。一般一个HDFS集群是有一个Namenode和一定数目的Datanode组成。
Namenode是HDFS集群主节点,Datanode是HDFS集群从节点,两种角色各司其职,共同协调完成分布式的文件存储服务。
2.2. 分块存储
HDFS中的文件在物理上是分块存储(block)的,块的大小可以通过配置参数来规定,默认大小在hadoop2.7.3版本后是128M,之前版本的默认值是64M.
2.3. 名字空间(NameSpace
HDFS支持传统的层次型文件组织结构。用户或者应用程序可以创建目录,然后将文件保存在这些目录里。文件系统名字空间的层次结构和大多数现有的文件系统类似:用户可以创建、删除、移动或重命名文件。
Namenode负责维护文件系统的名字空间,任何对文件系统名字空间或属性的修改都将被Namenode记录下来。
HDFS会给客户端提供一个统一的抽象目录树,客户端通过路径来访问文件,形如:hdfs://namenode:port/dir-a/dir-b/dir-c/file.data。
2.4. Namenode元数据管理
我们把目录结构及文件分块位置信息叫做元数据。Namenode负责维护整个hdfs文件系统的目录树结构,以及每一个文件所对应的block块信息(block的id,及所在的datanode服务器)。
2.5. Datanode数据存储
文件的各个block的具体存储管理由datanode节点承担。每一个block都可以在多个datanode上。Datanode需要定时向Namenode汇报自己持有的block信息。
2.6. 副本机制
为了容错,文件的所有block都会有副本。每个文件的block大小和副本系数都是可配置的。应用程序可以指定某个文件的副本数目。副本系数可以在文件创建的时候指定,也可以在之后改变。
副本数量也可以通过参数设置dfs.replication默认是3
2.7. 一次写入,多次读出
HDFS是设计成适应一次写入,多次读出的场景,且不支持文件的修改。
正因为如此,HDFS适合用来做大数据分析的底层存储服务,并不适合用来做.网盘等应用,因为,修改不方便,延迟大,网络开销大,成本太高。

1. NameNode概述

a、 NameNode是HDFS的核心。
b、 NameNode也称为Master
c、 NameNode仅存储HDFS的元数据:文件系统中所有文件的目录树,并跟踪整个集群中的文件。
d、 NameNode不存储实际数据或数据集。数据本身实际存储在DataNodes中。
e、 NameNode知道HDFS中任何给定文件的块列表及其位置。使用此信息NameNode知道如何从块中构建文件。
f、 NameNode并不持久化存储每个文件中各个块所在的DataNode的位置信息,这些信息会在系统启动时从数据节点重建。
g、 NameNode对于HDFS至关重要,当NameNode关闭时,HDFS / Hadoop集群无法访问
h、 NameNode是Hadoop集群中的单点故障。
i、 NameNode所在机器通常会配置有大量内存(RAM)

2. DataNode概述

a、 DataNode负责将实际数据存储在HDFS中。
b、 DataNode也称为Slave
c、 NameNode和DataNode会保持不断通信。
d、 DataNode启动时,它将自己发布到NameNode并汇报自己负责持有的块列表。
e、 当某个DataNode关闭时,它不会影响数据或群集的可用性。NameNode将安排由其他DataNode管理的块进行副本复制。
f、 DataNode所在机器通常配置有大量的硬盘空间。因为实际数据存储在DataNode中。
g、 DataNode会定期(dfs.heartbeat.interval配置项配置,默认是3秒)向NameNode发送心跳,如果NameNode长时间没有接受到DataNode发送的心跳, NameNode就会认为该DataNode失效。
h、 block汇报时间间隔取参数dfs.blockreport.intervalMsec,参数未配置的话默认为6小时.

3. HDFS的工作机制
  • NameNode负责管理整个文件系统元数据;DataNode负责管理具体文件数据块存储;
  • Secondary,NameNode协助NameNode进行元数据的备份。
  • HDFS的内部工作机制对客户端保持透明,客户端请求访问HDFS都是通过向NameNode申请来进行。

在这里插入图片描述

3.1 HDFS写数据流程

在这里插入图片描述

详细步骤解析:

1、客户端也就是hdfs发起文件上传的请求 ,这个时候他们通过RPC协议与集群中的NameNode建立连接,Namenode开始检查要上传的文件的父目录是否存在,返回消息通知hdfs是否可以上传.
2、 client请求第一个 block该传输到哪些DataNode服务器上;
3、 NameNode根据配置文件中指定的备份数量及副本放置策略进行文件分配,返回可用的DataNode的地址,如:A,B,C;
注:默认存储策略由BlockPlacementPolicyDefault(块放置策略默认值 )类支持。也就是日常生活中提到最经典的3副本策略。

1st replica 如果写请求方所在机器是其中一个datanode,则直接存放在本地,否则随机在集群中选择一个datanode.
2nd replica 第二个副本存放于不同第一个副本的所在的机架.
3rd replica 第三个副本存放于第二个副本所在的机架,但是属于不同的节点

4、 client请求3台DataNode中的一台A上传数据(本质上是一个RPC调用,建立pipeline),A收到请求会继续调用B,然后B调用C,将整个pipeline建立完成,后逐级返回client;
5、 client开始往A上传第一个block(先从磁盘读取数据放到一个本地内存缓存),以packet为单位(默认64K),A收到一个packet就会传给B,B传给C;A每传一个packet会放入一个应答队列等待应答。
6、 数据被分割成一个个packet数据包在pipeline上依次传输,在pipeline反方向上,逐个发送ack(命令正确应答),最终由pipeline中第一个DataNode节点A将pipeline ack发送给client;
7、 当一个block传输完成之后,client再次请求NameNode上传第二个block到服务器。

在这里插入图片描述

3.2. HDFS读数据流程

在这里插入图片描述
详细步骤解析:
1、 Client向NameNode发起RPC请求,来确定请求文件block所在的位置;
2、 NameNode会视情况返回文件的部分或者全部block列表,对于每个block,NameNode都会返回含有该block副本的DataNode地址;
3、 这些返回的DN地址,会按照集群拓扑结构得出DataNode与客户端的距离,然后进行排序,排序两个规则:网络拓扑结构中距离Client近的排靠前;心跳机制中超时汇报的DN状态为STALE,这样的排靠后;
4、 Client选取排序靠前的DataNode来读取block,如果客户端本身就是DataNode,那么将从本地直接获取数据;
5、 底层上本质是建立FSDataInputStream,重复的调用父类DataInputStream的read方法,直到这个块上的数据读取完毕;一旦到达块的末尾,DFSInputStream 关闭连接并继续定位下一个块的下一个 DataNode;
6、 当读完列表的block后,若文件读取还没有结束,客户端会继续向NameNode获取下一批的block列表;一旦客户端完成读取,它就会调用 close() 方法。
7、 读取完一个block都会进行checksum验证,如果读取DataNode时出现错误,客户端会通知NameNode,然后再从下一个拥有该block副本的DataNode继续读。
8、 NameNode只是返回Client请求包含块的DataNode地址,并不是返回请求块的数据;
9、 最终读取来所有的block会合并成一个完整的最终文件。

学习的时候发现这个竟然和Glusterfs有些相似 在网上找了一张对比图片 后面也会把Google的GFS的的论文发出来供大家参考 目前来说 分布式存储都有些万变不离其宗的意思
在这里插入图片描述
GFS论文
提取码:aq4w
–来自百度网盘超级会员V1000的分享
过期可以私聊我

  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值