Hdfs分布式文件系统

简介

当数据集超过一台计算机的存储能力时,就有必要对它进行分区(partition)并存储到若干台单独的计算机上。管理网络中跨多台计算机存储的文件系统称为分布式文件系统(distributed filesystem)。

特性

HDFS 以流式数据访问模式来存储超大文件,运行于商用硬件集群上。

超大文件

能支持PB级别数据。

流式数据访问

HDFS的构建思路是这样的:一次写人、多次读取是最高效的访问模式。

商用硬件

Hadoop 并不需要运行在贵且高可靠的硬件上。

低时间延迟的数据访问

要求低时间延迟数据访问的应用,例如几十毫秒范围,不适合在HDFS上运行。

大量的小文件

由于namenode 将文件系统的元数据存储在内存中,因 此该文件系统所能存储的文件总数受限于namenode 的内存容量。根据 经验,每个文件、目录和数据块的存储信息大约占 150 字节。因此,举 例来说,如果有一百万个文件,且每个文件占一个数据块,那至少需要 300 MB 的内存。尽管存储上百万个文件是可行的,但是存储数十亿个 文件就超出了当前硬件的能力。

多用户写入,任意修改文

不支持多个写人者的操作,也不支持在文件的任意位置进行修改。

数据块

磁盘块一般为512字节,hdfs也有块的概念,默认是128mb。但是区别是不足一个块的文件不会占据整个块的空间。

为什么hdfs的块那么大?

目的是为了减少寻址时间。假设块设置的足够大,这样数据传输时间就会明显大于寻址时间,从而让传输一个文件的时间取决于带宽。

namenode 和 datanode

namenode 管理文件系统的命名空间。它维护着文件系统树及整棵树内所有的文件和目录。namenode也维护着每个块所在的数据节点信息。

datanode 是文件系统的工作节点。它们根据需要存储并检索数据块(受客户端或 namenode 调度),并且定期向namenode 发送它们所存储的块的列表。

假如namenode损坏,就意味着所有文件将会丢失。因为无法根据datanode的块来重建文件。所以1个高容错的namenode至关重要。通常有2种方案保证:

  1. 备份组成文件系统元数据的文件到远程机器。

  2. 新建1个辅助的namenode,定期去将主namenode的编辑日志进行合成命名空间镜像,同时进行保存到自己节点。需要注意的是,合并编辑日志需要占用大量的CPU。

联邦HDFS

在2.x 发行版本系列中引人的联邦HDFS 允许系统通过添加 namenode 实现扩展,其中每个namenode 管理文件系统命名空间中的一部分。例如,一个namenode 可能管理/user 目录下的所有文件,而另一个namenode 可能管理/share 目录下的所有文件。

文件读取

文件写入流程

FsDataOutputStream维护者一份数据包队列来等待datanode的确认返回,成为确认队列。只有在收到datanode的确认返回后,才会从队列里面删除。

在写入数据期间,如果datanode发生故障,会把数据包信息记录在一个好的datanode中进行表决,然后上报给namenode。等故障datanode恢复后,进行部分数据删除。

DictCp并行复制

主要使用场景是在两个HDFS集群中进行数据大量传输。

例子:

序列化

hadoop实现了自己的序列化。

java基本类型
writable实现
字节大小

boolean

BooleanWritable

1

byte

ByteWritable

1

int

IntWritable/VIntWritable

4/1-5

float

FloatWritable

4

long

LongWritable/VLongWritable

8/1-9

double

DoubleWritable

8

为什么没有使用java的序列化?

java序列化无法满足hadoop所需要的序列化的标准:精简,快速,可扩展,可以互操作。

java的序列化需要把类名写到字节流,后续实例的出现只引用第一次出现的句柄,这会占用5个字节。通过句柄访问也会破坏随机访问和排序。

基于文件的数据结构

SecquenceFile

提供了二进制键/值对永久存储的数据结构。

MapFile

一种排好序的SecquenceFile结构。可以视为java.util.Map的持久化形式。表现形式是一个包含有data和index的文件夹。

data文件:

存储着键和数据的映射。

index文件:

存储着键和偏移量的映射。

Last updated