Hadoop--HDFS详解(二)

                               Hadoop--HDFS详解(二)

前言:

HDFS详解(一):https://blog.csdn.net/qq_41301707/article/details/84780505  已经把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架构图

 

 

 

    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次

       修复块的最佳实践:https://ruozedata.github.io/2019/06/06/%E7%94%9F%E4%BA%A7HDFS%20Block%E6%8D%9F%E5%9D%8F%E6%81%A2%E5%A4%8D%E6%9C%80%E4%BD%B3%E5%AE%9E%E8%B7%B5(%E5%90%AB%E6%80%9D%E8%80%83%E9%A2%98)/

[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 

经过测试发现成功了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值