HDFS介绍

HDFS介绍:


什么是HDFS?

HDFS是一个分布式文件存储系统。

HDFS的优点:

1:容错(安全)

2:支持海量的数据存储

HDFS的缺点:

对于数据的写入,只是支持数据的写入,支持数据的删除,但是不支持数据的修改。

HDFS的配置文件:


在hadoop目录的etc目录下的hadoop之中,的hdfs-site.xml文件



HDFS的容错:

HDFS上面文件存储的时候,文件会按照配置的大小进行分块,

如果文件的本身的大小 小于设置分分块的值,文件会按照一个分块进行存储。

文件被分成分块之后,每个分块会按照设置的副本的数目,在hdfs上面存储。

如果设置的副本的数目为3,那么hdfs 上面,文件的块,会以三个副本的形式存在。

具体的配置参数:

文件分块的大小:默认的分块的大小是128m

在配置文件 hdfs-site.xml之中 如下配置


其中大小的单位是 字节。

hdfs分块的副本的数目的参数的配置:


容错的小结:hdfs实现容错的保证主要就是多副本存储。


HDFS的架构:

主从架构

HDFS的进程:

NameNode DataNode SecondaryNameNode

Namenode:中文名,名称节点

NameNode作用: 

1:管理namespace

    如何管理?记录名称空间文件的相应的 变化(就是文件的层级的变化)

    什么是namespace  (文件的相互之间构成的层级关系。)

2: 与Datanode 通信 获取Datanode 发送过来的心跳信息。

3: 管理文件块的复制

4:接收Datanode 发送过来的block报告 一小时一次

做一个简单的小结:NameNode 主要就是维护fsimage 和edit-log这两个文件。

那么namenode是如何知道数据是存储在那个datanode下面的?

hdfs在启动的时候,datanode会将自身包含的块的信息 发送给namenode

,namenode会在自身的内存之中建立一个Mapping

以blockId 为Key的mapping  后面是datanode的位置。


fsimage:存放着hdfs之中最新的元数据信息,(最新是相较于hdfs刚开始启动的时候。)

edit-log:主要记录hdfs在启动下,各种对hdfs的更新记录操作。HDFS客户端执行的所有的写的操作都是会

写入到edit-log之中的。

那么有一个问题:

随着集群的运行的时间过长,edit-log文件会不会变得非常大?

答案是否定的:

因为在达到一定的时间之后,或者是 edit-log文件达到一定的大小之后,会进行日志滚动。

日志滚动的意思是:对于文件系统的操作会写入一个新的edit-log文件之中,

就不会再写入原本的edit-log之中,这样的话,就是保证了一个edit-log文件不会变得非常大。


edit-log的例子


正在写入的edit-log文件


同时也是可以执行命令来实现手动实现日志滚动:

具体的命令:

hdfs dfsadmin -rollEdit

一个小小的提示:随着集群的运行时间过长,在文件系统之中会产生很多的edit-log文件,

可以写一个shell 脚本定时清理一下。

给出我的简单的shell清理脚本:


edit-log 清理脚本

但是具体的应用之中还是需要注意具体的场景。


如果hadoop集群的部署没有实现HA ,那么随着集群长时间运行,fsimage是通过 SecodaryNameNode

来进行更新的。

如果集群的部署实现了HA,那么fsimage的更新是通过另一种方式进行的。

正常情况下,集群的关闭 会导致产生新的fsimage,

但是也是可以通过手动的方式来实现产生新的fsimage 

具体的执行命令:

hdfs dfsadmin -savenamespace

但是需要注意:

想要手动生成元数据,首先让hdfs进入安全模式,

什么是安全模式? hdfs只能进行读,不能进行写。

有个小的提示:在集群启动的过程之中,hdfs也是会在短时间内进入安全模式。

如何查看节点上的fsimage之中的内容?

hdfs oiv -p XML -i fsimage -o

以xml的格式 将镜像文件转化成为xml文件格式。


查看编辑日志文件之中的内容的方式:

hdfs oev -p XML -i  inputFile -o outptFIle


NameNode 接收DatatNode 定时发送的心跳信息,从而确认相应的DataNode 是存活的。

NameNode 也会收到DataNode 上存储的块的列表的信息,

这里需要注意:Namenode 将块的信息存放在内存之中,这也其实就是为什么hadoop更加青睐大文件的原因,也就是hadoop不适合存储小文件。因为在NameNode内存一定的情况下,如果内存之中块信息对应的磁盘上的块存储的信息多一些,那么整个hadoop存储的数据信息就会很多。

NameNode 崩溃的后果:

如果集群没有配置高可用的话,那么整个集群的读和写都是会失效,基本就是完了。

所以解决的方法,就是实现hadoop的HA配置。




DataNode:数据节点,真实存放数据的节点。

DataNode的功能:

功能:

1:存储文件块

2:向namenode 发送心跳

3:向namenode 报告块的列表


启动HDFS:

调用 start-dfs.sh 

这样的话,集群的各个机器上面 就是会启动相应的hdfs的进程。

出现相应的问题:如果某个hdfs的进行挂掉之后,如何启动对应的进程?

在相应的进程挂掉的机器上面 使用 hadoop-daemon.sh start 缺失的进程的名字,

这样的话,就是能够启动缺失的进程。

hdfs在启动的时候,datanode会将自身包含的块的信息 发送给namenode

,namenode会在自身的内存之中建立一个Mapping

以blockId 为Key的mapping  后面是datanode的位置。

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容