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文件不会变得非常大。


同时也是可以执行命令来实现手动实现日志滚动:
具体的命令:
hdfs dfsadmin -rollEdit
一个小小的提示:随着集群的运行时间过长,在文件系统之中会产生很多的edit-log文件,
可以写一个shell 脚本定时清理一下。
给出我的简单的shell清理脚本:

但是具体的应用之中还是需要注意具体的场景。
如果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的位置。