【若泽大数据实战第十一天】HDFS课程 - 副本数 Block Namenode、datanode、、SecondaryNameNode

前言:

我把kafka的前置课程写完了,对kafka有了一定的了解,接下去我将把HDFS的课程写的详细一些。

1、HDFS进程

NameNode(NN):

命名空间 =【fsimage+editlog(hadoop命令) 文件名称+目录结构+文件属性】+ 【文件 + 块 + 机器(datanode)

DataNode(DN):

文件块 + 10个心跳发送一个block report

Secondary NameNode(SNN):

每隔一小时去拿 fsimage+editlog】合并生成 fsimage_xxx.ckpt- > namenode 

2、block(数据块)

block大小:
      默认128M ~ 最大 512M

数据块大文件会被分割成多个block进行存储,block大小默认为128MB。每一个block会在多个datanode上存储多份副本,默认是3份。

参数:hdfs-default.xm文件l里面的dfs.blocksize

路径:/opt/software/hadoop-2.8.1/share/doc/hadoop/hadoop-project-dist/hadoop-hdfs/hdfs-default.xml

为了确认默认是64m还是128m,我还是去找了下。

【若泽大数据实战第十一天】HDFS课程 - 副本数 Block Namenode、datanode、、SecondaryNameNode_第1张图片

官网地址 http://hadoop.apache.org/docs/r2.8.4/hadoop-project-dist/hadoop-hdfs/hdfs-default.xml

官网显示默认大小:


、如果一个文件大小为130M,那它会被切成两个文件,一个文件是128M,那另一个文件就是2M(实际大小)

做个试验测试下Block的分配情况

【若泽大数据实战】

测试下,从linux上把一个超过128M的数据,放到hdfs上会有怎样的结果。

默认环境单机,1份数据,测试文件大小:404MB

首先启动 hdfs

[hadoop@hadoop-01 sbin]$ ./start-dfs.sh 

Starting namenodes on [hadoop-01]

查看启动状态

[hadoop@hadoop-01 sbin]$ jps
3089 SecondaryNameNode
2762 NameNode

3338 Jps

2874 DataNode

准备一个text.log,文件大小为420MB超过128,

-rw-r--r--. 1 root root 424555111 May 19 17:47 ruoze.log

将它从linux放到hdfs上

[hadoop@hadoop-01 install]$ hdfs dfs -put ruoze.log /
[hadoop@hadoop-01 install]$ hdfs dfs -ls /

Found 3 items
-rw-r--r--   1 hadoop supergroup  424555111 2018-05-19 17:49 /ruoze.log
drwx------   - hadoop supergroup          0 2018-05-17 14:50 /tmp

drwxr-xr-x   - hadoop supergroup          0 2018-05-17 14:50 /user

打开网址查看信息:

http://192.168.137.30:50070/explorer.html#

我们查看到相关信息,ruoze.log 404MB

【若泽大数据实战第十一天】HDFS课程 - 副本数 Block Namenode、datanode、、SecondaryNameNode_第2张图片

点击ruoze.log可以查看有4个块组成  

【若泽大数据实战第十一天】HDFS课程 - 副本数 Block Namenode、datanode、、SecondaryNameNode_第3张图片

【若泽大数据实战第十一天】HDFS课程 - 副本数 Block Namenode、datanode、、SecondaryNameNode_第4张图片

【若泽大数据实战第十一天】HDFS课程 - 副本数 Block Namenode、datanode、、SecondaryNameNode_第5张图片

【若泽大数据实战第十一天】HDFS课程 - 副本数 Block Namenode、datanode、、SecondaryNameNode_第6张图片

Block 0 Size: 134217728

Block 1 Size: 134217728

Block 2 Size: 134217728

Block 3 Size: 21901927

我们在通过命令行测试看看具体的Block情况

[hadoop@hadoop-01 install]$ hdfs fsck /ruoze.log -files -blocks

