Hadoop--HDFS详解(二)

前言:

HDFS详解(一):  已经把HDFS的基础介绍完了,这里主要是把一些HDFS里面比较重点的一些东西记录一下

一.block

介绍:HDFS会将文件分割成block,每个block都作为一个独立的单元分别保存

HDFS block默认存储大小是128M

          block的默认副本数是3

HDFS配置参数:http://archive.cloudera.com/cdh5/cdh/5/hadoop-2.6.0-cdh5.16.2/hadoop-project-dist/hadoop-hdfs/hdfs-default.xml

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架构图

 

 

hadoop 存储副本 hadoop2.6.5 hdfs默认副本块数_数据

 

    HDFS架构介绍:

    HDFS启用的是主从架构,以nn为主

    nn(namenode):第一名称节点

            作用:存储文件系统的命名空间,存储的内容包括:

                     a.文件的名称

                     b.文件的目录结构

                     c.文件的属性、权限、创建时间等信息

                     d.文件被切割成哪些block,以及这些block的存储地址

                     这些信息并没有持久性,而是由dn定期的把blockreport发送给nn,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

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(日志文件)

作用:

dfs.namenode.checkpoint.period这个参数控制的,默认是3600s,即一个小时

       个人理snn主要是做了冷备份的作用,如果nn挂了,可以实现nn数据恢复到上个小时做checkpoint时候的数据

      snn架构:

hadoop 存储副本 hadoop2.6.5 hdfs默认副本块数_HDFS_02

其中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目录下

上篇博客地址:

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

经过测试发现成功了