大数据第三天-HDFS

      Hadoop实现了一个分布式文件系统(Hadoop Distributed File System),简称HDFS。Hadoop 是一个以一种可靠、高效、可伸缩的方式进行处理的,能够对大量数据进行分布式处理的系统框架。所以可以理解为hadoop是一个框架,HDFS是hadoop中的一个部件。




1. hdfs架构

  一个HDFS文件系统包括一个主控节点NameNode和一组DataNode从节点。

*NameNode 上可以执行文件操作,比如打开、关闭、重命名等; 而且NameNode 也负责向DataNode分配数据块并建立数据块和DataNode 的对应关系。

   NameNode是一个主服务器,用来管理整个文件系统的命名空间和元数据,以及处理来自外界的文件访问请求。NameNode保存了文件系统的三种元数据:
1) 命名空间,即整个分布式文件系统的目录结构;
2) 数据块与文件名的映射表;
3) 每个数据块副本的位置信息,每一个数据块默认有3个副本

·NameNode是用来管理文件系统命名空间的组件
·一个HDFS集群只有一台NameNode
    一个HDFS集群只有一个命名空间,一个根目录
·NameNode上存放了HDFS的元数据
    一个HDFS集群只有一份元数据
    目前有单点故障的问题
·元数据保存在NameNode的内存当中,以便快速查询
    1G内存大致可以存放1,000,000个块对应的元数据信息,按缺省每块64M计算,大致对应64T实际数据

*DataNode 负责处理文件系统用户具体的数据读写请求,同时也可以处理NameNode对数据块的创建、删除副本的指令。

    DataNode 用来实际存储和管理文件的数据块
   1.文件中的每个数据块默认的大小为64MB; 同时为了防止数据丢失,每个数据块默认有3个副本,且3个副本会分别复制在不同的节点上,以避免一个节点失效造成一个数据块的彻底丢失。
   2.每个DataNode 的数据实际上是存储在每个节点的本地Linux 文件系统中

·块的实际数据存放在DataNode上
·每个块会在本地文件系统产生两个文件,一个是实际的数据文件,另一个是块的附加信息文件,其中包括数据的校验和,生成时间
·DataNode通过心跳包(Heartbeat)与NameNode通讯
·客户端读取/写入数据的时候直接与DataNode通信

*典型的部署模式采用NameNode单独运行于一台服务器节点上,其余的服务器节点,每一台运行一个DataNode

2.元数据块

   元数据是用于描述要素、数据集或数据集系列的内容、覆盖范围、质量、管理方式、数据的所有者、数据的提供方式等有关的信息。更简单的说,是关于数据的数据。

   HDFS就是将巨大的数据变成大量数据的数据

元数据包括
   ·文件系统目录树信息
        文件名,目录名
        文件和目录的从属关系
        文件和目录的大小,创建及最后访问时间
        权限
   ·文件和块的对应关系
        文件由哪些块组成
   ·块的存放位置
        机器名,块ID

HDFS对元数据和实际数据采取分别存储的方法
   ·元数据存储在一台指定的服务器上(NameNode)
   ·实际数据储存在集群的其他机器的本地文件系统中(DataNode)

3.数据块   

   ·在传统的块存储介质中,块是读写的最小数据单位 (扇区)
   ·传统文件系统基于存储块进行操作
     为了节省文件分配表空间,会对物理存进行储块整般合,一般大小为4096字节
   ·HDFS也使用了块的概念,但是默认大小设为64M字节
      可针对每个文件配置,由客户端指定
      每个块有一个自己的全局ID

   ·HDFS将一个文件分为一个或数个块来存储
      每个块是一个独立的存储单位
      以块为单位在集群服务器上分配存储

   ·与传统文件系统不同的是,如果实际数据没有达到块大小,则并不实际占用磁盘空间
      如果一个文件是200M,则它会被分为4个块: 64+64+64+8

   使用块的好处:

     当一个文件大于集群中任意一个磁盘的时候,文件系统可以充分利用集群中所有的磁盘
     管理块使底层的存储子系统相对简单
     块更加适合备份,从而为容错和高可用性的实现带来方便
     最重要的是,采用块方式,实现了名字与位置的分离,实现了的存储位置的独立性
   块的冗余备份:

          每个块在集群上会存储多份(replica)

                      默认复制份数为3  可针对每个文件配置,由用户指定   可动态修改
          某个块的所有备份都是同一个ID
                      系统无需记录“哪些块其实是同一份数据”
          系统可以根据机架的配置自动分配备份位置
                   第一份在集群的某个机架的某台机器上
                     其他两份在另外的一个机架的两台机器上--此策略是性能与冗余性的平衡
                     机架信息需要手工配置


4.读写策略

基本的访问流程:

1.首先,用户的应用程序通过HDFS 的客户端程序将文件名发送至NameNode 。
2.NameNode 接收到文件名之后,在HDFS 目录中检索文件名对应的数据块,再根据数据块信息找到保存数据块的DataNode 地址,将这些地址回送给客户端。
3.客户端接收到DataNode 地址之后,与DataNode 并行地进行数据传输操作,同时将操作结果的相关日志(比如是否成功,修改后的数据块信息等)提交到NameNode 。


    数据的读取过程:

 
(1)客户端调用FileSystem实例的open方法,获得这个文件对应的输入流InputStream
(2)通过RPC远程调用NameNode ,获得NameNode中此文件对应的数据块保存位置,包括这个文件的副本的保存位置( 主要是各DataNode的地址) 。
(3)获得输入流之后,客户端调用read 方法读取数据。选择最近的DataNode 建立连接并读取数据。
(4)如果客户端和其中一个DataNode 位于同一机器(比如MapReduce 过程中的mapper 和reducer),那么就会直接从本地读取数据。
(5)到达数据块末端,关闭与这个DataNode 的连接,然后重新查找下一个数据块。
(6)不断执行第2 - 5 步直到数据全部读完
(7)客户端调用close ,关闭输入流DF S InputStream

    数据的写入过程:

 
(1)客户端调用Fi leSystem 实例的create 方法,创建文件。NameNode 通过一些检查,比如文件是否存在,客户端是否拥有创建权限等;通过检查之后,在NameNode 添加文件信息。注意,因为此时文件没有数据,所以NameNode 上也没有文件数据块的信息。
(2)创建结束之后, HDFS 会返回一个输出流DFSDataOutputStream 给客户端。
(3)客户端调用输出流DFSDataOutputStream 的write 方法向HDFS 中对应的文件写入数据。
(4)数据首先会被分包,这些分包会写人一个输出流的内部队列Data 队列中,接收完数据分包,输出流DFSDataOutputStream 会向NameNode 申请保存文件和副本数据块的若干个DataNode , 这若干个DataNode 会形成一个数据传输管道。DFSDataOutputStream 将数据传输给距离上最短的DataNode ,这个DataNode 接收到数据包之后会传给下一个DataNode 。数据在各DataNode之间通过管道流动,而不是全部由输出流分发,以减少传输开销。
(5)因为各DataNode 位于不同机器上,数据需要通过网络发送,所以,为了保证所有DataNode 的数据都是准确的,接收到数据的DataNode 要向发送者发送确认包(ACK Packet ) 。对于某个数据块,只有当DFSDataOutputStream 收到了所有DataNode 的正确ACK. 才能确认传输结束。DFSDataOutputStream 内部专门维护了一个等待ACK 队列,这一队列保存已经进入管道传输数据、但是并未被完全确认的数据包。
(6)不断执行第3 - 5 步直到数据全部写完,客户端调用close 关闭文件。
(7)DFSDataInputStream 继续等待直到所有数据写人完毕并被确认,调用complete 方法通知NameNode 文件写入完成。NameNode 接收到complete 消息之后,等待相应数量的副本写入完毕后,告知客户端。


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值