美文网首页
hadoop(3)HDFS概念

hadoop(3)HDFS概念

作者: Tomy_Jx_Li | 来源:发表于2018-10-08 19:26 被阅读10次

    1 什么是分布式文件系统

    因为当下的数据量越来越大,在一个操作系统管辖的范围存不下了,那么就分配到更多的操作系统管理的磁盘中,但是不方便管理和维护,因此迫切需要一种系统来管理多台机器上的文件,这就是分布式文件管理系统 。

    2 分布式文件系统的特性

    • 是一种允许文件通过网络在多台主机上分享的文件系统,可让多机器上的多用户分享文件和存储空间。
    • 通透性。让实际上是通过网络来访问文件的动作,由程序与用户看来,就像是访问本地的磁盘一般。
    • 容错。即使系统中有某些节点脱机,整体来说系统仍然可以持续运作而不会有数据损失。

    3 常见分布式文件系统

    常见的分布式文件系统有,GFS、HDFS、Lustre 、Ceph 、GridFS 、mogileFS、TFS、FastDFS等。各自适用于不同的领域。它们都不是系统级的分布式文件系统,而是应用级的分布式文件存 储服务。详情参考常见的分布式文件系统介绍

    4 HDFS

    HDFS只是分布式文件系统中的一种。适用于一次写入多次查询的情况,不支持并发写情况,小文件不合适。不支持的原因:
    1、小文件过多,会过多占用namenode的内存,并浪费block。

    • 文件的元数据(包括文件被分成了哪些blocks,每个block存储在哪些服务器的哪个block块上),都是存储在namenode上的。
      HDFS的每个文件、目录、数据块占用150B,因此300M内存情况下,只能存储不超过300M/150=2M个文件/目录/数据块的元数据
    • dataNode会向NameNode发送两种类型的报告:增量报告和全量报告。
      增量报告是当dataNode接收到block或者删除block时,会向nameNode报告。
      全量报告是周期性的,NN处理100万的block报告需要1s左右,这1s左右NN会被锁住,其它的请求会被阻塞。

    2、文件过小,寻道时间大于数据读写时间,这不符合HDFS的设计:
    HDFS为了使数据的传输速度和硬盘的传输速度接近,则设计将寻道时间(Seek)相对最小化,将block的大小设置的比较大,这样读写数据块的时间将远大于寻道时间,接近于硬盘的传输速度。

    4.1 Shell

    调用文件系统(FS)Shell命令应使用 bin/hdfs dfs 的形式。
    所有的FS shell命令使用URI路径作为参数。URI格式是scheme://authority/path。HDFS的scheme是hdfs,对本地文件系统,scheme是file。其中scheme和authority参数都是可选的,如果未加指定,就会使用配置中指定的默认scheme。也就是配置文件core-site.xml中的fs.defaultFS配置项的值。
    大多数FS Shell命令的行为和对应的Unix Shell命令类似

    4.2 fs命令

    这是2.9.1的所有命令,大部分加上了注解,也可以参考官方网站

            [-appendToFile <localsrc> ... <dst>] 给目标文件追加一个或多个本地文件的内容
            [-cat [-ignoreCrc] <src> ...] 查看目标文件
            [-checksum <src> ...] 返回文件的校验信息,文件读取时使用
            [-chgrp [-R] GROUP PATH...] 修改文件所属组
            [-chmod [-R] <MODE[,MODE]... | OCTALMODE> PATH...] 修改文件权限
            [-chown [-R] [OWNER][:[GROUP]] PATH...] 修改文件的所有者
            [-copyFromLocal [-f] [-p] [-l] [-d] <localsrc> ... <dst>] 上传文件,同put
            [-copyToLocal [-f] [-p] [-ignoreCrc] [-crc] <src> ... <localdst>] 下载文件,同get
            [-count [-q] [-h] [-v] [-t [<storage type>]] [-u] [-x] <path> ...] 
            [-cp [-f] [-p | -p[topax]] [-d] <src> ... <dst>] 复制
            [-createSnapshot <snapshotDir> [<snapshotName>]] 创建快照
            [-deleteSnapshot <snapshotDir> <snapshotName>] 删除快照
            [-df [-h] [<path> ...]] 显示存储情况
            [-du [-s] [-h] [-x] <path> ...] 显示文件或者目录大小
            [-expunge] 
            [-find <path> ... <expression> ...] 查找文件
            [-get [-f] [-p] [-ignoreCrc] [-crc] <src> ... <localdst>] 下载
            [-getfacl [-R] <path>] 查询文件或者目录的访问和控制权限
            [-getfattr [-R] {-n name | -d} [-e en] <path>] 查询文件或者目录的扩展属性名和值
            [-getmerge [-nl] [-skip-empty-file] <src> <localdst>] 合并文件内容并输出
            [-help [cmd ...]]
            [-ls [-C] [-d] [-h] [-q] [-R] [-t] [-S] [-r] [-u] [<path> ...]] 查询目录
            [-mkdir [-p] <path> ...] 创建文件夹
            [-moveFromLocal <localsrc> ... <dst>] 本地文件剪切到hdfs目录
            [-moveToLocal <src> <localdst>] hdfs文件剪切到本地
            [-mv <src> ... <dst>] 移动文件
            [-put [-f] [-p] [-l] [-d] <localsrc> ... <dst>] 上传文件
            [-renameSnapshot <snapshotDir> <oldName> <newName>] 重命名快照
            [-rm [-f] [-r|-R] [-skipTrash] [-safely] <src> ...] 删除文件
            [-rmdir [--ignore-fail-on-non-empty] <dir> ...] 删除文件夹
            [-setfacl [-R] [{-b|-k} {-m|-x <acl_spec>} <path>]|[--set <acl_spec> <path>]] 设置文件或目录的访问和控制权限
            [-setfattr {-n name [-v value] | -x name} <path>] 设置文件的扩展属性,如
            hdfs dfs -getfattr -n user.attr /a.txt,但是呢自测的时候,属性名必须是user.xx,其他的不行
            [-setrep [-R] [-w] <rep> <path> ...] 设置文件的备份数
            [-stat [format] <path> ...] 以特殊的格式查看文件的统计信息,如%u是所有者,%o是大小,hdfs dfs -stat "type:%F perm:%a" /a.txt
            [-tail [-f] <file>] 显示文件尾部
            [-test -[defsz] <path>] 测试命令,但是自测时未返回正确信息
            [-text [-ignoreCrc] <src> ...] 查看文件内容
            [-touchz <path> ...] 创建一个新文件
            [-truncate [-w] <length> <path> ...] 删除所有匹配的文件
            [-usage [cmd ...]] 和help一样
    

    4.3 体系结构

    1.NameNode
    2.DataNode
    3.Secondary NameNode

    4.3.1 NameNode

    NameNode是整个文件系统的管理节点。它维护着整个文件系统的文件目录树,文件/目录的元信息和每个文件对应的数据块列表。接收用户的操作请求。

    NameNode的结构图
    NameNode的文件存储在hdfs-site.xml文件的dfs.namenode.name.dir属性配置的值下,如果没有设置,那么默认是file://${hadoop.tmp.dir}/dfs/name。这些文件都是保存在linux的文件系统下的。
    这里的文件包括
    1.fsimage:元数据镜像文件。存储某一时段NameNode内存元数据信息。
    2.edits:操作日志文件。
    3.fstime:保存最近一次checkpoint的时间这个应该是早期的版本有这个文件,但是2.9.1里没有

    工作特点

    • NameNode工作时,始终在内存中保存metedata,用于处理“读请求”。
      metedata的数据是NameNode(FileName, replicas, block-ids,id2host...)这种形式的,如/test/a.log, 3 ,{blk_1,blk_2}, [{blk_1:[h0,h1,h3]},{blk_2:[h0,h2,h4]}]就标识,文件/test/a.log被分为两块进行存储,每个块都要备份存储3次。同时blk_1存储在h0/h1/h3服务器上,blk_2存储在h0/h2/h4服务骑上。
    • 客户端发起“写请求”时,namenode会首先写editlog到磁盘,即向edits文件中写日志,同时会将文件写入hdfs系统,成功返回后,才会修改内存,并且向客户端返回
    • Hadoop会维护一个fsimage文件,也就是namenode中metedata的镜像,但是fsimage不会随时与namenode内存中的metedata保持一致,而是每隔一段时间通过合并edits文件来更新内容。Secondary namenode就是用来合并fsimage和edits文件来更新NameNode的metedata的。

    4.3.2 DataNode

    DataNode提供真实文件数据的存储服务,最基本的存储单位是文件块(block)。
    对于文件内容而言,一个文件的长度大小是size,那么从文件的0偏移开始,按照固定的大小,顺序对文件进行划分并编号,划分好的每一个块称一个Block。HDFS默认Block大小是128MB,以一个256MB文件,共有256/128=2个Block。
    但是不同于普通文件系统的是,HDFS中,如果一个文件小于一个数据块的大小,并不占用整个数据块存储空间。
    需要注意的是,可能在页面展示的时候会如下图:

    文件管理页面展示
    但是我们实际情况是下图:
    后台查看文件实际大小
    同时DataNode是多副本的,也就是hdfs-site.xml的dfs.replication属性配置的值。默认是3。

    4.3.3 Secondary NameNode

    Secondary NameNode是高可用(HA)的一个解决方案。但不支持热备。配置即可。它会从NameNode上下载元数据信息(fsimage,edits),然后把二者合并,生成新的fsimage,在本地保存,并将其推送到NameNode,替换旧的fsimage.

    工作流程

    • secondary通知namenode切换edits文件
    • secondary从namenode获得fsimage和edits(通过http)
    • secondary将fsimage载入内存,然后开始合并edits
    • secondary将新的fsimage发回给namenode
    • namenode用新的fsimage替换旧的fsimage
      流程如下图:


      Secondary NameNode工作流程

    Secondary NameNode工作时机
    Secondary NameNode会在何时进行文件的合并呢,主要有两个参数

    • fs.checkpoint.period 指定两次checkpoint的最大时间间隔,默认3600秒。
    • fs.checkpoint.size 规定edits文件的最大值,一旦超过这个值则强制checkpoint,不管是否到达最大时间间隔。默认大小是64M。

    相关文章

      网友评论

          本文标题:hadoop(3)HDFS概念

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