HDFS

作者: 436048bfc6a1 | 来源:发表于2018-12-04 20:43 被阅读0次
    1. block块

    1.1 如何找对应版本的HDFS的blocksize

    官网上hdfs-default.xml找到对应的字段

    dfs.blocksize 134217728 (128M) The default block size for new files, in bytes

    1.2 block计算的Example

    (1) 假设一个文件130M, 那么它一共占据2个block,分别为128M和2M
    
    假设一个文件260M,那么它一共占据2个block,分别为2个128M和2M
    
    1. 副本数

    2.1 副本数在xml中的表示

    dfs.replication 3 Default block replication.
    注: 一般生产中是配置3个块
    

    2.2 副本数计算Example

    文件160M,副本系数为2, 实际空间为多少?多少个块?
    

    3.HDFS架构

    3.1 HDFS使用主从架构

    其中分为三部分
    NN、SNN、DN
    NN是主节点,也叫名称节点 
    SNN在主节点挂了之后起作用,也叫第二名称节点
    DN是从,也叫数据节点
    

    3.2 NN(NameNode)


    1.png
    注: 其中圆形代表数据块1,菱形代表数据块2
    
    (1) NN代表文件系统的命名空间
    (2) 存储内容
        a. 文件名称
        b. 文件目录结构
        c. 文件属性(包括创建时间、权限、副本数)
        d. blockmap: 文件对应的数据块与数据块分布的datanode节点一一映射关系
           注: namenode不会持久化存储这种映射关系
               主要靠datanode定期发送blockreport给master说明机器上存储了哪些数据块的副本,master接收信息后定期更新存储关系
               namenode在内存中动态维护该映射关系
    (3) NameNode主要维护的是文件的目录系统(文件系统树),以两种文件永久保存在磁盘上
        文件分别为
            a. 命名空间镜像文件 fsimage
            b. 编辑日志 editlog
    
    

    3.3 DataNode

    (1) 作用: 
             a. 存储数据块和块的checksum
                i) 当某一个副本的checksum不对,会复制其他的副本
                ii) 如果所有副本都错误,会在50070的web界面显示出来
             b. 与NN通信: 
                i)  每隔3秒向master发送心跳包
                ii)  每10次发送一个blockreport
             c. 主要用途
                文件数据块的读写 
    

    3.4 SNN

    (1)SNN存储的内容:  fsimage + editlog 
    
    (2)作用: 定期合并fsimage + editlog为新的fsimage并推送给NN,该文件被称作checkpoint
    

    (3) 参数

    dfs.namenode.checkpoint.period: 3600
    
    如果namenode机器failure,SNN跟namenode不在同一台机器上,SNN可以恢复获得checkpoint时间的文件目录
    
    例如NN已经执行7小时12分,SNN每到一小时就将NN的fsimage和editlog文件合并存入SNN, 但是如果此时NN failure, SNN只能恢复到7小时的时候
    

    3.5 fsimage与editlog

    (1) fsimage指镜像文件,editlog是操作日志
    
    (2) fsimage代表某一时间系统的文件系统树, editlog代表的是从该时间点之后所进行的操作
    

    (3) NN与SNN示意图


    1.png
    注: 
    (1) 当checkpoint时间到时,SNN将NN的fsimage和editlog拿过来并将其合并成一个新的镜像文件
    (2) 到达检查点时,回生成新的editlog文件,之后所进行的操作都写在新的editlog文件中
         注: 如果在到达下次checkpoint前操作比较频繁,editlog不一定只有一个,可能会有多个
    (3) SNN将新生成的image传输给NN
    (4) 新的fsimage就是checkpoint后的fsimage, 新的editlog就变成editlogs
    

    3.6 副本放置策略

    (1) 机架示意图


    2.png
    (2) 第一个副本存放策略
    
    假设客户端提交文件所在的机器就是datanode节点,那么第一个块就在该datanode节点上
    如果不是就存储在磁盘不满,cpu不繁忙的节点上(通过NN)
    
    (3) 其他副本的策略
    
    if 一个机架:
        其他副本放置机器上 except 第一个副本的机器
    if 多个机架
        第二个副本放置与另一个机架的节点上,第三个副本放置于与第二个副本相同机架不同的节点上
    
    3.png

    3.7 文件写流程


    1.png

    用户只关心是否将文件读出来或者是否写入文件成功,具体怎么做的不关心

    (1)主要职责:  将linux文件放入HDFS中
    
    (2)流程
        a. client调用Distributed file system的create方法, 其参数就是文件夹路径
           dfs.create(path)
        b. 与NN进行rpc通信,检查该路径是否存在&&检查是否有权限创建
           if (check == true):
              创建一个新文件,但是不关联任何block(也就是空文件)
              return FSDataOutputStream对象
           else:
              返回相应的错误信息
        c. Client调用FSDataOutputStream对象的write方法将第一个块写给DN1,
           写完之后DN1复制块到DN2,DN2复制块到DN3
           都写完DN3返回ack packet给DN2,DN2收到ack packet后发送ack给DN1
           当DN1收到DN2的ack, 发送ack给FSDataOutputStream对象
           到此标识第一个块3个副本全部写完,其它块也这样写
        d. 当文件写完成, client调用FSDataOutputStream的close()方法
           关闭输出流, flush缓存区的数据包
        e. 再调用Distributed file system的complete()方法, 告诉NN已经写完
    
    (3) 注意
          写流程是输出过程, FSDataOutputStream
          读流程是输入过程, FSDataInputStream
          都是以client角度来说
    

    3.8 上传文件

    (1) 三种命令
          a. hdfs dfs -ls /  表示hdfs文件系统的根目录而不是linux磁盘的
          b. hdfs dfs -ls hdfs://hadoop001:9000/等价于上面命令
              其中hdfs://hadoop001:9000来自于core-site.xml的配置
          c. hdfs dfs -ls  表示读取当前命令操作的用户的路径, 也就是/user/$USER_NAME
           
    
    (2) put
        hdfs dfs -put 123.txt         将linux文件上传到HDFS中
    
    (3) put权限
    使用root用户执行bin/hdfs dfs -put README.txt /会出现如下输出
    put: Permission denied: user=root, access=WRITE,
    inode="/":hadoop:supergroup:drwxr-xr-x
    user为root用户想要使用写权限, 文件放在根节点,该节点的用户是hadoop, 用户组是supergroup
    
    rwxr-xr-x表示
    hadoop用户有读写执行的权限
    hadoop所在的用户组有读与执行的权限
    其他用户有读与执行的权限
    
    如何解决
    (1) 切换到目录所需用户(大部分使用次方式)
    (2) 修改文件夹对应的用户和用户组
          a. hdfs dfs -chown -R root:root /henry
    

    3.9 HDFS常用命令

    (1) hdfs dfs -ls /
    
    (2) hdfs dfs -put a.txt /
         hdfs dfs -copyFromLocal a.txt /
        上传 a.txt到根目录
    
    (3) hdfs dfs -get /a.txt ./ 
         hdfs dfs -copyToLocal /a.txt ./
         将hdfs的根目录下的a.txt文件下载到当前目录
    
    (4) hdfs dfs -cat /a.txt
         查看HDFS中某文件的内容
    
    (5) hdfs dfs -rm /a.txt
        删除hdfs中文件
    
    (6) hdfs dfs -rm /henry
        删除hdfs中文件夹
    
    (7) hadoop fs
        等价于hdfs dfs
        会输出如下
    
    Usage: hadoop fs [generic options]
        [-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] <localsrc> ... <dst>]
        [-copyToLocal [-p] [-ignoreCrc] [-crc] <src> ... <localdst>]
        [-count [-q] [-h] [-v] <path> ...]
        [-cp [-f] [-p | -p[topax]] <src> ... <dst>]
        [-createSnapshot <snapshotDir> [<snapshotName>]]
        [-deleteSnapshot <snapshotDir> <snapshotName>]
        [-df [-h] [<path> ...]]
        [-du [-s] [-h] <path> ...]
        [-expunge]
        [-find <path> ... <expression> ...]
        [-get [-p] [-ignoreCrc] [-crc] <src> ... <localdst>]
        [-getfacl [-R] <path>]
        [-getfattr [-R] {-n name | -d} [-e en] <path>]
        [-getmerge [-nl] <src> <localdst>]
        [-help [cmd ...]]
        [-ls [-d] [-h] [-R] [<path> ...]]
        [-mkdir [-p] <path> ...]
        [-moveFromLocal <localsrc> ... <dst>]
        [-moveToLocal <src> <localdst>]
        [-mv <src> ... <dst>]
        [-put [-f] [-p] [-l] <localsrc> ... <dst>]
        [-renameSnapshot <snapshotDir> <oldName> <newName>]
        [-rm [-f] [-r|-R] [-skipTrash] <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>]
        [-setrep [-R] [-w] <rep> <path> ...]
        [-stat [format] <path> ...]
        [-tail [-f] <file>]
        [-test -[defsz] <path>]
        [-text [-ignoreCrc] <src> ...]
        [-touchz <path> ...]
        [-usage [cmd ...]]
    
    Generic options supported are
    -conf <configuration file>     specify an application configuration file
    -D <property=value>            use value for given property
    -fs <local|namenode:port>      specify a namenode
    -jt <local|resourcemanager:port>    specify a ResourceManager
    -files <comma separated list of files>    specify comma separated files to be copied to the map reduce cluster
    -libjars <comma separated list of jars>    specify comma separated jar files to include in the classpath.
    -archives <comma separated list of archives>    specify comma separated archives to be unarchived on the compute machines.
    
    The general command line syntax is
    bin/hadoop command [genericOptions] [commandOptions]
    
    (8) hdfs dfsadmin -report
        查看集群的健康状况
    
    (9) hdfs dfsadmin -safemode [-safemode enter | leave | get | wait]
        安全模式: 如果在log文件中显示NN节点处于safemode, 说明不能上传文件到hdfs上或者不能写入hdfs上的文件    
    
    注:
    (1) 如果人为让NN进入安全模式,代表集群只读,可以做维护,完成维护后再离开
    (2) 异常情况如hdfs损坏, nn节点自动进入安全模式
           解决方法
               if 手工的尝试leave成功:
                   进入正常模式
               elif 不成功(一般由于block损坏造成的):
                    仔细看NN节点的log日志,分析错误
    

    3.10 pid文件

    (1) pid默认存储在/tmp文件下
    
    (2) pid文件的内容就是进程号
    
    (3) pid文件删除不影响文件正常运行
    
    (4) 修改pid文件所在位置export 
    修改hadoop-env.sh
    HADOOP_PID_DIR=${HADOOP_PID_DIR}
    
    (5) 一个坑
    由于pid文件默认放在/tmp目录下,而/tmp文件默认一个月清理一次,会造成pid文件丢失,关闭集群时无法正确关闭相应的namenode或者datanode
    
    解决方法: 使用ps -ef找到对应的pid,kill -9 该pid之后,重新启动dfs
    

    3.11 HDFS回收站

    (1) 如何设置HDFS回收站
            <property>
                    <name>fs.trash.interval</name>
                    <value>1440</value>
            </property>
            <property>
                    <name>fs.trash.checkpoint.interval</name>
                    <value>0</value>
            </property>
    
    (3) 开启回收站后显示
    如果使用bin/hdfs dfs -rm /123.txt会输出
    'hdfs://hadoop001:9000/123.txt' to trash at: 
    hdfs://hadoop001:9000/user/hadoop/.Trash/Current/123.txt
    使用bin/hdfs dfs -cat hdfs://hadoop001:9000/user/hadoop/.Trash/Current/123.txt
    可以找到该文件
    
    注意: 生产商必须开启回收站,自动保存时长为7天或者更长达到14天左右
    

    3.12 HDFS读流程


    HDFS写流程.png
    注: 整个过程对用户是透明的,用户对其无感知
    

    相关文章

      网友评论

          本文标题:HDFS

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