惊呆了

惊呆了

hadoop分布式文件系统hdfs具有的特性 Hadoop生态体系学习笔记(一)HDFS分布式文件系统理论基础

访客

本文仅仅只是个人学习的笔记,不代表一定就是对的,仅供参考。

分布式计算的思想为“分治”,由于信息技术的发展,数据的量级变得越来越大,但是一台单机处理数据的能力有限。

比如现在有这样的一个需求:

有两个txt文件,里面有几百亿行甚至上千亿行的数据,但是这两个文件的数据只有一行是一样的(即两个文件,文件A的某一行数据与文件B里面的一行数据是相同的),要从中找到这两行一样的数据,返回各自的行数。

假设这两个文件的大小为1TB,内存大小是8G,这么大的两个文件不可能将所有的数据全部装到内存中去,所以只能使用IO读取,但是内存的寻址速度大约是磁盘IO的10万倍,所以IO就成为了单机的一个很大的瓶颈。的确是有超大内存的计算机存在,但是它的成本很高,所以,搭建集群就成为了一种很好的选择。

在Hadoop生态体系当中,有一个分布式文件系统:Hadoop Distributed File System hdfs

在我看来,HDFS是为了更好地支持Hadoop体系下的分布式计算而开发出来的。

从我学习的过程来看,我认为学习HDFS,需要从以下几个方面入手:

1、存储模型

文件线性(线性就是顺序的意思)按字节切割成(block),具有offset,id。无论是什么文件,图像文件,文本文件,视频音频文件都是一堆字节,每个块都有这个文件的偏移量,比如4个字节一个块,第一个块偏移量是0,第二个偏移量就是4,第三个偏移量是8……

文件与文件的block大小可以不一样(也就是说两个文件的block大小可以不一样)。按字节去切,一定会将文件切坏,计算的时候想要数据完整性要在计算层去解决。

一个文件除最后一个block,其他block大小一致。

block的大小根据硬件的I/O特性调整。

block被分散存放在集群的节点中,具有location。“块”在“哪里”不能丢,location就是地址,知道它们在哪儿。

block具有副本(replication),没有主从概念,副本不能出现在同一个节点。副本数是包括自己本身的,比如一个文件的副本有3个,就是包括它自己一共3个。

副本是满足可靠性和性能的关键。

文件上传可以指定block大小和副本数,上传后只能修改副本数。

一次写入多次读取,不支持修改。如果修改数据,会导致后面的块的偏移量发生变化,会发生“泛洪”现象,所以hdfs不支持修改,删除,上传,读取都支持,就是不支持修改。删除是删除文件,不是删除块,hdfs是文件系统,它面对的对象是文件,不是block。

支持追加数据。可以在最后一个块中追加数据或添加新的块,不会导致“泛洪”。

hdfs被开发出来就是为了更好地支持计算层。

2、架构设计

HDFS是一个主从(Master/Slaves)架构。主从两个都是活动的,它们之间是有通信和协作的。主备是一个活动一个备用,一般在高可用环境下,一个挂掉另一个顶上去。

由一个NameNode和一些DataNode组成。NameNode为主,DataNode为从。

面向文件包含:文件数据(data)文件元数据(metadata)。文件数据是指文件本身的数据,文件元数据在Windows系统中就是指文件属性,就是鼠标右键可以打开属性,这里的属性的专业名称就是文件元数据。

NameNode负责存储和管理文件元数据,并维护了一个层次型的文件目录树。文件名,文件大小,被切成几个块等等这些和文件本身数据无关的信息由NameNode存储,HDFS叫做文件系统,它与linux系统相似,也有一棵目录树,但不是物理操作系统的目录树。

DataNode负责存储文件数据(block块),并提供block的读写。客户端想要读写文件的时候,大部分时间是与DataNode交流,与NameNode只有短暂的交流。

DataNode与NameNode维持心跳,并汇报自己持有的block信息。分布式集群的时候通信实现数据同步。

Client和NameNode交互文件元数据,Client和DataNode交互文件block数据。客户端与NmaeNode交互的是文件元数据,客户端和DataNode交互的是文件block数据,客户端和DataNode交互数据之后由DataNode向NameNode汇报。

3、角色功能

NameNode

(1)完全基于内存存储文件元数据、目录结构、文件block的映射。

(2)需要持久化方案保证数据可靠性。

(3)提供副本放置策略。

DataNode

(1)基于本地磁盘存储block(文件的形式)。

比如将一个文件切成了10个块,这个块是一个逻辑的概念,这些块会变成10个小文件,1号文件,2号文件,3号文件……这些文件被打散扔到集群中的10台机器里面,每个机器里面会有一个DataNode,一个DataNode就是一个JVM进程,客户端将第一个小文件扔给DataNode进程,DataNode收到小文件之后,会将它存在DataNode所在的操作系统的本地磁盘文件系统中。

(2) 并保存block的“校验和”数据保证block的可靠性。校验和就是校验文件有没有损坏的校验,在通信时生成的一串字符。

(3)与NameNode保持心跳,汇报block列表状态。

4、副本放置策略

第一个副本:放置在上传文件的DN;如果是集群外提交,则随机挑选一台磁盘不太满,CPU不太忙的节点。

第二个副本:放置在与第一个副本不同的机架的节点上。(一定要出机架,要在不同的机架上,防止一个机架整个挂掉,比如电源坏了,通信断了等等)

第三个副本:与第二个副本相同机架的节点。前三个副本的规律一般都是这样的。

更多副本:随机节点。

参考文献:

[1] 百度百科

[2] 马士兵教育之MCA课程https://www.mashibing.com/subject/1

标签: 分布式