hdfs上的数据块问题

作者: 小小毛同学 | 来源:发表于2019-04-26 10:02 被阅读5次

    一,数据块的大小

    众所周知,hdfs上的数据块的大小是64M或是128M。那么为什么呢?

    1.减少寻道时间,对于hdfs来讲,寻道是一个逻辑的概念,因为真正的寻道发生在磁盘,这里的寻道时间指的就是定位到块的时间。hdfs是存储大数据的,如果块设计的很小,一个文件就会由很多块组成,而HDFS上文件读写的最小单位是块,这样,寻找块的时间就会大大增加,降低读写效率。所以需要专门对hdfs上的小文件做处理的。

    2.减少任务数,一个map或者一个reduce都是以一个块为单位处理,如果块很小的话,mapreduce任务数就会非常多,任务之间的切换开销变大,效率降低,同样,如果块很大的话,一个任务中就会有很多很多的数据,这样任务就会很慢。

    3.减少元数据,再hdfs中,文件块的信息都是元数据,集群运行过程中元数据会都加载进namenode的内存中,如果块很小的情况下,元数据信息就会很多,namenode压力就会很大。当小文件变多的时候,就会造成namenode的压力多大而容易挂掉。

    4.和1很相似,如果数据块很小,一个文件要分成很多块,而每个文件都有副本,当文件删除或者拷贝时,就会导致大量块移动,寻道开销和网络开销都会很大。

    5.以后随着磁盘的读写速度的提升是可以提高块的大小的,这样也会是对集群资源的更好的利用,避免浪费。

    二,数据块的分布

    默认的数据块的复制因子是3,不过这个是可以根据实际情况来更改的。

    这条数据所在的数据块的3分,是不会都放到同一台服务器上的。会在当前服务器上放一份,在临近服务器上放一份,最后一份放在其他机架上。这样的话就避免了服务器的宕机造成数据的丢失的情况。

    在读取或是追加写数据的时候,是就近原则,在本服务器或是最近的服务器上找到这个数据块所在的地址,直接通过寻道,找到数据块,进行数据的读写操作。

    三,数据块的平衡

    如果集群在搭建好之后,没有做增加服务器或是磁盘的操作,各台服务器上dn的存储应该是差不多的。

    但是当有增加磁盘或是增加服务器的操作的时候,就会有数据块的不平衡的情况出现,这时就需要使用hdfs自带的平衡器来处理。

    集群中会有这么一个角色,在执行命令的时候,可以在主节点上执行或是在这个角色的节点上执行。

    这个命令是:hdfs balancer

    但是这个命令需要花的时间比较长,可以在集群不使用的时候来执行

    四,数据块的监控

    在hdfs上的数据块,要保证数据块是健康的,如果不健康的话,在删除或是移动操作的时候,容易造成数据的丢失或是角色的报错等。

    要确保块是健康的,要用到这个命令。(fsck命令必须由HDFS超级用户来执行,普通用户无权限)命令是:hdfs fsck /

    先说每个参数的含义吧

    Total size : hdfs集群存储大小,不包括复本大小。(字节->KB->m->G->TB)

    Total blocks (validated) : 总共的块数量,不包括复本。

    Number of data-nodes : datanode的节点数量

    Number of racks : 机架数量

    Default replication factor : 默认的复制因子

    Average block replication : 当前块的平均复制数,如果小 default replication factor,则有块丢失

    Under-replicated blocks : 正在复制块数量,可采用 hadoop fsck -blocks  解决问题

    Mis-replicated blocks : 正复制的缺少复制块的数量

    Missing replicas : 缺少复制块的数量,通常情况下Under-replicated blocks\Mis-replicated blocks\Missing replicas 都为0,则集群健康,如果不为0,则缺失块了

    Corrupt blocks : 坏块的数量,这个值不为0,则说明当前集群有不可恢复的块,即数据有丢失了

    这是参数的意义。

    上图可以看出集群是不健康的,主要问题是数据的的丢失。

    在hdfs的页面也是可以看到这个错误的。

    说明数据块是丢失的。

    在默认情况下,块扫描器每隔三周(504小时)就会检测块,以应对可能出现的吸盘的故障。损坏的块会报给nn,并被及时修复。

    这个周期是由(dfs.datenode.scan.period.hours)属性来设置的。这个属性是需要配置的,如果没有配置的话将不会默认检测的。

    这里可以看到外网上的一些处理信息http://www.hadoopinrealworld.com/datanode-block-scanner/

    这里是可以看到每个节点的平衡情况的http://datanode:50075/blockScannerReport

    直接在配置文件中增加

    hdfs上的数据块问题

    有更多问题欢迎评论或是私聊(个人微信maochentingqiang),都是可以的。

    相关文章

      网友评论

        本文标题:hdfs上的数据块问题

        本文链接:https://www.haomeiwen.com/subject/utbxnqtx.html