Chinaunix首页 | 论坛 | 博客
  • 博客访问: 3036528
  • 博文数量: 167
  • 博客积分: 613
  • 博客等级: 中士
  • 技术积分: 5473
  • 用 户 组: 普通用户
  • 注册时间: 2011-09-13 21:35
个人简介

人, 既无虎狼之爪牙,亦无狮象之力量,却能擒狼缚虎,驯狮猎象,无他,唯智慧耳。

文章分类
文章存档

2015年(19)

2014年(70)

2013年(54)

2012年(14)

2011年(10)

分类: HADOOP

2013-07-25 15:16:17

     作为一种分布式系统框架,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确认,以保证数据块的成功写入。基本过程如下:

阅读(4195) | 评论(0) | 转发(1) |
给主人留下些什么吧!~~