HDFS架构&理解数据块、副本数、小文件的概念&改变hdfs存储目录&NN和SNN交互流程

1.改变HDFS文件的存储目录

在这里插入图片描述
官方默认配置为/tmp路径下 所以我们需要该路径只需要改变这个参数即可,修改配置文件之前,先将原来生成的文件移动一下

[wzj@hadoop001 ~]$ pwd
/home/wzj
[wzj@hadoop001 hadoop-wzj]$ cd dfs
[wzj@hadoop001 dfs]$ ll
total 0
drwx------. 3 wzj wzj 21 Dec 7 16:59 data
drwxrwxr-x. 3 wzj wzj 21 Dec 7 16:59 name
drwxrwxr-x. 3 wzj wzj 21 Dec 7 16:59 namesecondary
[wzj@hadoop001 dfs]$ pwd
/tmp/hadoop-wzj/dfs
[wzj@hadoop001 dfs]$ mv /tmp/hadoop-wzj/dfs /home/wzj/tmp/

修改配置文件

[wzj@hadoop001 hadoop]$ vi core-site.xml
<configuration>
    <property>
        <name>fs.defaultFS</name>
        <value>hdfs://hadoop001:9000</value>
    </property>
    <property>
        <name>hadoop.tmp.dir</name>
        <value>/home/wzj/tmp</value>
    </property>
</configuration>

启动hadoop,执行测试文件

[wzj@hadoop001 subdir0]$ ll
total 216
-rw-rw-r–. 1 wzj wzj 14 Dec 2 14:04 blk_1073741825
-rw-rw-r–. 1 wzj wzj 11 Dec 2 14:04 blk_1073741825_1001.meta
-rw-rw-r–. 1 wzj wzj 93 Dec 2 18:04 blk_1073741826
-rw-rw-r–. 1 wzj wzj 11 Dec 2 18:04 blk_1073741826_1002.meta
-rw-rw-r–. 1 wzj wzj 135 Dec 2 18:09 blk_1073741834
-rw-rw-r–. 1 wzj wzj 11 Dec 2 18:09 blk_1073741834_1010.meta
-rw-rw-r–. 1 wzj wzj 346 Dec 2 18:09 blk_1073741835
-rw-rw-r–. 1 wzj wzj 11 Dec 2 18:09 blk_1073741835_1011.meta
-rw-rw-r–. 1 wzj wzj 33608 Dec 2 18:09 blk_1073741836
-rw-rw-r–. 1 wzj wzj 271 Dec 2 18:09 blk_1073741836_1012.meta
-rw-rw-r–. 1 wzj wzj 141062 Dec 2 18:09 blk_1073741837
-rw-rw-r–. 1 wzj wzj 1111 Dec 2 18:09 blk_1073741837_1013.meta
[wzj@hadoop001 subdir0]$ hadoop fs -put /home/wzj/ce.log /
[wzj@hadoop001 subdir0]$ ll
total 224
-rw-rw-r–. 1 wzj wzj 14 Dec 2 14:04 blk_1073741825
-rw-rw-r–. 1 wzj wzj 11 Dec 2 14:04 blk_1073741825_1001.meta
-rw-rw-r–. 1 wzj wzj 93 Dec 2 18:04 blk_1073741826
-rw-rw-r–. 1 wzj wzj 11 Dec 2 18:04 blk_1073741826_1002.meta
-rw-rw-r–. 1 wzj wzj 135 Dec 2 18:09 blk_1073741834
-rw-rw-r–. 1 wzj wzj 11 Dec 2 18:09 blk_1073741834_1010.meta
-rw-rw-r–. 1 wzj wzj 346 Dec 2 18:09 blk_1073741835
-rw-rw-r–. 1 wzj wzj 11 Dec 2 18:09 blk_1073741835_1011.meta
-rw-rw-r–. 1 wzj wzj 33608 Dec 2 18:09 blk_1073741836
-rw-rw-r–. 1 wzj wzj 271 Dec 2 18:09 blk_1073741836_1012.meta
-rw-rw-r–. 1 wzj wzj 141062 Dec 2 18:09 blk_1073741837
-rw-rw-r–. 1 wzj wzj 1111 Dec 2 18:09 blk_1073741837_1013.meta
-rw-rw-r–. 1 wzj wzj 14 Dec 9 16:13 blk_1073741838
-rw-rw-r–. 1 wzj wzj 11 Dec 9 16:13 blk_1073741838_1014.meta

