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的文件存储在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。
网友评论