【若泽大数据实战第十一天】HDFS课程 - 副本数 Block Namenode、datanode、、SecondaryNameNode_第7张图片

通过此次测试,命令行与网页上结果是一致的,这也解释了Block满128MB就会进行分配的操作。

3、副本数:

dfs.replication 1份(单机)-->3份(默认)--->5份(生产所需可能5份)

生产环境中,一般来说会用默认的3份副本,上海一份,广州一份,北京一份,如果其中一份坏了,自动补充一份数据,两份坏了,还是会补充数据,如果三份全部都坏了,必然会丢失数据,所以生产环境中可能设置更多将它设置为5份,确保生产的数据不丢失,这个弊端是,磁盘需求,更大,每次就要多两个备份集

参数: hdfs-site.xml  dfs.replication 

我的机器因为是单机所以我设置1

【若泽大数据实战第十一天】HDFS课程 - 副本数 Block Namenode、datanode、、SecondaryNameNode_第8张图片


官网地址 http://hadoop.apache.org/docs/r2.8.4/hadoop-project-dist/hadoop-hdfs/hdfs-default.xml

官网显示默认大小:


首先 dfs.replication这个参数是个client参数,即node level参数。需要在每台datanode上设置。
其实默认为3个副本已经够用了,设置太多也没什么用。

一个文件,上传到hdfs上时指定的是几个副本就是几个。以后你修改了副本数,对已经上传了的文件也不会起作用。可以再上传文件的同时指定创建的副本数
Hadoop dfs -D dfs.replication=1 -put 70M logs/2

可以通过命令来更改已经上传的文件的副本数:
hadoop fs -setrep -R 3 /

查看当前hdfs的副本数

hadoop fsck -locations

【若泽大数据实战第十一天】HDFS课程 - 副本数 Block Namenode、datanode、、SecondaryNameNode_第9张图片