2.块和副本数的理解
块的理解

存储处理数据的最小单元,其中在hadoop1.x中默认大小为64M,hadoop2.0默认大小为128M,块的大小是由hdfs-site.xml文件中的dfs.blocksize 属性控制

key	             value
dfs.blocksize	134217728

块大小为什么要设置成128M?(参考其他人的博客)
是为了最小化寻址时间,目前磁盘的传输速率普遍是在100M/S左右,所以设计成128M每块

副本数的理解

副本数的设置使hdfs具有高可靠,数据不会丢失,一个dn只能存储一个块的一份副本,伪分布式部署只能为1个副本,因为只有一个dn;集群部署一般情况下设置3个副本即可,配置在hdfs-site.xml文件中

key	                 value
dfs.replication	       3

面试题
一个文件160M,块大小128M ,副本数2份,请问:实际存储多少块,实际多少存储空间?
回答之前有两个概念需要搞清楚:
a.数据上传到hdfs上,大小不会凭空增加
b.未满一个block块的大小,也会占用一个block文件

3.HDFS架构

在这里插入图片描述
HDFS由NameNode、SecondaryNameNode、DataNode三个组件组成

==Namenode: 主 ==
NameNode也被称为名称节点或元数据节点,是HDFS主从架构中的主节点,相当于HDFS的大脑,它管理文件系统的命名空间,维护着整个文件系统的目录树以及目录树中所有子目录和文件。

这些信息以两个文件的形式持久化保存在本地磁盘上,一个是命令空间镜像FSImage(File System Image),主要是用来存储HDFS的元数据信息。还有一个是命令空间镜像的编辑日志(Editlog),该文件保存用户对命令空间镜像的修改信息。

namenode路径和内容

