HDFS 简介

来源:互联网 发布:sql批量insert 编辑:程序博客网 时间:2024/05/29 19:38

HDFS是Hadoop分布式文件系统(Hadoop Distributed File System),它以文件系统的形式为应用提供海量数据存储服务,具有高容错的特点,它可以部署在廉价的通用硬件上,提供高吞吐率的数据访问。HDFS并不支持标准的UNIX命令如”ls”或”cp”,而是提供一套特有的、基于Hadoop抽象文件系统的API,支持以流的形式访问文件系统中的数据。

主要特性

  1. 支持超大文件
    –单个文件为几百MB甚至更大,一个Hadoop文件系统存储TB甚至PB级别的数据。
  2. 检测和快速应对硬件故障
    –一个Hadoop系统可能由数百甚至更多的服务器组成,这意味着高故障率。因此故障检测与自动恢复是HDFS的一个设计目标。
  3. 流式数据访问
    –HDFS通常处理的数据规模比较大,应用一般是批量处理,HDFS使应用程序以流的形式访问数据集,注重数据的吞吐量,而不是数据访问的速度。
  4. 简化的一致性模型
    –HDFS一般是需要一次写入多次读取。一个文件一量创建写入后,一般就不需要修改了。这种一致性模型有助于提供高吞吐量的数据访问模型。

体系结构

HDFS采用了主从(Master/Salve)体系结构,主要包括名字节点 (NameNode)、数据节点(DataNode)和客户端(Client)3个重要角色。名字节点通常有两个,一个NameNode和一个SecondaryNameNode,数据节点可以有很多,规模大的可以有上千甚至更多,而客户端可能比数据节点个数还要多。详见下图,

这里写图片描述

以下详细说明几个概念的含义,

  1. 名字节点
    –NameNode:分布式文件系统中的管理者,负责管理文件系统命名空间、集群配置和数据块复制等。名字节点中有两个重要的文件:一个是命名空间镜像(FSImage),另一个是命名空间镜像的编辑日志(Edit Log),FSImage保存某一特定时刻HDFS的目录树、元信息和数据块索引信息,后续对这些信息的改动则保存在Edit Log中,它们一起提供了一个完整的名字节点第一关系。
    –SecondaryNameNode:用于定期合并上述FSImage和Edit Log。与NN不同的是,它并不接收或记录HDFS的任何实时变化,而只是根据集群配置的时间间隔不停地获取HDFS某一时间点的FSImage和Edit Log并合并成一个新的FSImage,然后该FSImage又上传到NN并替换原有的FSImage并清空NN上面的Edit Log。因此,SNN是为了配合NN提供一个Checkpoint机制,并避免出现Edit Log过大而导致NN启动时间过长的问题。若NN失效了,SNN并不支持NN的自动恢复,此时需要人工干预。
  2. 数据节点
    –文件存储的基本单元,以数据块的形式保存HDFS中文件的内容和数据块的数据校验信息。当客户端进行文件内容操作时,先从名字节点获取每个数据块驻留在哪个数据节点,然后客户端直接与数据节点进行通信处理对应的文件。同时,数据节点会和其他数据节点通信,复制数据块,保证数据的冗余性。数据节点会不断地向名字节点报告本地修改的相关信息,并接受来自名字节点的指令,创建、移动或删除本地磁盘上的数据块。
  3. 客户端
    –客户端和名字节点、数据节点通信,访问HDFS文件系统,操作文件。HDFS提供多种客户端,包括命令行接口、Java API、Thrift、C语言库等。命令行工具可以进行一些典型的文件操作,如读文件、创建路径、移动文件、删除文件、列出文件列表等,同时也提供本地文件和HDFS交互的能力,如下命令将本地文件上传HDFS,
    hadoop fs -copyFromLocal /test.txt /user/hadoop/test.txt
  4. 数据块
    –文件系统实现的时候,为了便于管理,设备一般将存储空间组织为具有一定结构的存储单位,比如在磁盘中,文件是以块的形式存储的,块大小代表系统读/写操作的最小单位,Linux的Ext3中块大小默认为4096字节。HDFS也是块的概念,不过默认的块大小是64MB。使用大数据块,可以减少名字节点上管理文件和数据块的开销,同时,在读写数据块的时候可以有效减少建立网络连接的成本。
0 0