回顾——HDFS文件系统

来源:互联网 发布:小游戏 知乎 编辑:程序博客网 时间:2024/06/05 21:13

(上一节我们介绍了Hadoop是什么,以及包括哪些模块,本节开始我们分别详细介绍HDFS,MapReduce和YARN。由于HDFS是整个Hadoop的中流砥柱,而且也是部署集群时最先配置的模块,所以我们先介绍HDFS。)

HDFS,Hadoop Distributed File System, Hadoop分布式文件系统(管理网络中跨多台计算机存储的文件系统称为分布式文件系统),来源于谷歌的论文——GFS。大数据相关框架都需要建立在HDFS之上,因为数据保存在这里,同时也有其他的一些分布式文件系统,但主流的还是HDFS。据说我们经常使用的各种云盘,基本都是基于HDFS之上的,可能或多或少会有改动。

HDFS特点:
(1)流式数据访问,擅长一次写入多次读取
(2)集群机器要求不高,搭建成本低,不需要昂贵的服务器
(3)吞吐量高,但是时间延迟较长,如果需要延迟较低则选择HBase存储
(4)由于文件元数据存在内存中,所以对namenode节点内存要求较高,也是一个瓶颈。
(5)超大文件,可以存储上TB,PB或以上的文件

一、存储机制:
块:在HDFS文件系统中,文件是以块的形式进行存储,我们一般都将其设置为128MB。HDFS的块比磁盘的要大,目的是为了减少寻址开销。当寻址开销足够小的时候,传输一个由多个块组成的文件速率就取决于磁盘的传输速率了。
复本:HDFS也提供了良好的数据容错能力和高可用性。HDFS默认将每份文件默认存储在3个地方,可以确保在某个磁盘或机器发生故障时数据不会丢失。当出现问题时,丢失的块的部分可以从其他的候选位置复制到另外一台正常运行的机器上,保证复本数在正常水平。一般数据在本地存储一份,同机架不同机器上存储一份,不同机架的机器上存储一份。(其中貌似要用的一种叫机架感知的技术,自行百度)

二、HDFS架构

HDFS存在两类节点,一般是一个namenode和多个datanode。因为namenode也存在挂掉的危险,所以在hadoop2.0以前,HDFS以一个叫做secondarynamenode的节点对namenode做备份。但是这个节点存储的信息一般总是比namenode滞后,所以在hadoop2.0以后我们就使用Zookeeper来做HDFS的HA方案(详细见后),自然secondnamenode现在就不用了。

这里写图片描述

(1)namenode节点
namenode管理的是整个文件系统文件的命名空间,维护着目录树和文件等元信息,包括fsimage(文件镜像)和edits(文件操作信息)。namenode启动流程如下:
1、首先将本地的fsimage和edits加载到内存,并将edits信息整合到fsimage。(由于在HDFS运行过程中edits存储的是文件操作信息,而fsimage还没有更新,所以在启动过程中要整合)
2、整合后创建新的fsimage和空的edits
3、此时hdfs处于安全模式,所有的文件都是只读的,这个期间各个datanode会向namenode发送报告。
4、当所有datanode都向namenode注册完毕后解除安全模式,hdfs正常运行。

(2)datanode节点
1、一个数据块以文件的形式存储在磁盘上,包括两个文件,数据本身和数据元信息(大小、校验和、时间戳等)。
2、datanode启动后会周期性的向namenode发送报告,报告所有块信息。
3、心跳机制,每3秒钟namenode会向各个datanode发送心跳信号,如果超过10分钟没有收到回应,默认这个datanode已经挂掉。
4、在hdfs中可以创建,删除,移动文件,但是不可以修改文件。

三、HDFS命令
在linux控制台中,我们可以以类似shell命令的方式对hdfs做操作(hdfs dfs -[命令] -[参数]…)。

这里写图片描述

hdfs的大多命令都和linux中的shell命令类似,例如:cat, rm, cp等等。
上传:hdfs dfs -put [本地文件目录] [HDFS目录] | hdfs dfs -put /tmp/data/input.txt /usr/data
下载:hdfs dfs -get [HDFS文件目录] [本地目录] | hdfs dfs -get /usr/data/input.txt /tmp/data

四、HDFS HA(HDFS 热备份)
在HDFS的高可靠性中,一般使用zookeeper来做自动故障转移。zookeeper通过一种选举机制来觉得其管理的几个namenode中哪一个作为active,哪一个作为standby。当其中有active挂掉的时候,zookeeper就通过这种机制来给HDFS做热备份。

这里写图片描述

通常zookeeper集群采用大于等于3台的技术个集群(3,5,7,9…)。因为在zookeeper中,超过半数以上的机器可用时才代表本集群可用。所以当集群数为4时,挂掉一台可用挂掉两台不可用;同样,集群数量为3时,也是挂掉一台可用挂掉两天不可用。所以就不用浪费那样一台机器了。

那么namenode确实实现了故障转移,可是数据呢?存在journalnode这样一个服务,在active活动时,journalnode同时把active上的数据同步到这里,然后再通过standby读取。

(今天就写到这里,HDFS中还存在一种联盟机制,多个namenode管理一个集群,目的是可以实现多个业务在同一个集群上进行而互不干扰,例如:爬虫,数据分析等等。在这里就不多介绍了,如果后续有时间会加进来。下一期会介绍MapReduce离线计算模型)

1 0