zoukankan      html  css  js  c++  java
  • hadoop之HDFS

    分布式文件系统HDFS

    需要实现以下的一些目标:

    1.  廉价的硬件设备

    2.  流数据读写(和传统系统区别的地方,全部的数据一股脑的读取)

    3.  大数据集(一个文件可能有时候大到好几个T)

    4.  简单的文件模型(获取了批量处理的特性,只能追加,不可以修改)

    5.  强大的跨平台特性(java开发的)

    HDFS的一些局限性:

    1.  不适合低延迟的数据访问(不能满足实时的处理需求)

    2.  无法高效存储大量的小文件(小文件目录索引太大会让内存数据变大)

    3.  不支持多用户写入及任意修改文件

    HDFS块:

    块要比普通文件大很多,面向大规模存储,为了减少寻址时候的开销。

    优点:

    1.  支持大规模文件的存储,将一个大文件切割,放到不同的机器上面

    2.  简化系统的设计,块的大小是固定的,方便管理元数据

    3.  方便数据的备份

     

    NameNode DataNode
    存储元数据(数据目录) 存储文件内容
    元数据保存在内存中  
       
       

    NameNode的数据结构:

    FsImage:用于维护文件系统树以及文件树中所有的文件和文件夹的元数据

      (文件的复制等级,修改和访问时间,访问权限,块大小,组成文件的块)

    EditLog:操作日志文件,记录了所有对文件的创建,删除,重命名等操作

    NameNode的启动:

    FsImage加载到内存,然后与EditLog合并,得到一个新的FsImage,然后创建一个空的EidtLog。这样做的原因是,FsImage太大,数据的修改会让系统变慢,所以文件的修改操作会在EditLog中执行,这样就快多了。

    当EditLog变大怎么办?

    SecondaryNameNode!!!!

    (1) SecondaryNameNode会定期和NameNode通信,请求其停止使用EditLog文件,暂时将新 的操作写到一个新的edit.new上面,这个操作是瞬间完成的

    (2) SecondaryNameNode通过HTTP GET从NameNode上获取FsImage和EditLog文件,下载到本地对应的目录下

    (3) 将下载的FsImage载入内存,一条条执行EditLog文件中的更新,这个过程就是FsImage和EditLog的合并操作

    (4) SecondaryNameNode执行完(3)之后,通过POST方式将新的FsImage文件发送给NameNode

    (5)NameNode替换FsImage,edit.new替换EditLog

    DataNode负责具体数据的存储:


    每个数据节点的数据保存到本地的linux文件系统当中

    通信协议:

    所有的HDFS协议都是构建在TCP/IP协议上面的

    客户端通过一个可配置的端口向名称节点发起TCP链接,使用客户端协议与名称节点交互

    名称节点和数据节点之间使用数据节点协议交互

    客户端与数据节点的交互是通过RPC(Remote Procedure Call)实现。

    HDFS设置唯一的名称节点的局限性:

    1.  命名空间的限制,所有的元数据保存在内存中,内存有上线,所以容纳的对象也有了上限

    2.  性能的限制

    3.  隔离的问题,命名空间只有一个

    4.  集群的可用性,一旦故障怎么办(第二名称节点是冷备份,不是热备份,需要停止一段时间才能启动,在后来的HDFS 2.0进行了改善)

    存储原理

    冗余数据的保存:

    1.  冗余会加快数据的传输速度,可以并行的访问

    2.  容易检查数据错误

    3.  保证数据的可靠性,一旦一个坏了,被系统周期性探测到会自动生成一个新的。

    数据的存放:

    第一个副本:如果是集群内部请求的,放在上传文件的数据节点,如果是集群外提交的放在一个磁盘不太满,cpu不太忙的节点

    第二个副本:与第一个副本不同的机架上

    第三个副本:第一个副本相同的机架上

    第四个副本:随机

    数据的读取:

    读取数据的时候,从名称节点获取不同的副本存放位置的列表,列表包含了副本所在的数据节点,可以调用API来确定客户端和这个数据节点所属的机架ID,如果ID相同就选择这个副本,不同就随机找一个。

    数据的错误与恢复:

    名称节点出错:

    在1.0当中需要停止用第二名称节点恢复(在2.0中已经不需要停机)

    数据节点出错:

    数据节点会定期向名称节点发送“心跳”信息。

    发生故障,或者网络中断的时候,没有收到心跳节点的数据会被标记为“宕机”,节点上面所有的数据都会标记“不可读”,名称节点不会再给他们发送请求

    一旦发现数据块备份数量小于冗余因子,就会启动数据冗余复制,生成新的副本

    HDFS和其他发你不是文件系统最大区别是可以调整冗余数据的位置。

    数据出错:

    当磁盘损坏的时候,数据出错。

    客户端在读取到数据的时候会使用md5和sha1校验码,去顶读取到正确的数据

    如果校验出错将会客户端请求另一个数据节点读取该文件块,并且向名称节点报告文件快错误。

    数据的读写过程


    FileSystem 通用的文件系统抽象基类

  • 相关阅读:
    浏览器原理
    jQ插件编写
    [转]清理浮动的全家
    百度面试~~
    LeetCode-222. Count Complete Tree Nodes
    LeetCode-236. Lowest Common Ancestor of a Binary Tree
    LeetCode-235. Lowest Common Ancestor of a Binary Search Tree
    LeetCode-102. Binary Tree Level Order Traversal
    LeetCode-404. Sum of Left Leaves
    LeetCode-257. Binary Tree Paths
  • 原文地址:https://www.cnblogs.com/da-peng/p/9085374.html
Copyright © 2011-2022 走看看