2021山东大学软件工程应用与实践项目实践——Hadoop源码分析(一)

2021SC@SDUSC
Hadoop源码分析(一)——HDFS架构和分布式文件系统

1.分布式文件系统概述

分布式文件系统是分布式系统的关键技术之一,能够以文件的方式实现信息资源的共享。在云计算环境中,分布式文件系统承扣着为用户提供文件服务的重任,它要保证用户在访问、保存云中的文件时能够获得接近甚至在某些方面超出其在使用本地磁盘时的服务质量。分布式文件系统通过网络为用户提供远程文件服务,它的设计目标是要使得用户感知不到其访问的是存储在远程服务器中的文件。因此,分布式文件系统的设计特别强调系统对用户的透明性。满足用户的透明性需求对于分布式文件系统设计非常关键,直接影响了用户对远程文件的访问体验。除此以外,还有其他一些设计需求,包括分布式文件系统需要具有高可用性,能够支持异构客户端的并发访问,能够提供文件数据的多个拷贝并保证文件数据的一致性和安全性等。

2.HDFS的特点

HDFS的设计目标是为了存储超大数据文件,而且提供了对数据的流式访问接口。他的主要特点有:

  • HDFS认为硬件出错是经常发生的,HDFS部署在由廉价机器组成的集群中,其必须保证当某些节点发生故障时,整个集群的工作不会受到影响。
  • HDFS支持超大规模的数据集。hdfs上的典型文件的大小从几十GB到几TB,整个数据量可以达到几十PB。
  • HDFS采用了“一次写入多次读取”的文件访问模型。这种文件访问模型可以很容易地处理数据的一致性问题,并使高吞吐量的数据访问成为可能。
  • HDFS提供了类似于流式的数据访问模式。hdfs中节点之间的数据传输和访问并不是标准的流式模型,而是类似流式。更多考虑的是数据的批量处理,而不是用户的交互处理。节点讲数据以较小的数据包形式传输。
  • HDFS提供了很强的容错处理能力。将大文件分割成多个小文件块分开存储,并采取了完全备份的策略,每个文件块的副本数量至少为3个。
  • HDFS具有很强的系统扩展性。可以动态的向集群中添加或从集群中撤出节点,而不影响系统的稳定和用户的使用
  • HDFS具有良好的平台移植性。由于是用Java语言开发,所以可以运行在Linux、Windows等操作系统上。

3.HDFS文件系统架构

HDFS的系统架构采用典型的主从( master - slave )架构,整个 HDFS 集群由一个 NameNode 、一个 SecondaryNameNode 和若干个 DataNode 组成。 NameNode 是一个中心服务器,负责管理整个文件系统的命名空间元数据和客户端对文件的访问。 SecondaryNameNode 做为 NameNode 的备份结点存在 会定期对 NameNode 上的系统信息文件进行备份。一般情况下,一个结点上运行一个 DataNode ,主要负责存储用户数据的存储,并在 NameNode 的控制下进行数据的读写和出错处理。在 HDFS 内部,一个文件会被分割成一个或多个 Block ,这些 Block 存储在 DataNode 上。

HDFS文件系统的架构图

4.DistributedFileSystem分布式文件系统

DistributedFileSystem 所在的包为org.apache.hadoop.hdfs,它继承自FileSystem抽象文件系统,代表Hadoop的分布式文件系统。

4.1 静态代码块

static{
Configuration.addDefaultResource("hdfs-default.xml");
Configuration.addDefaultResource("hdfs-site.xml");
}

hdfs-default.xml是hdfs默认的配置文件,hdfs-site.xml是用户可以根据需要进行定制的配置文件。如果hdfs-site.xml中定义的配置在hdfs-default.xml中已经存在,则会覆盖掉hdfs-default.xml中相关的默认配置项。

4.2 成员变量

//HDFS的工作目录
private Path workingDir; 
//hdfs的uri
private URI uri;
//hdfs 的客户端
DFSClient dfs;
//用于标识对hdfs中的文件进行校验和验证的变量
private boolean verifyChecksum = true;

4.3 内部类

DistributedFileSystem中有一个内部静态类DiskStatus,该类用于表示HDFS中磁盘使用情况的统计信息。DiskStatus的源代码如下:

//磁盘总容量
private long capacity;
//dfs已经使用的磁盘容量
private long dfsUsed;
//可用的磁盘容量
private long remaining;

private DiskStatus(long capacity, long dfsUsed, long remaining) {
this.capacity = capacity;
this.dfsUsed = dfsUsed;
this.remaining = remaining;
}

public long getCapacity(){
return capacity;
}
public long getdfsUsed(){
return dfsUsed;
}
public long getremaining(){
return remaining;
}

DiskStatus 的成员变量在构造方法中初始化,也提供了用于访问这些成员变量的get方法。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值