参数解释:
status:代表这次hdfs上block检测的结果
Total size: 代表/目录下文件总大小
Total dirs:代表检测的目录下总共有多少个目录
Total files:代表检测的目录下总共有多少文件
Total symlinks:代表检测的目录下有多少个符号连接
Total blocks(validated):代表检测的目录下有多少个block块是有效的
Minimally replicated blocks:代表拷贝的最小block块数
Over-replicated blocks:指的是副本数大于指定副本数的block数量
Under-replicated blocks:指的是副本数小于指定副本数的block数量
Mis-replicated blocks:指丢失的block块数量
Default replication factor: 3 指默认的副本数是3份( 自身一份,需要拷贝两份
Missing replicas:丢失的副本数
Number of data-nodes:有多少个节点
Number of racks:有多少个机架

如果你只有3个datanode,但是你却指定副本数为4,是不会生效的,因为每个datanode上只能存放一个副本。


【若泽大数据面试题】

面试题:1个文件是260M,请问存储多大,多少个块?

面试题:130m的数据,分为1个128m,1个2m,那这多出的2M会占一个数据模块?会有问题?

面试题:比如这个文件比较小都是 3m 5m?怎么办?

你们去问 J 哥。

以下内容来自互联网

 如果想一部分文件副本为3,一部分文件副本位2,这个需求也同样在命令行执行操作即可

【若泽大数据实战第十一天】HDFS课程 - 副本数 Block Namenode、datanode、、SecondaryNameNode_第10张图片

[root@neusoft-master hadoop]# hdfs dfs -setrep   2  /neusoft/hello1

【若泽大数据实战第十一天】HDFS课程 - 副本数 Block Namenode、datanode、、SecondaryNameNode_第11张图片

【若泽大数据详解HDFS】

4、HDFS设计框架:(重要)

【若泽大数据实战第十一天】HDFS课程 - 副本数 Block Namenode、datanode、、SecondaryNameNode_第12张图片

机架:机架感知 (生产中一般用的不是很多,一般使用云服务器)

如果布置了提高性能,不布置性能降低不多,可忽略。

         公司:局域网自己的机房,hdfs肯定部署在不用的机架上 ()

         公司:云服务器,不布置机架

4.1 Namenode

面试题:Namenode(名称节点,命名空间)维护以下信息

答:

a.文件名称

b.文件目录结构

c.文件的属性(权限,创建时间,副本数)

d.文件对应-->哪些数据据块-->分配到哪些datanode节点上-->列表:存储在内存上

重要概念:

不会持久化存储这个映射关系,是通过集群的启动和运行时,DataNode定期发送blockReport给NameNode,以此NameNode在【内存】中动态维护这种映射关系。

作用:管理文件系统的命名空间。它维护着文件系统树及整棵树内所有的文件和目录。

这些信息以两个文件形式永久保存在本地磁盘上:命名空间镜像文件fsimage和编辑日志文件editlog。

第一次发送信息:当hdfs启动的时候,datanode会将我里面空间,文件属性,目录结构等信息,发送信息给Namedoe

第二次~N次发送信息:当数据更新的时候,datanode每30秒回发送一个Block发送给Namenode

以下内容来自互联网

    Namenode是整个文件系统的管理节点。它维护着1.整个文件系统的文件目录树,2.件/目录的元信息和每个文件对应的数据块列表。3.接收用户的操作请求。

    (见源码) 文件包括:(hdfs-site.xml的dfs.namenode.name.dir属性)

  • fsimage:元数据镜像文件。存储某一时段NameNode内存元数据信息。
  • edits:操作日志文件。
  • fstime:保存最近一次checkpoint的时间 以上这些文件是保存在linux的文件系统中。

总结:

NameNode维护着2张表:
1.文件系统的目录结构,以及元数据信息
2.文件与数据块(block)列表的对应关系
元数据存放在fsimage中,在运行的时候加载到内存中的(读写比较快)。
操作日志写到edits中。(类似于LSM树中的log)

(刚开始的写文件会写入到内存中和edits中,edits会记录文件系统的每一步操作,当达到一定的容量会将其内容写入fsimage中)


4.2 Datanode (

数据节点 存放数据

a.数据块 block

b.数据块校验和

与Nanmenode通信:

a.每个3秒发送一个心跳包给Namenode,告诉Namenode我是否还是连接状态

b.每隔10次心跳(30秒)发送一次Block report,告诉Namenode数据存储的情况

总结:

系统在启动hdfs的时候,系统它本身不存储存,文件名称,文件目录结构,等等 启动的时候它由我们的datanode所有机器的数据节点,会将当前机器的block report 每隔10次心跳(30秒)发送一次给namenode,将这样的数据信息缓冲再namenode内存上,就这样一直更新数据信息。对于datanode来说,数据是存储在磁盘上面的,

以下内容来自互联网

  • 提供真实文件数据的存储服务。
  • 文件块(block):最基本的存储单位。对于文件内容而言,一个文件的长度大小是size,那么从文件的0偏移开始,按照固定的大小,顺序对文件进行划分并编号,划分好的每一个块称一个Block。
  • HDFS默认Block大小是128MB,以一个256MB文件,共有256/128=2个Block. 不同于普通文件系统的是,HDFS中,如果一个文件小于一个数据块的大小,并不占用整个数据块存储空间。ruc

      (这样设置可以减轻namenode压力,因为namonode维护者文件与数据块列表的对应大小)

  • Replication。多复本。默认是三个。(hdfs-site.xml的dfs.replication属性)

(1)Hdfs块大小如何设定?

    hdfs-default.xml

复制代码

  dfs.blocksize   #block块存储的配置信息
  134217728   #这里的块的容量最大是128M,请注意
  
      The default block size for new files, in bytes.
      You can use the following suffix (case insensitive):
      k(kilo), m(mega), g(giga), t(tera), p(peta), e(exa) to specify the size (such as 128k, 512m, 1g, etc.),
      Or provide complete size in bytes (such as 134217728 for 128 MB).
  
复制代码

描述信息翻译:

       新文件的默认块大小(以字节为单位)。
       您可以使用以下后缀(不区分大小写):
       指定大小(例如128k,512m,1g等)的k(千),m(兆),g(giga),t(tera),p(peta)
       或提供完整的大小(以128 MB为单位的134217728)。

***如何修改默认大小的blocksize?答:只需要修改上述配置文件即可。但是这种方式是全局的修改。  64M=67108864

      如果想针对文件修改,只需要使用命令修改即可 hadoop fs -Ddfs.blocksize=134217728 -put  ./test.txt /test

(2)修改数据块的测试:

[root@neusoft-master filecontent]# hdfs dfs -Ddfs.blocksize=67108864 -put hellodemo /neusoft/hello2

       

      源数据信息:

       上传之后在hdfs的配置目录查看,其大小等于19字节,而非64M

       【若泽大数据实战第十一天】HDFS课程 - 副本数 Block Namenode、datanode、、SecondaryNameNode_第13张图片

       或者 下面通过浏览器查看:       

   http://192.168.191.130:50070/explorer.html#/neusoft/   #如果windows上配置了hosts,这里可以写主机名

       【若泽大数据实战第十一天】HDFS课程 - 副本数 Block Namenode、datanode、、SecondaryNameNode_第14张图片

      【若泽大数据实战第十一天】HDFS课程 - 副本数 Block Namenode、datanode、、SecondaryNameNode_第15张图片

 

注意区别:一个文件可以产生多个快,多个文件是不可能成为一个块信息的,处于减轻namenode的压力,最好的方式就是一个文件一个块 

(3)文件块存放路径查看与具体信息解释

     (a)查找datanode存放数据的位置,配置信息在hdfs-site.xml中

      【若泽大数据实战第十一天】HDFS课程 - 副本数 Block Namenode、datanode、、SecondaryNameNode_第16张图片

    (b)进入datanode存放信息的目录查看

[root@neusoft-master subdir0]# cd /opt/hdfs/data/current/BP-625280320-192.168.191.130-1483628038952/current/finalized/subdir0/subdir0

  可以查看到元数据的信息以及数据信息  

  【若泽大数据实战第十一天】HDFS课程 - 副本数 Block Namenode、datanode、、SecondaryNameNode_第17张图片

  Tips:可以在本地新建一个文件,上传到HDFS中,查看是否增加了块信息。

4.3 Secondary NameNode (当HA的时候,SNN不需要了,升级为stanby热备的namenode

                   存储:命令空间镜像文件fsimage + 编辑日志 editlog

                   作用:定期合并 fsimage + editlog 为新的fsimage,推送给namenode称为检查点

                   参数:dfs.namenode.checkpoint.period 3600s

实验: NN损坏,SNN去恢复
http://hmilyzhangl.iteye.com/blog/1407214

【若泽大数据实战】

secondary namenode每隔一个小时去namenode里面拿 fsimage+editlog(备份),然后合并成新的文件 fsimage.ckpt,推送给namenode,

fsimage + editlog 存储位置

[root@hadoop-01 current]# pwd

/tmp/hadoop-hadoop/dfs/name/current/

【若泽大数据实战第十一天】HDFS课程 - 副本数 Block Namenode、datanode、、SecondaryNameNode_第18张图片

在上图中可以看到,edit log文件以edits_开头,后面跟一个txid范围段,并且多个edit log之间首尾相连,正在使用的edit log名字为edits_inprogress_txid。该路径下还会保存两个fsimage文件,文件格式为fsimage_txid。上图中可以看出fsimage文件已经加载到了最新的一个edit log文件,仅仅只有inprogress状态的edit log未被加载。在启动HDFS时,只需要读入edits_inprogress_0000000000000000213以及fsimage_0000000000000000212就可以还原出当前hdfs的最新状况

总结:

1、 生产中一般不配置Secondary NameNode,因为是一小时备份一次不是实时备份

2、 生产中使用2个namenode,这样可以实时的热备份,一个挂了另外一个立马切过去,我们将这个模式成为HA模式

3、在HA模式下的checkpoint过程由StandBy NameNode来进行,以下简称为SBNN(热备),Active NameNode简称为ANN(活动的)

4、如果Secondary NameNode检查的是在12点的时候做的,12点半的时候SNN的节点挂了。只能恢复到12点的时候,checkpoint的那个时间点

5、Secondary NameNode将我们namenode内存里储存的数据把它做一次备份,防止namenode挂了

namenode存储文件系统 Metadata里面有文件名称,复本书,权限,创建时间,文件对应哪些Block,Block分布在哪些节点上面,datanode对文件数据的一个快速读和块的校验和,它是一个心跳的一个报告,每个30秒把Block report的信息提交给namenode,secondary namenode

【若泽大数据实战第十一天】HDFS课程 - 副本数 Block Namenode、datanode、、SecondaryNameNode_第19张图片


科普一下 HA模式下Checkpointing过程分析:

 HA模式下的edit log文件会同时写入多个JournalNodes节点的dfs.journalnode.edits.dir路径下,JournalNodes的个数为大于1的奇数,类似于Zookeeper的节点数,当有不超过一半的JournalNodes出现故障时,仍然能保证集群的稳定运行。 

SBNN会读取FSImage文件中的内容,并且每隔一段时间就会把ANN写入edit log中的记录读取出来,这样SBNN的NameNode进程中一直保持着hdfs文件系统的最新状况namespace。当达到checkpoint条件的某一个时,就会直接将该信息写入一个新的FSImage文件中,然后通过HTTP传输给ANN。 

【若泽大数据实战第十一天】HDFS课程 - 副本数 Block Namenode、datanode、、SecondaryNameNode_第20张图片

如上图所示,主要由4个步骤: 
   1. SBNN检查是否达到checkpoint条件:离上一次checkpoint操作是否已经有一个小时,或者HDFS已经进行了100万次操作。 
   2. SBNN检查达到checkpoint条件后,将该namespace以fsimage.ckpt_txid格式保存到SBNN的磁盘上,并且随之生成一个MD5文件。然后将该fsimage.ckpt_txid文件重命名为fsimage_txid。 
   3. 然后SBNN通过HTTP联系ANN。 
   4. ANN通过HTTP从SBNN获取最新的fsimage_txid文件并保存为fsimage.ckpt_txid,然后也生成一个MD5,将这个MD5与SBNN的MD5文件进行比较,确认ANN已经正确获取到了SBNN最新的fsimage文件。然后将fsimage.ckpt_txid文件重命名为fsimage_txit。 
  通过上面一系列的操作,SBNN上最新的FSImage文件就成功同步到了ANN上。

 [若泽大数据PPT简介]

【若泽大数据实战第十一天】HDFS课程 - 副本数 Block Namenode、datanode、、SecondaryNameNode_第21张图片

【若泽大数据面试题】

问题1:namenode 进程挂了,文件路径还在怎么办?

问题2:namenode运行时间是11~11:59,namenode机器挂了(磁盘或者文件损坏),文件路径不存在了,分析下数据是否丢失(单节点)?

答案:我在群里公布过了。

4. 关于副本放置策略:

      上传一个文件到hdfs上面,当前的机器是datanode节点,应该优先再自己的本地存一份数据 ,这样就不用走网络了 ,如果放的不是本地就随便放一份

【若泽大数据实战第十一天】HDFS课程 - 副本数 Block Namenode、datanode、、SecondaryNameNode_第22张图片

大数据课程推荐:

【若泽大数据实战第十一天】HDFS课程 - 副本数 Block Namenode、datanode、、SecondaryNameNode_第23张图片


你可能感兴趣的:(【若泽大数据】零基础班实战)