[wzj@hadoop001 current]$ pwd
/home/wzj/tmp/dfs/name/current
[wzj@hadoop001 current]$ ll
total 13380
-rw-rw-r--. 1 wzj wzj      42 Dec  2 11:45 edits_0000000000000000001-0000000000000000002
-rw-rw-r--. 1 wzj wzj 1048576 Dec  2 11:45 edits_0000000000000000003-0000000000000000003
-rw-rw-r--. 1 wzj wzj      42 Dec  2 12:02 edits_0000000000000000004-0000000000000000005
-rw-rw-r--. 1 wzj wzj 1048576 Dec  2 12:02 edits_0000000000000000006-0000000000000000006
-rw-rw-r--. 1 wzj wzj      42 Dec  2 12:57 edits_0000000000000000007-0000000000000000008
-rw-rw-r--. 1 wzj wzj      42 Dec  2 13:57 edits_0000000000000000009-0000000000000000010
-rw-rw-r--. 1 wzj wzj 1048576 Dec  2 14:04 edits_0000000000000000011-0000000000000000018
-rw-rw-r--. 1 wzj wzj      42 Dec  2 15:49 edits_0000000000000000019-0000000000000000020
-rw-rw-r--. 1 wzj wzj 1048576 Dec  2 15:49 edits_0000000000000000021-0000000000000000021
-rw-rw-r--. 1 wzj wzj      42 Dec  2 16:31 edits_0000000000000000022-0000000000000000023
-rw-rw-r--. 1 wzj wzj      42 Dec  2 17:31 edits_0000000000000000024-0000000000000000025
-rw-rw-r--. 1 wzj wzj 1048576 Dec  2 18:09 edits_0000000000000000026-0000000000000000129
-rw-rw-r--. 1 wzj wzj 1048576 Dec  3 09:09 edits_0000000000000000130-0000000000000000130
-rw-rw-r--. 1 wzj wzj 1048576 Dec  7 13:57 edits_0000000000000000131-0000000000000000131
-rw-rw-r--. 1 wzj wzj      42 Dec  7 14:53 edits_0000000000000000132-0000000000000000133
-rw-rw-r--. 1 wzj wzj 1048576 Dec  7 14:53 edits_0000000000000000134-0000000000000000134
-rw-rw-r--. 1 wzj wzj 1048576 Dec  7 15:28 edits_0000000000000000135-0000000000000000135
-rw-rw-r--. 1 wzj wzj 1048576 Dec  7 15:46 edits_0000000000000000136-0000000000000000136
-rw-rw-r--. 1 wzj wzj      42 Dec  7 15:53 edits_0000000000000000137-0000000000000000138
-rw-rw-r--. 1 wzj wzj 1048576 Dec  7 15:53 edits_0000000000000000139-0000000000000000139
-rw-rw-r--. 1 wzj wzj      42 Dec  7 16:16 edits_0000000000000000140-0000000000000000141
-rw-rw-r--. 1 wzj wzj 1048576 Dec  7 16:16 edits_0000000000000000142-0000000000000000142
-rw-rw-r--. 1 wzj wzj      42 Dec  9 16:13 edits_0000000000000000143-0000000000000000144
-rw-rw-r--. 1 wzj wzj 1048576 Dec  9 16:13 edits_inprogress_0000000000000000145
-rw-rw-r--. 1 wzj wzj    1733 Dec  9 16:12 fsimage_0000000000000000142
-rw-rw-r--. 1 wzj wzj      62 Dec  9 16:12 fsimage_0000000000000000142.md5
-rw-rw-r--. 1 wzj wzj    1733 Dec  9 16:13 fsimage_0000000000000000144
-rw-rw-r--. 1 wzj wzj      62 Dec  9 16:13 fsimage_0000000000000000144.md5
-rw-rw-r--. 1 wzj wzj       4 Dec  9 16:13 seen_txid
-rw-rw-r--. 1 wzj wzj     208 Dec  9 16:12 VERSION

namenode的fsimage的个数默认是保留2个,擦书是在hdfs-site文件进行配置,属性为

key	                                  value
dfs.namenode.num.checkpoints.retained	2

DataNode 从
DataNode也被称为数据节点,它是HDFS主从架构在的从节点
1.存储: 数据块 和 数据块校验和

[wzj@hadoop001 subdir0]$ ll
total 224
-rw-rw-r–. 1 wzj wzj 14 Dec 2 14:04 blk_1073741825 ###数据块
-rw-rw-r–. 1 wzj wzj 11 Dec 2 14:04 blk_1073741825_1001.meta###数据块检验和
-rw-rw-r–. 1 wzj wzj 93 Dec 2 18:04 blk_1073741826
-rw-rw-r–. 1 wzj wzj 11 Dec 2 18:04 blk_1073741826_1002.meta
-rw-rw-r–. 1 wzj wzj 135 Dec 2 18:09 blk_1073741834
-rw-rw-r–. 1 wzj wzj 11 Dec 2 18:09 blk_1073741834_1010.meta
-rw-rw-r–. 1 wzj wzj 346 Dec 2 18:09 blk_1073741835
-rw-rw-r–. 1 wzj wzj 11 Dec 2 18:09 blk_1073741835_1011.meta
-rw-rw-r–. 1 wzj wzj 33608 Dec 2 18:09 blk_1073741836
-rw-rw-r–. 1 wzj wzj 271 Dec 2 18:09 blk_1073741836_1012.meta
-rw-rw-r–. 1 wzj wzj 141062 Dec 2 18:09 blk_1073741837
-rw-rw-r–. 1 wzj wzj 1111 Dec 2 18:09 blk_1073741837_1013.meta
-rw-rw-r–. 1 wzj wzj 14 Dec 9 16:13 blk_1073741838
-rw-rw-r–. 1 wzj wzj 11 Dec 9 16:13 blk_1073741838_1014.meta

