前言:
我把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
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,我还是去找了下。
官网地址 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
点击ruoze.log可以查看有4个块组成
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
通过此次测试,命令行与网页上结果是一致的,这也解释了Block满128MB就会进行分配的操作。
dfs.replication 1份(单机)-->3份(默认)--->5份(生产所需可能5份)
生产环境中,一般来说会用默认的3份副本,上海一份,广州一份,北京一份,如果其中一份坏了,自动补充一份数据,两份坏了,还是会补充数据,如果三份全部都坏了,必然会丢失数据,所以生产环境中可能设置更多将它设置为5份,确保生产的数据不丢失,这个弊端是,磁盘需求,更大,每次就要多两个备份集
参数: hdfs-site.xml dfs.replication
我的机器因为是单机所以我设置1
官网地址 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
如果你只有3个datanode,但是你却指定副本数为4,是不会生效的,因为每个datanode上只能存放一个副本。
【若泽大数据面试题】
面试题:1个文件是260M,请问存储多大,多少个块?
面试题:130m的数据,分为1个128m,1个2m,那这多出的2M会占一个数据模块?会有问题?
面试题:比如这个文件比较小都是 3m 5m?怎么办?
你们去问 J 哥。
以下内容来自互联网
如果想一部分文件副本为3,一部分文件副本位2,这个需求也同样在命令行执行操作即可
[root@neusoft-master hadoop]# hdfs dfs -setrep 2 /neusoft/hello1
【若泽大数据详解HDFS】
4、HDFS设计框架:(重要)
机架:机架感知 (生产中一般用的不是很多,一般使用云服务器)
如果布置了提高性能,不布置性能降低不多,可忽略。
公司:局域网自己的机房,hdfs肯定部署在不用的机架上 ()
公司:云服务器,不布置机架
面试题: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属性)
总结:
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来说,数据是存储在磁盘上面的,
以下内容来自互联网
(这样设置可以减轻namenode压力,因为namonode维护者文件与数据块列表的对应大小)
(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
或者 下面通过浏览器查看:
http://192.168.191.130:50070/explorer.html#/neusoft/ #如果windows上配置了hosts,这里可以写主机名
注意区别:一个文件可以产生多个快,多个文件是不可能成为一个块信息的,处于减轻namenode的压力,最好的方式就是一个文件一个块
(3)文件块存放路径查看与具体信息解释
(a)查找datanode存放数据的位置,配置信息在hdfs-site.xml中
(b)进入datanode存放信息的目录查看
[root@neusoft-master subdir0]# cd /opt/hdfs/data/current/BP-625280320-192.168.191.130-1483628038952/current/finalized/subdir0/subdir0
可以查看到元数据的信息以及数据信息
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/
在上图中可以看到,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
科普一下 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。
如上图所示,主要由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简介]
【若泽大数据面试题】
问题1:namenode 进程挂了,文件路径还在怎么办?
问题2:namenode运行时间是11~11:59,namenode机器挂了(磁盘或者文件损坏),文件路径不存在了,分析下数据是否丢失(单节点)?
答案:我在群里公布过了。
4. 关于副本放置策略:
上传一个文件到hdfs上面,当前的机器是datanode节点,应该优先再自己的本地存一份数据 ,这样就不用走网络了 ,如果放的不是本地就随便放一份
大数据课程推荐: