前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >HDFS|基本概念和读写原理

HDFS|基本概念和读写原理

作者头像
double
发布2018-04-02 16:30:27
1.1K0
发布2018-04-02 16:30:27
举报
文章被收录于专栏:算法channel

01

HDFS设计目的

A distributed file system that provides high-throughput access to application data.

HDFS(Hadoop Distributed File System )是Hadoop分布式文件系统,设计目的是为了存储超大文件,主要是针对几百MB,GB,甚至TB的文件,流式读取方式,主要是针对一次写入,写入的过程使用的是append的方式,多次读出的使用模式。

该分布式系统构建在普通PC机组成的集群上,大大降低了构建成本,并屏蔽了系统故障,保存多个副本,且提供容错机制,副本丢失或宕机自动恢复(默认存3份),使得用户可以专注于自身的操作运算。

02

HDFS相关的基本概念

block

这是HDFS的基本思想了,把大的文件分成块,每块64M。

备份(replicas)

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

机架 (rack)

由几个DataNode组成的部件称为机架

MetaData

描述我们要存储数据的数据结构

HDFS namespace

这个命名空间指的是文件的目录结构,与我们单个电脑的文件的结构树相似。

EditLog

记录文件系统的metadata变化的事务日志,是HDFS的核心数据结构。 例如,写入一个文件或修改复制因子都会向EditLog中写入一条record。

FsImage

整个文件系统的命名空间,包括block到文件的映射,文件系统的属性(大小,被分为几个block,只读,权限等信息),都被存储在一个文件中,这个文件就是FsImage。

HDFS namespace,EditLog,FsImage都存储在NameNode上。

HeartBeat

NameNode和DataNode通过HeartBeat进行通信,每隔一定时间,DataNode就会向NameNode发送心跳信号,以此报告给NameNode,说我还活着,这样NameNode 在接到读写任务时,会发命令给它。

02

HDFS如何分解文件

HDFS默认会将文件分割成 block,64M为1个block,然后将block按键值对存储在HDFS上,并将键值对的映射存到内存中。每个文件默认会保存3份。

如下图所示为HDFS的基本架构,按照Master和Slave的结构,主要的组件包括:NameNode、SecondaryNameNode、DataNode。

NameNode:是Master节点,

  • 处理客户端的读、写请求;
  • 管理数据块映射;
  • 管理HDFS的名称空间;
  • 配置副本策略;

SecondaryNameNode:合并fsimage和fsedits,然后再发给namenode,尽量不要与NameNode部署在同一个host上,这样避免内存的过多消耗;NameNode的冷备份;

DataNode:Slave节点,干活的。负责存储client发来的数据块block,执行数据块的读写操作。

client分类

  1. DataNode节点可以为client
  2. 非DataNode节点可以为client,比如外部的host写入file1文件时,

如果client为DataNode,某个block的3份备份,如何选取DataNode进行存储呢?一般地,它会在自己所在的host上备份一个,然后在另外一台机架的不同DataNode上分别备份一个。

如果client不是DataNode所在的host,也就是我们比如在存入有道笔记一个pdf文件时,很明显我们不是在有道的集群上的DataNode的host上,而是在自己的主机上,此时,我们写入文件时,有道的HDFS会将此文件分解为块,然后根据某个算法,找到某个DataNode,然后在另外不同的机架上,选择两个DataNode,这是默认的行为。

03

向集群中写入一个文件FileA

FileA假定大小为100M。

  1. Client将FileA按64M分块。分成两块,block1和Block2;
  2. Client向NameNode发送写数据请求,如图蓝色虚线①。
  3. NameNode节点,记录block信息,经过一定的算法计算后返回可用的DataNode,如粉色虚线②,计算得出,block1和block2分别被存储在如下的host中:

block1: host2,host1,host3

block2: host7,host8,host4

d. client向DataNode发送block1;发送过程是以流式写入,直到将block1发送完毕,host2,host1,host3向NameNode,host2向Client发送通知,说“消息发送完了”。

分析写过程:

  • 写1T文件,我们需要3T的存储,3T的网络流量带宽。
  • 挂掉一个节点,没关系,还有其他节点可以备份;甚至,挂掉某一个rack,也没关系;其他rack上,也有备份。

04

从集群中读文件FileA

上面是写入FileA的过程,HDFS默认用户会多次读取这个文件FileA,那么如何读取呢?

a. client向NameNode发送读请求。

b. NameNode查看Metadata信息,返回fileAblock的位置给client。

block1:host2,host1,host3

block2:host7,host8,host4

c. block的位置是有先后顺序的,先读block1,再读block2,而且block1去host2上读取;然后block2,去host7上读取;

上面例子中,client位于机架外。

那么如果client位于机架内某个DataNode上,例如 client是host6。那么读取的时候,遵循的规律是:优选读取本机架上的数据。

05

HDFS的缺陷

hadoop的HDFS不是完美的,也有缺陷,比如只有一个NameNode节点,这样一旦宕机,整个系统就无法工作。比如hadoop如果接来的小文件太多,那内存的负担会很重。对于这小文件存储,hadoop后续给出了解决方案,之后可以总结这个问题。


参考文献:

http://hadoop.apache.org/docs/current/hadoop-project-dist/hadoop-hdfs/HdfsDesign.html

https://www.cnblogs.com/laov/p/3434917.html

http://hadoop.apache.org/docs/r1.0.4/cn/hdfs_design.html#%E5%BC%95%E8%A8%80

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2018-01-05,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 程序员郭震zhenguo 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
文件存储
文件存储(Cloud File Storage,CFS)为您提供安全可靠、可扩展的共享文件存储服务。文件存储可与腾讯云服务器、容器服务、批量计算等服务搭配使用,为多个计算节点提供容量和性能可弹性扩展的高性能共享存储。腾讯云文件存储的管理界面简单、易使用,可实现对现有应用的无缝集成;按实际用量付费,为您节约成本,简化 IT 运维工作。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档