关闭

Hadoop HDFS原理

标签: 文件系统hadoop解决方案hadoop集群架构
289人阅读 评论(0) 收藏 举报
分类:

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文件夹中



0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:21096次
    • 积分:457
    • 等级:
    • 排名:千里之外
    • 原创:25篇
    • 转载:13篇
    • 译文:0篇
    • 评论:0条