HDFS
1.Hadoop的组成部分
HDFS:分布式存储系统, – 提供了 高可靠性、高扩展性和高吞吐率的数据存储服务
MapReduces:分布式计算系统, – 具有易于编程、高容错性和高扩展性等优点
Yarn:分布式资源管理框架.– 负责集群资源的管理和调度
2.HDFS数据存储架构
- 字节数组
- 文件都是由字节数组组成的
- 我们可以将字节数组拆分成更小的数组
- 在我们需要的时候,再将字节数组组装到一起
- 拆分
- 文件拆分后可以减少单个节点的压力…存储,传输,计算
- 等分
- 可以统一的设置数据的计算算法
- 因为数据等大,所以每个节点得到的结果相差无几
- 同一个的block必须是相等的.默认为128M,也可自定义配置.存储到不同的节点上,默认有3个副本
- 但是不同文件的block大小是可以不同
- block一旦被上传成功后是不可以被修改的
- 安全
- 因为数据是被切分成很多快的,一旦丢失其中一块,会导致整个文件的合并失败
- 于是一个文件需要保留3个副本 replication
- 副本不能放在同一个节点上
- 副本数不要超过节点数
- 副本越多的话,集群的成本就会越高
- 副本数可以在上传后修改
- 管理
- 我们需要一个专门的节点来管理文件与块,块与节点的映射关系
- 例如:上传一个1T的数据,集群总节点为5000个,每个块大小为1G,那么计算讲1000个块放入5000个节点中,当要使用这个文件时,需要从着5000个节点中寻找,所以我们才要一个专门的管理.
- 注意事项
- 文件上传后绝对不可以被修改.存储的信息包括日志,历史记录
- 但是数据是可以被追加的
- 不管文件有多大,都可以看成是128M
3.HDFS的组织结构*
- NameNode
- 保存
- 数据的元数据信息,…会被持久化
- 文件与块的映射信息,…会被持久化
- 块与DateNode的映射信息
- 不会被持久化
- 每次关机的时候都不会被保存
- 为了防止开机的时候有DateNode节点损坏或者数据文件损坏无法第一时间发现
- 功能
- 启动时
- …合并fsimage和edits
- 接受DateNode的汇报的本节点的信息
- 收集这些信息整理
- 如果某些块的副本数不够最小副本数,会讲这个副本在别的节点上创建并拷贝
- 运行时
- 和所有的DateNode保持心跳机制
- 阈值:3秒.每三秒发送一次心跳.10分钟.如果超过10分钟节点都没有响应就认为lost,会将当前节点的所有数据迁移都其它节点上
- 启动时
- 存储介质
- 是一种完全基于内存存放数据的
- 优点
- 速度快
- 缺点
- 掉电易失,数据不能持久化
- 内存是有限的
- 如果NameNode的内存使用为100%,将无法继续进行其它工作
- 一个大文件或者小文件对应的元数据信息基本相同
- 如果存放过多小文件的时候就会导致元数据占用过多的内存
- 保存
- DateNode
- 保存
- 存放数据的数据信息
- 功能
- 启动时
- 收集自身的数据块信息,汇报个NameNode
- 运行时
- 和NameNode保持心跳机制
- 启动时
- 存储介质
- 硬盘
- 保存
- SecondaryNameNode
- 功能
- 辅助NameNode进行镜像和日志的合并
- 解决持久化的方案
- 日志
- 执行任何操作之前先记录日志
- 启动之后根据日志的编号和数据的编号可以实现数据的前滚和后滚
- 缺点:如果开机时间过长,会导致日志量太大,从而开机时间不可控
- 镜像
- 每次关机的时候拍摄快照
- 下次启动直接读取快照信息即可
- 每次关机时间有可能过长
- 缺点:如果异常关机,有可能当前镜像没有被拍摄,导致数据丢失
- 缺点:如果实时拍摄快照,会占用大量的内存
- 日志
- 解决方案
- 日志+镜像
- 当我们格式化NameNode节点的时候镜像就已经被创建了…fsimage
- 当我们开启集群执行操作的时候就开始记录日志
- edits_00000001-0000000009
- edits_000000010-0000000066
- edits_inprogress_0000067
- 我们每执行一个增删改操作都会产生对应的一个日志,日志都会有一个自增的编号
- 有一个文件脚趾seen_txid记录着下一个要合并日志的起点
- 阈值…64M…3600s
- 运行到达阈值时,讲日志文件和镜像文件都拷贝到SecondaryNamenode节点进行合并
- 合并完成后再考回NameNode
- 功能
4.文件
- 元数据信息 stat
- 数据信息 vim
5.文件权限
- 权限完全可以按照Linux去理解
- 并不是完全限制用户
- 阻止好人做错事,不能防止换人做坏事
6.安全模式
- NameNode启动时接受DateNode汇报的Block数据,检查是否达到最小副本数
7.机架感知
- 是一种选择DateName节点的一种方式
- 外部:资源丰富,业务不繁忙. …内部:当前节点
- 和1节点处于不同机架的任意节点
- 和2节点相同机架的不同节点
- 和前N节点不同节点的任意节点
8.HDFS的有缺点*
- 优点
- 高容错性
- 数据自动保存多个副本
- 副本丢失后,自动恢复
- 适合批量处理
- 移动计算而非数据
- 数据位置暴露给计算框架
- 适合大数据处理
- TB,甚至PB级数据
- 百万规模以上的文件数量
- 10K+ 节点
- 可构建在廉价机器上
- 通过多副本提高可靠性
- 提供了容错和恢复机制
- 高容错性
- 缺点
- 低延迟
- 比如支持秒级反应,不支持毫秒级
- 延迟与高吞吐率问题(吞吐量大但有限制于其延迟)
- 小文件存取
- 占用NameNode大量内存
- 寻到时间超过读取时间
- 并发写入,文件随机修改
- 一个文件只能有一个写者
- 仅支持append
- 低延迟
9.HDFS的文件写入流程*
- 宏观
- 客户端向DFS发送请求,通过RPC调用namenode.create方法
- namenode接受命令后检查权限路径等信息
- 不能通过
- 返回对应的异常
- 通过
- 创建一个空的Entry对象
- 给DFS返回一个成功状态
- 不能通过
- DFS创建FS DateOutputStream对象给客户端使用
- 客户端开始写出数据前首先向NameNode请求当前块要存放的DN
- 假如NameNode返回的块的信息是(DN1,DN2,DN8)
- 客户端开始建立管道(pipeline)…client–>dn1–>dn2–>dn8
- 客户端写出一个块的大小为128M,但是客户端是按照packet(64k)为单位写出
- 讲数据写出到管道,管道按照先后顺序开始传递数据,并等待响应
- 当节点出现问题时就不会向下继续写数据而是直接返回错误状态
- 如果packet传递到最后都没有产生错误,最后一个节点返回成功状态,开始向上一个节点传递
- 包依次开始传递,当最后一个包传递完成,说明block传递成功
- 将这个消息发送给NameNode,NameNode在Entry记录这个文件与块,块与DateNode的映射关系
- 客户端继续请求下一个块的存放DN,NN(DN1,DN2,DN7)
- 当最后一个块也传输完成.NameNode也会记录完最后一个块的信息
- 关闭FSDateOutputStream
- 微观
- block
- 128M
- 一个文件可以切分成多个block
- packet
- 64k
- 管道中传输时的数据的大小
- Chunk
- 512B
- 数据块
- 多个chunk组成了packet
- checksum
- 4B
- chunk的验证结果
- 首先讲客户端硬盘的数据读取到客户端的缓存中
- block
10.HDFS读书的流程
-
客户端向DFS发送读取数据的请求
-
DFS会将用户的请求发送给NameNode
-
NH查询用户的请求数据,检查是否存在权限等问题
- 存在:返回对应的异常
- 不存在:返回block与DN的映射
-
客户端获取到block与DN的映射之后,直接选取最近的节点进行拷贝
-
讲所有的block都获取到之后,合并成一个文件
…(img-mdI8D40O-1574774827148)] -
客户端向DFS发送读取数据的请求
-
DFS会将用户的请求发送给NameNode
-
NH查询用户的请求数据,检查是否存在权限等问题
- 存在:返回对应的异常
- 不存在:返回block与DN的映射
-
客户端获取到block与DN的映射之后,直接选取最近的节点进行拷贝
-
讲所有的block都获取到之后,合并成一个文件
-
关闭流