2.与namenode(nn)通信:
a.每隔3s发送心跳包给 nn,我还活者
dfs.heartbeat.interval 3
b.每隔一定的时间发生一次 blockreport
dfs.blockreport.intervalMsec 21600000ms=6h
dfs.datanode.directoryscan.interval 21600s=6h

DataNode会不断地向NameNode发送心跳和块报告信息,并执行来自NameNode的指令,发送心跳是为了告诉nn我还活着,通过hdfs-default.xml文件的dfs.heartbeat.interval参数可以得知,每3秒发送一次

发送块报告信息是为了扫描数据目录并协调内存块和磁盘块之间的差异的,从hdfs-default.xml文件的dfs.datanode.directoryscan.interval属性和dfs.blockreport.intervalMsec可以得知每6小时发送一次块报告,生产环境下建议缩短周期(3小时)

secondary namenode(snn)

snn也称为元数据节点,是hdfs中的备用节点,主要作用是合并fsimage和editlog作为一个新的fsimage,并推送到nn,该过程也称为checkpoint
配置合并的参数
在hdfs-site.xml中,有两个参数可以控制文件合并是由时间还是次数决定,其中这两个参数的默认值为1小时或者Editlog操作日志记录满 1000000条,两者满足一条就会合并文件

key	                            value
dfs.namenode.checkpoint.period	3600
dfs.namenode.checkpoint.txns	1000000
4. NameNode和SecondaryNameNode

在这里插入图片描述
snn的缺点
虽然snn能解决单点故障,但是还是会有风险的,它并不能回复全部数据,如果一小时一备份,那它只能回复前一个整点之前的数据

为什么SecondaryNameNode要辅助NameNode定期合并FSImage文件和Editlog文件
FSImage文件实际上是HDFS文件系统中元数据的一个永久性检查点(checkpoint),但也并不是每一个写操作都会更新到这个文件中,因为FSImage是一个大型文件,如果频繁地执行写操作,会导致系统运行极其缓慢,那么如何解决呢?
解决方案就是NameNode将命令空间的改动信息写入命令空间的Editlog,但随着时间的推移,Editlog文件会越来越大,一旦发生故障,那么将需要花费很长的时间进行回滚操作,所以可以像传统的关系型数据库一样,定期地合并FSImage和Editlog,但是如果由NameNode来做合并操作,由于NameNode在为集群提供服务的同时可能无法提供足够的资源,所以为了解决这一问题,SecondaryNameNode就应运而生了

secondarynamenode(SNN)
1 2 3 4 全备份 fsimage1
5 6 edit1
checkpoint1 : fsimage1+edit1==>fsimage2
fsimage2推送给nn
fsimage2
7 8 edit2
checkpoint2 : fsimage2+edit2==>fsimage3
edit3

1.roll edit
2.传输 fsimage+edits
3.merge
4.传输 fsimage.ckpt to nn
5.回滚 fsimage.ckpt==》fsimage
edit.new==> edit

NN
edits_0000000000000000306-0000000000000000307
edits_0000000000000000308-0000000000000000324
edits_inprogress_0000000000000000325
fsimage_0000000000000000307
fsimage_0000000000000000307.md5
fsimage_0000000000000000324
fsimage_0000000000000000324.md5

SNN
edits_0000000000000000302-0000000000000000303
edits_0000000000000000304-0000000000000000305
edits_0000000000000000306-0000000000000000307
edits_0000000000000000308-0000000000000000324
fsimage_0000000000000000307
fsimage_0000000000000000307.md5
fsimage_0000000000000000324
fsimage_0000000000000000324.md5

fsimage_0000000000000000307 + edits_0000000000000000308-0000000000000000324
==>fsimage_0000000000000000324

发布了45 篇原创文章 · 获赞 1 · 访问量 1764

猜你喜欢

转载自blog.csdn.net/wzj_wp/article/details/103459638
今日推荐