- 概念: HDFS是Hadoop Distribute File System 的简称(Hadoop 分布式文件系统), 是hadoop核心组件之一, 作为最底层的分布式存储服务而存在.分布式文件系统解决的问题就是大数据存储问题.
- 设计目标
1. 硬件故障是常态: 故障检测和自动快速回复是HDFS的核心架构目标
2. HDFS主要是以流式读取数据, 更注重数据访问的高吞吐量.被设计成批量的处理
3. HDFS支持大文件
4. HDFS对文件的要求是一次写入多次读取
- HDFS重要特性
- 首先是一个文件系统, 其次是分布式
- HDFS采用的是主从架构(master/slave), HDFS集群是有一个 Namenode 和一定数目的 Datanode 组成。Namenode 是 HDFS 集群主节点,Datanode 是 HDFS 集群从节点,两种角色各司其职,共同协调完成分布式的文件存储服务。
- HDFS中的文件是在物理上分块存储的, 默认块的大小是128M
- 名字空间(NameSpace), Namenode负责维护文件系统的名字空间.
- 目录结构及文件分块位置信息叫做元数据, Namenode负责维护整合HDFS系统的目录树结构以及每一个文件所对应的 block 块信息(block 的id,及所在的 datanode 服务器)。
- DataNode文件各个block的具体存储管理有DataNode节点承担, 每一个block都可以咋子多个datanode上Datanode 需要定时向 Namenode 汇报自己持有的 block信息。(默认副本数是3)
- 为了容错, 文件的所有block都有副本.
- HDFS的基本操作
- shell命令
hadoop fs或者(HDFS dfs)
-ls 查看指定路径的当前目录结构
-du 统计目录下个文件大小
-count 统计目录下文件数量
-mv 移动
-rm 删除
-put 上传文件
-text 查看文件内容
-mkdir 创建文件夹
-touchz 创建空白文件
-tail 查看文件尾部信息
-chmod 修改权限
-appendToFile 追加一个文件到已存在的文件末尾
-copyFromLocal 熊本地文件系统拷贝到HDFS路径
-copyTolocal 从HDFS拷贝到本地
-getmerge 合并下载多个文件
- HDFS的结构
NameNode : 分布式文件系统中的管理者,主要负责管理文件系统的命名空间、集群配置信息和存储块的复制等 .NameNode会将系统的MetaData存储在内存中
SecondaryNameNode: 合并fdimage和fsedits log, 然后在发送给NameNode
DataNode: 文件存储的基本单元, 将Block存储在本地文件系统中
Client: 就是需要获取分布式文件系统的文件的应用程序 - 限额操作
-setQuota 设置最多上传文件
-clrQuota 清除文件数量限额
hdfs dfsadmin -setQuota 2 文件名
空间大小限额
-setSpaceQuota 限制空间大小
-clrSpaceQuota 清除空间限额
- HDFS基本原理
- Namenode是HDFS的核心, 也称为master, 仅仅存储HDFS的元数据, 不存储实际数据, 数据本身存储在DataNode中.并不支持持久化存储文件中各个快所在的DataNode的位置信息 ,NameNode 是 Hadoop 集群中的单点故障。
- DataNode负责将实际的数据存储在HDFS中, 也称为Slave.DataNode 会定期(默认是 3 秒)向NameNode 发送心跳,如果 NameNode 长时间没有收到 DataNode 发送的心跳,NameNode 就会认为该DataNode 失效. block 汇报时间间隔默认6小时.
- HDFS工作机制
Namenode负责管理整个文件系统元数据, DataNode负责管理具体文件数据块存储.
Secondary Namenode协助NameNode进行元数据的备份.
HDFS的读数据流程:
- 客户端向NameNode请求上传文件, NameNode检查目标文件是否存在.
- NameNode返回可以上传
- 客户端请求第一个block上传到那几个DataNode.
- NameNode返回3个可用的DataNode节点的位置信息
- 客户端请求dn1上传数据, dn1收到请求会继续调用dn2, 然后dn2调用dn3, 将这个管道建立完成
- dn1, dn2,dn3 逐级返回响应管道建立完成,
- 客户端开始上传第一个block(先从磁盘读取数据放倒一个本地内存缓存), 以packet为单位, 依次传递给dn中
- 当第一个block传输完成, 客户端再次请求上传第二个block重复执行3-7步.
注意: 当第一个block上传完毕, 即显示上传成功.
HDFS的写数据流程:
- 客户端向NameNode请求下载文件, NameNode通过查询元数据, 找到所在的DataNode地址,
- 挑选一台DataNode(就近原则, 然后随机), 请求读取数据
- DataNode开始传输是数据给客户端(从磁盘里读取数据放入流, 以packet为单位校验)
- 客户端以packet为单位接收, 现在本地缓存, 然后写入目标文件.
- HDFS的其他功能
- 集群内部 文件拷贝 scp
scp -r 文件 - 跨集群之间的数据拷贝distcp
- Archive 档案
HDFS不擅长存储小文件, 每个文件的最少一个block.每个block的元数据都会存在Namenode占用内存. Hadoop Achives 可以有效处理这个问题, 他可以把多个文件归档成一个文件. (Achives文件的扩展名 *.har)
例如: hadoop archive -archiveName test.har -p /input /outputdir
创建Archives本质是运行一个MR任务.不支持压缩. 一旦创建无法修改.
- HDFS高阶
- 元数据的管理
fsimage镜像文件: 是元数据的一个持久化的检查点, 包含Hadoop的文件中所有的目录和文件元数据信息.
edits编辑日志: 存放的是Hadoop文件系统的所有更改操作日志.
fsimage和edits log的合并
将文件系统个元数据操作分开操作,是为了提升内存的处理效率。如果不分开处理,即所有的写操作均记录在一个文件中,比如,fsimage中,那么每个操作都会对这个文件进行修改,因为这个文件可能会很大,所以每次进行写操作的时候就会很慢,随着fsimage越来越大,速度便会越来越低。
引入来checkpoint机制, 定时的把edits和fsimage进行合并成新的fsimage.ckpt, 然后在post给NameNode为新的fsimage.
checkpoint的默认时间间隔就是1小时.
NameNode宕机, 可能会有一段时间的fsimage缺失.
下图就是checkpoint的过程: (secondary namenode将namenode上积累的所有edits和一个最新的fsimage下载到本地,并加载到内存进行merge)
遇到的问题: 单点故障和脑裂问题
- 单点故障 (NameNode出现故障) -> 设置HA模式, 会有两个NameNode(active, standby)
active NameNode出现问题, StandBy NameNode监听到之后, 会自动变成Active NameNode. - 脑裂 -> 脑裂通常发生在主从namenode切换时,由于ActiveNameNode的网络延迟、设备故障等问题,另一个NameNode会认为活跃的NameNode成为失效状态,此时StandbyNameNode会转换成活跃状态,此时集群中将会出现两个活跃的namenode .
解决: 使用隔离机制,通过调用活跃节点中的隔离方法,让其主动转换为standby状态,
- HDFS的限额操作
HDFS文件限额操作
以文件大小或者文件个数来限制在某个目录下上传的文件数量或者文件内容总量