文章目录
- 第3章 分布式文件系统HDFS
- 3.1 分布式文件系统
- 3.1.1 计算机集群结构
- 3.1.2 分布式文件系统的结构
- 3.1.3 分布式文件系统的设计需求
- 3.2 HDFS
- 3.2.1 HDFS 简介及相关概念
- 3.2.2 HDFS 体系结构
- 3.2.3 HDFS 存储原理
- 3.2.4 HDFS 数据读写过程
- 3.2.5 HDFS 编程实践
- 第4章 分布式数据库HBase
- 4.1 HBase 概述
- 4.1.1 HBase 简介
- 4.2 HBase 数据模型
- 4.2.1 数据模型概述
- 4.2.2 数据模型的相关概念
- 4.2.3 数据坐标
- 4.2.4 概念视图
- 4.2.5 物理视图
- 4.2.6 面向列的存储
- 4.3 HBase 实现原理
- 4.4 HBase 运行机制
- 4.5 HBase 编程实践
- 第5章 NoSQL数据库
- 第6章 云数据库
第3章 分布式文件系统HDFS
3.1 分布式文件系统
- 分布式文件系统:通过网络实现文件在多台主机上进行分布式存储的文件系统
- 分布式文件系统设计一般采用 “客户机/服务器” 模式
- 广泛应用的分布式文件系统:GFS 和 HDFS
3.1.1 计算机集群结构
- 计算机节点、机架、交换机
3.1.2 分布式文件系统的结构
-
数据块是数据读写的基本单元
-
分布式文件系统的物理结构:
- 主节点/名称节点:负责文件和目录的创建、删除、重命名;管理数据节点和文件块的映射关系
- 从节点/数据节点:负责数据的存储、读取
-
故障应对:多副本存储
-
分布式文件系统针对大规模数据设计,用于处理大规模文件
3.1.3 分布式文件系统的设计需求
- 透明性
- 并发控制
- 文件复制
- 硬件和操作系统的异构性
- 可伸缩性
- 容错
- 安全
3.2 HDFS
3.2.1 HDFS 简介及相关概念
- HDFS 原是 Apache Nutch 搜索引擎的一部分,现是 Apache 子项目
- HDFS + MapReduce ≈ Hadoop
- HDFS 实现目标:
- 兼容廉价的硬件设备
- 流数据读写
- 大数据集
- 简单的文件模型
- HDFS 应用局限:
- 不适合低延迟数据访问
- 无法高效存储大量小文件
- 不支持多用户写入及任意修改文件
1. 块
- 以块为单位读写数据 ,把磁盘寻道时间分摊到大量数据中
- HDFS 寻址开销包括:磁盘寻道开销、数据块定位开销
- HDFS 默认数据块大小64MB/128MB
- HDFS 采用块概念的好处:
- 支持大规模文件存储
- 简化系统设计
- 适合数据备份
2. 名称节点和数据节点
(1)名称节点
- 名称节点(NameNode)负责管理分布式文件系统的命名空间 (Namespace),保存了两个核心的数据结构:FsImage 和 EditLog
- FsImage用于维护文件系统树以及文件树中所有的文件和文件夹的元数据
- 操作日志文件EditLog中记录了所有针对文件的创建、删除、重命名等操作
- 名称节点记录了每个文件中各个块所在的数据节点的位置信息
- FsImage文件
- 名称节点的启动
- 名称节点运行期间EditLog不断变大的问题【第二名称节点】
(2)数据节点
- 数据节点是分布式文件系统HDFS的工作节点,负责数据的存储和读取
- 根据客户端或者是名称节点的调度来进行数据的存储和检索,并且向名称节点定期发送自己所存储的块的列表
- 每个数据节点中的数据会被保存在各自节点的本地Linux文件系统中
3. 第二名称节点
- 第二名称节点是HDFS架构中的一个组成部分,它是用来保存名称节点中对HDFS 元数据信息的备份,并减少名称节点重启的时间。SecondaryNameNode一般是 单独运行在一台机器上、
- SecondaryNameNode的工作情况:
- (1)SecondaryNameNode会定期和 NameNode通信,请求其停止使用EditLog 文件,暂时将新的写操作写到一个新的文件 edit.new上来,这个操作是瞬间完成,上层 写日志的函数完全感觉不到差别
- (2)SecondaryNameNode通过HTTP GET方式从NameNode上获取到FsImage和 EditLog文件,并下载到本地的相应目录下
- (3)散SecondaryNameNode将下载下 来的FsImage载入到内存,然后一条一条地 执行EditLog文件中的各项更新操作,使得 内存中的FsImage保持最新;这个过程就是 EditLog和FsImage文件合并
- (4)SecondaryNameNode执行完③操作之后,会通过post方式将新的 FsImage文件发送到NameNode节点上
- (5)NameNode将从 SecondaryNameNode接收到的新的 FsImage替换旧的FsImage文件,同时将 edit.new替换EditLog
3.2.2 HDFS 体系结构
- HDFS采用了主从(Master/Slave)结构模型,一个HDFS集群包括一个名称节点(NameNode)和若干个数据节点(DataNode)
- 名称节点:作为中心服务器,负责管理文件系统的命名空间及客户端 对文件的访问。
- 数据节点:
- 集群中的数据节点,一个节点运行一个数据节点进程
- 数据节点负责处理文件系统客户端的读/写请求,在名称节点的统一调度下进行数 据块的创建、删除和复制等操作
- 每个数据节点的数据实际上是保存在本 地Linux文件系统中的
1. HDFS 命名空间管理
- HDFS 命名空间包括:目录、文件、块
- 命名空间管理:命名空间支持对HDFS中的目录、文件、块,做类似文件系统的创建、修改、删除等基本操作
- HDFS使用传统的分级文件体系,用户可以像使用普通文件系统一样,创建、删除目录和文件,在目录间转移文件,重命 名文件等
2. 通信协议
- HDFS是一个部署在集群上的分布式文件系统,很多数据需要通过网络进行传输
- 所有的HDFS通信协议都是构建在TCP/IP协议基础之上的
- 客户端通过一个可配置的端口向名称节点主动发起TCP连接,并使用客户端协议与名称节点进行交互
- 名称节点和数据节点之间使用数据节点协议进行交互
- 客户端与数据节点的交互是通过RPC(Remote Procedure Call)来实现的
- 在设计上,名称节点不会主动发起RPC,而是响应来自客户端和数据节点的RPC请求
3. 客户端
- 客户端:用户操作HDFS常用方式,HDFS在部署时提供客户端
- HDFS客户端是一个库,暴露了HDFS文件系统接口,这些接口隐藏了HDFS实现中的大部分复杂性
- 严格来说,客户端并不算是HDFS的一部分
- 客户端可以支持打开、读取、写入等常见的操作,并且提供了 类似Shell的命令行方式来访问HDFS中的数据
- 此外,HDFS也提供了Java API,作为应用程序访问文件系统的 客户端编程接口
4. HDFS 体系结构的局限性
- HDFS 只设置位移名称节点,简化了系统设计,同时有明显局限性:
- 命名空间的限制
- 性能的瓶颈
- 隔离问题
- 集群的可用性
3.2.3 HDFS 存储原理
1. 数据的冗余存储
- HDFS 采用多副本方式,对数据进行冗余存储
- 目的:保证系统的容错性和可用性
- 多副本方式优点:
- 加快数据传输速度
- 容易检查数据错误
- 保证数据的可靠性
2. 数据存取策略
-
数据存放
- 第一个副本:放置在上传文件的数据节点;如果是集群外提交,则随机挑选一台磁盘不太满、CPU不太忙的节点
- 第二个副本:放置在与第一个副本不同的机架的节点上
- 第三个副本:与第一个副本相同机架的其他节点上
- 更多副本:随机节点
-
数据读取
- HDFS提供了一个API可以确定一个数据节点所属的机架ID,客户端也可以调用API获取自己所属的机架ID
- 当客户端读取数据时,从名称节点获得数据块不同副本的存放位置列表, 列表中包含了副本所在的数据节点,可以调用API来确定客户端和这些 数据节点所属的机架ID,当发现某个数据块副本对应的机架ID和客户端 对应的机架ID相同时,就优先选择该副本读取数据,如果没有发现,就 随机选择一个副本读取数据
-
数据复制
3. 数据错误与恢复
- 名称节点出错
- 名称节点保存了所有的元数据信息,其中,最核心的两大数据 结构是FsImage和Editlog,如果这两个文件发生损坏,那么整个 HDFS实例将失效。
- 因此,HDFS设置了备份机制,把这些核心文件 同步复制到备份服务器SecondaryNameNode上。
- 当名称节点出错时, 就可以根据备份服务器SecondaryNameNode中的FsImage和Editlog 数据进行恢复
- 数据节点出错
- 每个数据节点会定期向名称节点发送“心跳”信息,向名称节点报告自 己的状态
- 当数据节点发生故障,或者网络发生断网时,名称节点就无法收到来自一些数据节点的心跳信息,这时,这些数据节点就会被标记为“宕机”, 节点上面的所有数据都会被标记为“不可读”,名称节点不会再给它们 发送任何I/O请求
- 这时,有可能出现一种情形,即由于一些数据节点的不可用,会导致一 些数据块的副本数量小于冗余因子
- 名称节点会定期检查这种情况,一旦发现某个数据块的副本数量小于冗 余因子,就会启动数据冗余复制,为它生成新的副本
- HDFS和其它分布式文件系统的最大区别就是可以调整冗余数据的位置
- 数据出错
- 网络传输和磁盘错误等因素,都会造成数据错误
- 客户端在读取到数据后,会采用md5和sha1对数据块进行校验,以确定读取到正确的数据
- 在文件被创建时,客户端就会对每一个文件块进行信息摘录,并把这些信息 写入到同一个路径的隐藏文件里面
- 当客户端读取文件的时候,会先读取该信息文件,然后,利用该信息文件对每个读取的数据块进行校验,如果校验出错,客户端就会请求到另外一个数据节点读取该文件块,并且向名称节点报告这个文件块有错误,名称节点会定期检查并且重新复制这个块
3.2.4 HDFS 数据读写过程
- 读数据过程
- 写数据过程
3.2.5 HDFS 编程实践
- HDFS 常用命令
- HDFS 的Web页面
- HDFS 常用Java API 及应用实例
第4章 分布式数据库HBase
4.1 HBase 概述
4.1.1 HBase 简介
- HBase是一个高可靠、高性能、面向列、可伸缩的分布式数据库,是谷歌BigTable的 开源实现,主要用来存储非结构化和半结构化的松散数据。HBase的目标是处理非常 庞大的表,可以通过水平扩展的方式,利用廉价计算机集群处理由超过10亿行数据和 数百万列元素组成的数据表