Hadoop--HDFS详解(二)
前言:
HDFS详解(一):https://blog.csdn.net/qq_41301707/article/details/84780505 已经把HDFS的基础介绍完了,这里主要是把一些HDFS里面比较重点的一些东西记录一下
一.block
介绍:HDFS会将文件分割成block,每个block都作为一个独立的单元分别保存
HDFS block默认存储大小是128M
block的默认副本数是3
block size 是由:dfs.blocksize 这个参数控制的,这个参数默认大小是:134217728(字节),就是128M
block副本数由:dfs.replication这个参数控制的,这个参数默认大小是3
可以根据业务需求来进行调优
在block中有两个特性:
a.数据上传HDFS 不可能凭空增加新的数据内容
意思就是如果我一个文件130M,blocksize默认是128M,存储到HDFS上面,会占用两个副本,同样的,在副本数默认是3的情况下,我占用的内存也只会是130*3,而不是128*2*3
b.dfs.blocksize 规格 未满一个规格 也会占用一个block文件
这个特性指的是,比如我blocksize默认是128M,我需要存储一个129M的文件,即使第二个block我只占用了1M,但是也会占用一个block
小文件对HDFS的危害:
默认blocksize是128M,副本数是3
HDFS的出现主要是针对大型文件处理,如果在HDFS上面存储了过多的小文件,一个小文件就需要一个block并存储三份,因为nn(namenode)里面存储的都是一些HDFS上面文件的元数据信息,这样会导致nn压力增加10-100倍,很容易oom,然后挂掉
处理小文件办法:
1.在存入HDFS里面之前做个小文件合并的动作,自己设定一个阈值(低于多少M的文件进行合并),假如blocksize是128M的时候,当文件写到128M的百分之90的时候就可以,可以设定写到110M,防止文件写的比128M多一点,又生成小文件问题
2.写个服务,合并HDFS里面的小文件
二.HDFS架构
HDFS三大进程:
nn(namenode):第一名称节点
dn(datanode):数据节点
snn(secondary namenode):第二名称节点
HDFS架构图
HDFS架构介绍:
HDFS启用的是主从架构,以nn为主
nn(namenode):第一名称节点
作用:存储文件系统的命名空间,存储的内容包括:
a.文件的名称
b.文件的目录结构
c.文件的属性、权限、创建时间等信息
d.文件被切割成哪些block,以及这些block的存储地址
这些信息并没有持久性,而是由dn定期的把blockreport发送给nn,nn动态维护这些数据
dn定期发送bolockreport给nn是由dfs.blockreport.intervalMsec这个参数控制,这个参数默认是21600000毫秒,也就是6小时,一旦在发送blockreport的时候发现dn出现故障,dn会先把block report发送给nn,nn接收之后再处理dn的故障
/tmp/hadoop-hadoop/dfs/name/current
[root@xkhadoop current]# ll
总用量 5212
-rw-rw-r--. 1 hadoop hadoop 42 11月 29 23:48 edits_0000000000000000001-0000000000000000002
-rw-rw-r--. 1 hadoop hadoop 42 11月 29 23:49 edits_0000000000000000003-0000000000000000004
-rw-rw-r--. 1 hadoop hadoop 42 11月 29 23:50 edits_0000000000000000005-0000000000000000006
-rw-rw-r--. 1 hadoop hadoop 615 11月 29 23:51 edits_0000000000000000007-0000000000000000015
-rw-rw-r--. 1 hadoop hadoop 42 11月 29 23:52 edits_0000000000000000016-0000000000000000017
-rw-rw-r--. 1 hadoop hadoop 1048576 11月 29 23:52 edits_0000000000000000018-0000000000000000018
-rw-rw-r--. 1 hadoop hadoop 1048576 11月 30 22:32 edits_0000000000000000019-0000000000000000019
-rw-rw-r--. 1 hadoop hadoop 1048576 11月 30 23:05 edits_0000000000000000020-0000000000000000123
-rw-rw-r--. 1 hadoop hadoop 1048576 12月 1 12:13 edits_0000000000000000124-0000000000000000124
-rw-rw-r--. 1 hadoop hadoop 42 12月 1 13:07 edits_0000000000000000125-0000000000000000126
-rw-rw-r--. 1 hadoop hadoop 42 12月 1 13:08 edits_0000000000000000127-0000000000000000128
-rw-rw-r--. 1 hadoop hadoop 42 12月 1 13:09 edits_0000000000000000129-0000000000000000130
-rw-rw-r--. 1 hadoop hadoop 42 12月 1 13:10 edits_0000000000000000131-0000000000000000132
-rw-rw-r--. 1 hadoop hadoop 42 12月 1 13:11 edits_0000000000000000133-0000000000000000134
-rw-rw-r--. 1 hadoop hadoop 42 12月 1 13:12 edits_0000000000000000135-0000000000000000136
-rw-rw-r--. 1 hadoop hadoop 42 12月 1 13:13 edits_0000000000000000137-0000000000000000138
-rw-rw-r--. 1 hadoop hadoop 42 12月 1 13:14 edits_0000000000000000139-0000000000000000140
-rw-rw-r--. 1 hadoop hadoop 42 12月 1 13:15 edits_0000000000000000141-0000000000000000142
-rw-rw-r--. 1 hadoop hadoop 42 12月 1 13:16 edits_0000000000000000143-0000000000000000144
-rw-rw-r--. 1 hadoop hadoop 42 12月 1 13:17 edits_0000000000000000145-0000000000000000146
-rw-rw-r--. 1 hadoop hadoop 42 12月 1 13:18 edits_0000000000000000147-0000000000000000148
-rw-rw-r--. 1 hadoop hadoop 1048576 12月 1 13:18 edits_inprogress_0000000000000000149
-rw-rw-r--. 1 hadoop hadoop 471 11月 30 22:32 fsimage_0000000000000000018
-rw-rw-r--. 1 hadoop hadoop 62 11月 30 22:32 fsimage_0000000000000000018.md5
-rw-rw-r--. 1 hadoop hadoop 1737 12月 1 12:13 fsimage_0000000000000000123
-rw-rw-r--. 1 hadoop hadoop 62 12月 1 12:13 fsimage_0000000000000000123.md5
-rw-rw-r--. 1 hadoop hadoop 4 12月 1 13:18 seen_txid
-rw-rw-r--. 1 hadoop hadoop 208 12月 1 12:13 VERSION
作用:
管理文件系统的命名空间。维护文件系统树的所有文件和文件夹。
这些信息以两个文件形式永久的保存在本地磁盘上:
镜像文件fsimage
编辑日志文件editlog
dn(datanode):数据节点
作用:
1.存储数据块、数据块校验
2.与nn进行通信,默认是每隔3秒,发送一次心跳
发送心跳频率是由dfs.heartbeat.interval这个参数控制的,默认是3s
默认每隔6个小时会生成一个block report,然后把blockreport发送给nn
dn每次扫描文件的间隔是由dfs.datanode.directoryscan.interval这个参数控制的,这个参数默认是21600s,即6个小时
dn定期发送bolockreport给nn是由dfs.blockreport.intervalMsec这个参数控制,这个参数默认是21600000毫秒,也就是6小时,一旦在发送blockreport的时候发现dn出现故障,dn会先把block report发送给nn,nn接收之后再处理dn的故障
如果dn的block损坏,可以有两种方式修复(修复的前提是HDFS里面存在多副本)
1.自动修复,等下一次blockreport发送的时候,向nn汇报block块损坏信息,然后由nn发起修复,但是由于发送block report的时间间隔很长,可以进行参数调优,建议改成三小时,不能把这个参数调的过低,因为后面数据存储的越来越多,dd scan所有block是个很大的工作量,会占用很多资源
2.手动修复block
[root@xkhadoop subdir0]# bdir0]# hdfs debug recoverLease -path xxx -retries 10
xxx:代表的是块损坏的路径
-retries:这个参数代表的是尝试10次
[root@xkhadoop subdir0]# pwd
/tmp/hadoop-hadoop/dfs/data/current/BP-1014543746-192.168.182.128-1575042233719/current/finalized/subdir0/subdir0
[root@xkhadoop subdir0]# ll
总用量 216
-rw-rw-r--. 1 hadoop hadoop 3 11月 29 23:50 blk_1073741825
-rw-rw-r--. 1 hadoop hadoop 11 11月 29 23:50 blk_1073741825_1001.meta
-rw-rw-r--. 1 hadoop hadoop 35 11月 30 22:56 blk_1073741826
-rw-rw-r--. 1 hadoop hadoop 11 11月 30 22:56 blk_1073741826_1002.meta
-rw-rw-r--. 1 hadoop hadoop 39 11月 30 23:05 blk_1073741834
-rw-rw-r--. 1 hadoop hadoop 11 11月 30 23:05 blk_1073741834_1010.meta
-rw-rw-r--. 1 hadoop hadoop 349 11月 30 23:05 blk_1073741835
-rw-rw-r--. 1 hadoop hadoop 11 11月 30 23:05 blk_1073741835_1011.meta
-rw-rw-r--. 1 hadoop hadoop 33552 11月 30 23:05 blk_1073741836
-rw-rw-r--. 1 hadoop hadoop 271 11月 30 23:05 blk_1073741836_1012.meta
-rw-rw-r--. 1 hadoop hadoop 141073 11月 30 23:05 blk_1073741837
-rw-rw-r--. 1 hadoop hadoop 1111 11月 30 23:05 blk_1073741837_1013.meta
snn(secondary namenode):第二名称给节点
存储:fsimage(镜像文件)+editlog(日志文件)
作用:
checkpoint:定期合并 fsimage+editlog文件作为新的fsimage,推送给NN,默认是一个小时一次,是由dfs.namenode.checkpoint.period这个参数控制的,默认是3600s,即一个小时
个人理snn主要是做了冷备份的作用,如果nn挂了,可以实现nn数据恢复到上个小时做checkpoint时候的数据
snn架构:
其中snn文件夹里面有个MD5后缀的文件夹,主要是为了确保snn 从nn copy时候的数据准确性,防止因为网络传输而导致的数据丢失
[root@xkhadoop current]# pwd
/tmp/hadoop-hadoop/dfs/namesecondary/current
[root@xkhadoop current]# ll
总用量 24
-rw-rw-r--. 1 hadoop hadoop 42 11月 29 23:21 edits_0000000000000000001-0000000000000000002
-rw-rw-r--. 1 hadoop hadoop 323 11月 29 23:21 fsimage_0000000000000000000
-rw-rw-r--. 1 hadoop hadoop 62 11月 29 23:21 fsimage_0000000000000000000.md5
-rw-rw-r--. 1 hadoop hadoop 323 11月 29 23:21 fsimage_0000000000000000002
-rw-rw-r--. 1 hadoop hadoop 62 11月 29 23:21 fsimage_0000000000000000002.md5
-rw-rw-r--. 1 hadoop hadoop 206 11月 29 23:21 VERSION
从上面可以看出,HDFS的存储路径在/tmp目录下,上篇博客介绍了,如果数据存储在/tmp下面,Linux会定期删除这些文件,导致我们数据丢失,那么需要把HDFS存储转移到我用户根目录下面的tmp目录下
上篇博客地址:https://blog.csdn.net/qq_41301707/article/details/103334070
1.需要给hadoop用户根目录下面的tmp目录赋予777的权限
[root@xkhadoop hadoop]# pwd
/home/hadoop
[root@xkhadoop hadoop]# ll
总用量 0
drwxrwxr-x. 3 hadoop hadoop 50 11月 29 22:42 app
drwxrwxr-x. 2 hadoop hadoop 33 11月 30 22:55 data
drwxrwxr-x. 2 hadoop hadoop 6 11月 29 22:04 lib
drwxrwxr-x. 2 hadoop hadoop 6 11月 29 22:04 log
drwxrwxr-x. 2 hadoop hadoop 72 11月 29 22:56 software
drwxrwxr-x. 2 hadoop hadoop 6 11月 29 22:04 sourcecode
drwxrwxr-x. 2 hadoop hadoop 6 12月 1 13:19 tmp
[root@xkhadoop hadoop]# chmod 777 tmp/
[root@xkhadoop hadoop]# ll
总用量 0
drwxrwxr-x. 3 hadoop hadoop 50 11月 29 22:42 app
drwxrwxr-x. 2 hadoop hadoop 33 11月 30 22:55 data
drwxrwxr-x. 2 hadoop hadoop 6 11月 29 22:04 lib
drwxrwxr-x. 2 hadoop hadoop 6 11月 29 22:04 log
drwxrwxr-x. 2 hadoop hadoop 72 11月 29 22:56 software
drwxrwxr-x. 2 hadoop hadoop 6 11月 29 22:04 sourcecode
drwxrwxrwx. 2 hadoop hadoop 6 12月 1 13:19 tmp
2.查询是哪个参数设置的HDFS存储路径
我首先查询到snn的存储地址,是由dfs.namenode.checkpoint.dir这个参数控制的,这个参数默认的是file://${hadoop.tmp.dir}/dfs/namesecondary,file代表的是存储的是本地路径,那么再寻找hadoop.tmp.dir这个参数,在hdfs-site.xml文件中没有找到这个参数,则查询下core-site.xml这个文件,找到hadoop.tmp.dir这个参数默认的是/tmp/hadoop-${user.name}这个路径,那么先stop HDFS所有进程
[hadoop@xkhadoop ~]$ stop-all.sh
3.修改配置文件,并把历史文件转移,并重新启动
-rw-r--r--. 1 hadoop hadoop 809 11月 30 22:37 yarn-site.xml
[hadoop@xkhadoop hadoop]$ pwd
/home/hadoop/app/hadoop/etc/hadoop
[hadoop@xkhadoop hadoop]$ vim core-site.xml
<property>
<name>hadoop.tmp.dir</name>
<value>/home/hadoop/tmp</value>
</property>
[hadoop@xkhadoop ~]$ mv /tmp/hadoop-hadoop/dfs tmp/
[hadoop@xkhadoop ~]$ cd tmp/
[hadoop@xkhadoop tmp]$ ll
总用量 0
drwxrwxr-x. 5 hadoop hadoop 51 11月 29 23:20 dfs
[hadoop@xkhadoop tmp]$ cd /tmp/hadoop-hadoop/
[hadoop@xkhadoop hadoop-hadoop]$ ll
总用量 0
drwxr-xr-x. 5 hadoop hadoop 57 12月 2 22:48 nm-local-dir
重新启动下所有进程试下
[hadoop@xkhadoop hadoop-hadoop]$ start-all.sh
经过测试发现成功了