Hadoop-HDFS分布式文件系统

Hadoop 生态圈的基本组成部分是 Hadoop 分布式文件系统(HDFS)。HDFS 是一种数据分布式保存机制,数据被保存在计算机集群上。数据写入一次,读取多次。HDFS为 HBase 等工具提供了基础,源于谷歌的GFS。

1 基本原理

HDFS采用了主从(Master/Slave)结构模型,一个HDFS集群包括一个名称节点(NameNode)和若干个数据节点(DataNode)。名称节点作为中心服务器,负责管理文件系统的命名空间及客户端对文件的访问。集群中的数据节点一般是一个节点运行一个数据节点进程,负责处理文件系统客户端的读/写请求,在名称节点的统一调度下进行数据块的创建、删除和复制等操作。每个数据节点的数据实际上是保存在本地Linux文件系统中的。

2 存储模型(字节)

   -文件线性切割成块(Block):偏移量offset(byte)
   -Block分散存储在集群节点中
   -单一文件Block大小一致,文件与文件可以不一致
   -Block可以设置副本数,副本分散在不同节点中(副本数不超过节点数量)
   -文件上传可以设置Block大小和副本数
   -已上传的文件Block副本数可以调整,大小不变
   -只支持一次写入多次读取,同一时刻只有一个写入者
   -可以append追加数据

3  架构模型

   -文件元数据MetaData,文件数据(元数据 + 数据本身)
   -(主)NameNode节点保存文件元数据:单节点 posix
   -(从)DataNode节点保存文件Block数据:多节点
   -DataNode与NameNode保持心跳,提交Block列表
   -HdfsClient与NameNode交互元数据信息
   -HdfsClient与DataNode交互文件Block数据

4  详情

4.1 NameNode(NN)

基于内存存储:不会和磁盘发生交换(只存在内存中,但是可以在磁盘持久化)
主要功能
         --接受客户端的读写服务
         --收集DataNode汇报的Block列表信息
保存的metadata信息包括
          --文件owership和permissions
          --文件大小、时间
          --(Block列表:Block偏移量),位置信息
          --Block每副本位置(由DataNode上报)
NameNode持久化
           --NameNode的metadata信息在启动后会加载到内存
           --metadata存储到磁盘文件名为fsimage
           --Block的位置信息不会保存到fsimage
           --edits记录对metadata的操作日志___redis

4.2 DataNode(DN)

本地磁盘目录存储数据(Block),文件形式
同时存储Block的元数据信息文件
启动DN时会向NN汇报block信息
通过向NN发送心跳保持与其联系(3秒一次),如果NN 10分钟没有收到DN的心跳,则认为其已经lost,并copy其上的block到其他DN

4.3 SecondaryNameNode(SNN)

不是NN的备份,但可以做备份,主要工作是帮助NN合并edits log,减少NN启动时间
SNN执行合并时机
        --根据配置文件设置的时间间隔fs.checckpoint.period 默认3600秒
        --根据配置文件设置edits log大小fs.checkpoint.size规定edits文件的最大默认是64MB

5  HDFS优点

   -高容错性(数据自动保存多个副本;副本丢失后自动恢复)
   -适合批处理(移动计算而非数据;数据位置暴露给计算框架Block偏移量)
   -适合大数据处理(GB、TB甚至PB级数据;百万规模以上的文件数量;10K+节点)
   -可构建在廉价机器上(通过多副本提高可靠性;提供了容错和恢复机制)  

6  HDFS缺点

   -低延迟数据访问(比如毫秒级;低延迟与高吞吐量)
   -小文件存取(占用NameNode大量存储;寻道时间超过读取时间)
   -并发写入、文件随机修改(一个文件只能有一个写着;仅支持append)

7  HDFS写流程

1) 初始化FileSystem,客户端调用create()来创建文件。
2) FileSystem调用元数据节点,在文件系统的命名空间中创建一个新的文件,元数据节点确定文件原来不存在后,给客户端创建文件的权限,然后创建新文件。
3) FileSystem返回DFSOutputStream,客户端用于写数据,客户端开始写入数据。
4) DFSOutputStream将数据分成块,写入data queue。data queue由Data Streamer读取,并通知元数据节点分配数据节点,用来存储数据块(每块默认复制3块)。分配的数据节点放在一个pipeline里。Data Streamer将数据块写入pipeline中的第一个数据节点。第一个数据节点将数据块发送给第二个数据节点。第二个数据节点将数据发送给第三个数据节点。
5) DFSOutputStream为发出去的数据块保存了ack queue,等待pipeline中的数据节点告知数据已经写入成功。
6) 当客户端结束写入数据,则调用stream的close()函数。此操作将所有的数据块写入pipeline中的数据节点,并等待ack queue返回成功。最后通知元数据节点写入完毕。
7) 最后调用DFS方法,告诉NameNode流程完成。
注:如果数据节点在写入的过程中失败,关闭pipeline,将ack queue中的数据块放入data queue的开始,当前的数据块在已经写入的数据节点中被元数据节点赋予新的标示,则错误节点重启后能够察觉其数据块是过时的,会被删除。失败的数据节点从pipeline中移除,另外的数据块则写入pipeline中的另外两个数据节点。元数据节点则被通知此数据块是复制块数不足,将来会再创建第三份备份。

 

8  HDFS读流程

1) 初始化FileSystem,然后客户端用函数open()打开文件 。
2) FileSystem调用元数据节点,得到数据块信息,并对每一个数据块、元数据节点返回,保存数据块的数据节点地址。
3) 客户端调用stream的read()函数开始读取数据。
4) FSDataInputStream连接保存此文件第一个数据块的最近的数据节点datanode,data从数据节点读到客户端。
5) 当第一个数据块读取完毕时,DFSInputStream关闭和此数据节点的连接,然后连接此文件下一个数据块的最近的数据节点。
6) 当客户端读取完毕数据的时候,调用FSDataInputStream的close()函数,关闭连接。
注:在读取数据的过程中,如果客户端在与数据节点通信出现错误,则尝试连接包含此数据块的下一个数据节点;失败的数据节点将被记录,以后不再连接。

9  Hadoop2.x

1)产生背景

Hadoop1.0中HDFS和MapReduce在高可用、扩展性等方面存在问题;
HDFS存在的问题:
NameNode单点故障,难以应用于在线场景 HA(high available高可用)
NameNode压力过大,且内存受限,影响扩展 F
MapReduce存在的问题
JobTracker访问压力过大,影响系统扩展性
难以支持除MapReduce之外的计算框架,如Spark、Storm等

2)解决方案

* 解决单点故障:HDFS HA 通过主备NameNode解决,如果主NameNode发生故障,则切换到备NameNode上
* 解决内存受限问题:HDFS Federation(联邦),每个NameNode分管一部分目录;所有NameNode共享DataNode存储资源

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值