Hadoop HDFS原理

原创 2015年11月18日 22:26:05

1 Hadoop搭建环境:

  • 虚拟机操作系统: CentOS6.6 64位,单核,1G内存
  • JDK:1.7.0_55 64位
  • Hadoop:1.1.2

2 HDFS原理

HDFS(Hadoop distributied File System)是一个分布式文件系统,是谷歌GFS文件系统的山寨版,它具有高容错性并提供了高吞吐量的数据访问,非常适合大规模数据集上的应用,它提供了一个高容错性和高吞吐量海量数据存储解决方案。

  • 高吞吐量访问:HDFS的每个block分布在不同的rack上,在用户访问时,HDFS会计算使用最近的和访问量最小的服务器给用户使用,由于block在每一个rack上都有备份,所以不再是但数据访问,于是速度和效率是非常快的,另外HDFS可以从并行服务集群中进行读写,增加了文件读写的访问带宽。
  • 高容错性:系统故障是不可避免的,如何做到故障后的数据恢复和容错是至关重要的,HDFS通过多方面保障了数据的高可靠性,多份复制并且分布存储在不同物理位置的不同服务器上,数据校验功能、后台的连续自校验数据一致性功能,都为数据的高容错性提供了可能。
  • 在线扩展:因为HDFS的Block信息存放在NameNode上,文件的Block分布在dataNode上,当扩充的时候仅仅添加DataNode数量,系统可以在不停止服务的情况下进行扩充,不需要进行人工干预。
3、HDFS架构


如上图所示HDFS是Master和Slave的结构,分为NameNode、Secondary NameNode和DataNode三种角色。

  • NameNode:在Hadoop1.X中只有一个master节点,管理HDFS的名称空间和数据库映射信息、配置副本策略和处理客户端的请求;
  • Secondary NameNode:辅助NameNode,分担NameNode的工作,定期合并fsimage和fsedits并推送给NameNode,紧急情况下可以辅助恢复NameNode;
  • DataNode:Slave节点,实际存储数据、执行数据块的读写并汇报存储信息给NameNode;
2.2 HDFS读操作


  • 1、HDFS的客户端通过调用FileSystem的open()方法来打开希望读取的文件,对HDFS来说,这个对象是分布式文件系统中的一个实例。
  • 2、DistributionFileSystem通过使用PRC来调用NameNode,以确定文件的起始块的位置,同一个block会按照重复数会返回多个位置,这些位置会按照Hadoop集群拓扑结构排序,距离客户端近的排在前面;
  • 3、前两步会返回一个FSDataInputStream对象,该对象会被封装成FSDataInputStream对象,DFDataInputStream可以方便管理datanode和NameNode的数据流,客户端对这个输入流调用read()方法;
  • 4、存储在文件起始位置的DataNode地址的FSDataInputStream对象,随机连接距离客户端最近的DataNode,通过对数据流反复调用read()方法,可以将数据从DataNode返回传输到客户端;
  • 5、到达块的末端时,DSDataInputStream会关闭与该DataNode的连接,然后寻找下一个块的最佳DataNode,这些操作对客户端来说是透明的,但是从客户端角度来看,只是一个读一个持续不断的数据流;
  • 6、一旦客户端完成读取,就对DSDataInputStream调用close()方法来关闭文件读取。
2.3 HDFS写操作


  1. 客户端通过调用DistributedFileSystem的create()方法创建新文件;
  2. DIStributedFileSystem通过PRC调用NameNode去创建一个没有Blocks关联的新文件,创建前NameNode会调用各种校验,比如文件是否存在,客户端有无权限去创建等,如果校验通过,NameNode会为创建新文件记录一条记录,否则会抛出IO异常;
  3. 前两步结束后,会返回FSDataOutputStream的对象,和读文件的时候相似,FSDataoutputStream被封装成DFSOutputStream,DFSOutputStream可以协调NameNode和DataNode,客户端开始写数据到DFSOutputStream,DFSOutputStream会把数据切成一个个小的数据包,并写入到内部队列中,数据队列被称为“数据队列”(data queue);
  4. DataStreamer会去处理接收DataQueue,它先询问NameNode这个新的block最适合存储在那几个DataNode里,比如重复数据是3,那么就找到3个最适合的DataNode,把他们排成一个pipeline.DataStreamer,把Packer按队列输出到管道的第一个DataNode中,第一个DataNOde又把Packer输出到第二个DataNode中,以此类推;
  5. DFSOutputStream还有一个队列叫Ack Quene,也是由packer组成,等待DataNode收到响应,当Pipeline中的所有DataNode都表示已经收到的时候,这是Ack quene才会把对应的package包移除掉;
  6. 客户端完成写数据后,调用close()方法关闭写入流;
  7. DataStreamer把剩余的包都刷到Pipeline里,然后等待Ack信息,收到最后一个Ack后,通知NameNode把文件标识为已完成。

3 测试例子1

3.1 运行代码

<span style="font-size:18px;">import java.io.InputStream;

import java.net.URI;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.*;
import org.apache.hadoop.io.IOUtils;

public class FileSystemCat {
    public static void main(String[] args) throws Exception {
        String uri = args[0];
        Configuration conf = new Configuration();
        FileSystem fs = FileSystem. get(URI.create (uri), conf);
        InputStream in = null;
    try {
            in = fs.open( new Path(uri));
            IOUtils.copyBytes(in, System.out, 4096, false);
        } finally {
            IOUtils.closeStream(in);
        }
    }
}</span>

