作为一种分布式系统框架,Hadoop必须拥有不同于基于单一硬盘环境下的分布式文件系统,一个典型的特征是可以应对网络上常见的单点失效问题(SNOF)。最初设计Hadoop分布式文件系统时主要考虑以下几个问题:大数据存储、便捷的流数据访问(一次写入多次读取)和网络使用的稳定性解决方案。
Concepts:
HDFS主要有以下四个关键的概念:
1. 块(blocks)
一般来说,每个硬盘都有自己的存储块大小,而文件系统则有自己逻辑上的块大小。HDFS的默认块大小是64,便于分块存取单个硬盘无法容纳的大文件;通过引入块的概念,实际中在每个节点上管理数据块即可,简化了管理操作;为了保持冗余,每个块都会有多个副本存储于其他的数据节点上,默认一般是保留三份。
2. Namenodes/Datanodes
HDFS采用了主仆模式管理所有的节点(Master-Worker),其中Namenode负责管理所有的Datanode,而Datanode则负责存储具体的文件块。Namenode中存储着HDFS的Namespace,其中主要表现为namespace镜像和edit.log两种文件。在namespace镜像中维护着HDFS的文件系统树结构以及所有目录/文件的元数据信息。Namenode中还保存着每个文件的每一个块所在的Datanode信息,便于确定具体某个块的位置。Datanode存储数据块,并且通过Heartbeating周期性地向Namenode报告自己的状态。
为了增强HDFS的稳定性,一般有两种方法:一种是备份当前的元数据信息,随着系统的运行,这部分信息会越来越多,将它们存储到不同的文件系统中;另一种是合并namespace的镜像文件作为secondary namenode。当Namenode发生故障时,使用备份的namespace镜像和元数据备份就可以定位checkpoint恢复出Namenode。但是这种情况只能用于Namenode出现软件故障时,如果整个节点down掉则没有办法恢复。
3. HDFS的联合
有可能出现这样的情况:目标数据库实在太大,只用一个Namenode难于管理,于是可以引入两个Namenode,每个管理不同的文件区域。
4. HDFS High-Availability
为了应对Namenode整机down掉的情况,HDFS提供了另一种机制:active-standby。其实很简单,就是提供两台Namenode,一台用作active使用,另一台拥有和第一台相同的实时状态,处于standby状态;一旦active宕机,可以将第二台切换到active状态。这里的设置需要注意两点:一是必须确保所有的Datanodes同时向active和standby发送状态报告;二是必须对于Client来说active和standby是透明的。
HDFS的命令行接口(The Command-Line Interface)
HDFS提供了方便的命令行接口用于访问操作HDFS,由于自己很快也要在项目中用到,所以就看几个基本的命令模式。
1. 将本地文件拷贝到HDFS
HDFS使用URL形式来标识文件位置,具体命令为:
#hadoop fs -copyFromLocal src/file hdfs://localhost/dst/file //默认都是在localhost进行操作
这里的localhost为fs.default.name的默认值,该值位于conf/core-site.xml中
2. 创建目录
#hadoop fs -mkdir books
#hadoop fs -ls
//Linux风格的命令格式
数据流(Data Flow)
学习HDFS应当对其中的数据流有些了解,自己简单看了下,可能比较浅显,先总结一下以后加深吧!
1. 读入文件流
当要从HDFS中查找一个文件时,首先需要在DFS上打开文件对象,然后RPC下Namenode获得目标文件的数据块所在的Datanode信息,然后在FSDataInputStream中开始查找相应的Datanode读取blocks。值得注意的是,虽然在Namenode中含有目标文件所有数据块的位置信息,但是每次RPC命名节点时FSDataInputStream只能获取一部分块的位置信息,后续需要多次RPC命名节点获得其他数据块的位置信息。基本过程如下:
2. 写入文件流
当准备向HDFS中写入文件时,首先当然要创建一个DFS对象,然后需要在Namenode中添加相应的namespace信息,但是这之前需要经过Namenode对写入者的权限认证,通过之后便会在Namenode中的namespace中添加新的信息并且为文件分配Datanodes。而后进入FSDataOutputStream对象,向Namenode分配的Datanodes写入数据块,这里需要注意的是为了保证冗余,每个数据块默认会有两份备份,即一共有三份相同的数据块位于不同的Datanode中。FSDataOutputStream首先向一个指定的Datanode写入数据,然后该Datanode自动转发该数据块到另一个指定的Datanode中,依次完成三块Datanode的写入工作。每次写入成功后Datanode都会像FSDataOutputStream发送ACK确认,以保证数据块的成功写入。基本过程如下:
阅读(1787) | 评论(0) | 转发(0) |