3.2 实现过程

3.2.1 创建代码目录

使用如下命令启动Hadoop

[root@hadoop hadoop]# cd /hadoop/hadoop-1.2.1/bin/
[root@hadoop bin]# 
[root@hadoop bin]# 
[root@hadoop bin]# ./start-all.sh 
在/hadoop/hadoop-1.1.2

目录下使用如下命令建立myclass和input目录:

[root@hadoop hadoop-1.2.1]# 
[root@hadoop hadoop-1.2.1]# mkdir myclass
[root@hadoop hadoop-1.2.1]# mkdir input

3.2.2 建立例子文件上传到HDFS中

进入/hadoop/hadoop-1.1.2/input目录,在该目录中建立quangle.txt文件

[root@hadoop hadoop-1.2.1]# cd /hadoop/hadoop-1.2.1/input/
[root@hadoop input]# pwd
/hadoop/hadoop-1.2.1/input
[root@hadoop input]# 
[root@hadoop input]# 
[root@hadoop input]# vi quangle.txt

粘贴内容为:

On the top of the Crumpetty Tree
The Quangle Wangle sat,
But his face you could not see,
On account of his Beaver Hat.

使用如下命令在hdfs中建立目录/class4

[root@hadoop input]# hadoop fs -mkdir /class4
Warning: $HADOOP_HOME is deprecated.
[root@hadoop input]# hadoop fs -ls /
Warning: $HADOOP_HOME is deprecated.
Found 2 items
drwxr-xr-x   - root supergroup          0 2015-11-19 02:48 /class4
drwxr-xr-x   - root supergroup          0 2015-11-18 21:48 /hadoop
[root@hadoop input]# 

通过 如下命令把例子文件上传到hdfs的/class4文件夹中



版权声明:本文为博主原创文章,未经博主允许不得转载。

Hadoop中HDFS工作原理

Hadoop其实并不是一个产品,而是一些独立模块的组合。
  • sdlyjzh
  • sdlyjzh
  • 2014年06月06日 14:01
  • 8142

一篇很好的Hadoop入门文章:Hadoop是什么、核心HDFS与MapReduce的原理

Hadoop一直是我想学习的技术,正巧最近项目组要做电子商城,我就开始研究Hadoop,虽然最后鉴定Hadoop不适用我们的项目,但是我会继续研究下去,技多不压身。 《Hadoop基础教程》是我...
  • zhangliangzi
  • zhangliangzi
  • 2016年07月30日 10:12
  • 3656

【Hadoop】HDFS的运行原理

简介 HDFS(Hadoop Distributed File System )Hadoop分布式文件系统。是根据google发表的论文翻版的。论文为GFS(Google File System)Go...
  • weixuehao
  • weixuehao
  • 2013年11月26日 16:58
  • 9824

Hadoop -- HDFS 原理、架构与特性介绍

阅读目录 1:当前HDFS架构详尽分析 2:HDFS文件读取的解析 3:HDFS文件写入的解析 4:副本机制 5:HDFS负载均衡 6:HDFS机架感知 7:HDFS访问   8:HDFS 健壮...
  • shineHoo
  • shineHoo
  • 2015年07月16日 15:10
  • 1953

Hadoop 1.x HDFS理论和底层原理

本文为博主原创,允许转载,但请声明原文地址:http://www.coselding.cn/article/2016/05/31/Hadoop 1.x HDFS理论和底层原理/ 1、 NameNod...
  • u014394255
  • u014394255
  • 2016年12月03日 23:59
  • 466

Hadoop2.5.2学习04--HDFS原理及操作

Hadoop2.5.2学习04--HDFS原理及操作
  • wuxintdrh
  • wuxintdrh
  • 2017年01月22日 21:55
  • 391

hadoop HDFS存储原理

来源url:http://www.36dsj.com/archives/41391 根据Maneesh Varshney的漫画改编,以简洁易懂的漫画形式讲解HDFS存储机制与运行原理...
  • u013160024
  • u013160024
  • 2016年08月09日 11:28
  • 8574

Hadoop入门-2.HDFS原理和工作机制(基于hadoop-2.7.3)

简介        Hadoop分布式文件系统(HDFS)被设计成适合运行在通用硬件(commodity hardware)上的分布式文件系统。它和现有的分布式文件系统有很多共同点。但同时,它和其他的...
  • qq342643414
  • qq342643414
  • 2017年02月28日 15:37
  • 319

Hadoop分布式文件系统HDFS的工作原理详述

Hadoop分布式文件系统(HDFS)是一种被设计成适合运行在通用硬件上的分布式文件系统。HDFS是一个高度容错性的系统,适合部署在廉价的机器上。它能提供高吞吐量的数据访问,非常适合大规模数据集上的应...
  • zhouzxi
  • zhouzxi
  • 2015年07月16日 08:48
  • 6159

Hadoop学习<四>--HDFS的RPC通信原理总结

这里先写下自己学习RPC的笔记总结,下面将详细介绍学习过程: RPC(remote procedure call)   不同java进程间的对象方法的调用。   一方称作服务端(server),...
  • zeb_perfect
  • zeb_perfect
  • 2014年12月13日 10:28
  • 993
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Hadoop HDFS原理
举报原因:
原因补充:

(最多只允许输入30个字)