单机处理大数据问题:因为内存一般较小,而处理数据需要从磁盘取数据,所以性能瓶颈一般在 IO 上 以下这些点是学习大数据技术时需要关心的重点:
- 分而治之
- 并行计算
- 计算向数据移动
- 数据本地化读取
HDFS
存储模型
- 文件线性按字节切割成块(block),具有 offset,id
- 文件与文件的 block 大小可以不一样
- 一个文件除最后一个 block,其他 block 大小一致
- block 的大小依据硬件的 I/O 特性调整
- 每个版本对支持的 I/O 有提升或是调整,因为磁盘是在进步的,但是如果 Block 设置过大,在MapReduce 任务中,Map或者Reduce任务的个数 如果小于集群机器数量,会使得作业运行效率很低
- 在 1.X 时,一个块默认是 64MB 大小
- 在 2.X 时,一个块默认是 128MB 大小
- 在 3.X 时,一个块默认是 256MB 大小
- block 被分散存放在集群节点中,具有位置(location),用来记录 block 在哪,以此用来还原
- block 具有副本,没有主从概念,副本不能出现在同一节点,副本之间没有主从概念
- 副本是满足可靠性和性能的关键
- 性能的关键:在一个文件会被多个程序计算这个文件的副本,如果副本足够的话,别的程序计算不需要从别的节点拉取这个文件,计算向数据移动
- 文件上传可以指定 block 大小和副本数,上传后只能修改副本数
- 一次写入多次读取,不支持修改数据
- 因为每个块基本上占用的空间是固定的,如果修改会导致后续的文件进行重新计算偏移量与切割
- 支持追加数据
架构设计
- HDFS 是一个主从(Master/Slaves)架构
- 由一个 NameNode 和一些 DataNode 组成
- 面向文件包含:文件数据(data)和文件元数据(metadata)
- NameNode 负责存储和管理文件元数据,并维护了一个层次级的文件目录树,要存储或读取文件数据需要先经过 NameNode
- DataNode 负责存储文件数据(block 块),并提供 block 的读写
- DataNode 与 NameNode 维持心跳,并汇报自己持有的 block 信息
- Client 和 NameNode 交互文件元数据,和 DataNode 交互文件 block 数据
角色功能
NameNode
- 完全基于内存存储文件元数据、目录结构、文件 block 的映射,原因:所有存储与读取都会经过 NameNode ,所以一定要快
- 需要持久化方案保证数据可靠性
- 提供副本放置策略
元数据持久化
注意:NameNode 持久化不包含每个文件的块的位置,因为文件块的位置由 DataNode 主动进行上报,主要是解决一致性问题,比如:从 EditLog 和 FsImage 中得到块的信息后,对应的 DataNode 不存在,那么这个块信息就是个异常的。
- EditsLog
- 日志、体积大,完整性好 FsImage
- 镜像、快照,体积小,有可能丢失一部分数据,记录少,能够更快的回滚 HDFS 使用的方式是:FsImage + EditsLog
- 最近时点的 FsImage + 增量的 EditsLog
安全模式
NameNode 启动时:
- HDFS 搭建时会格式化,格式化操作会产生一个空的 FsImage,防止第二步读取时异常
- 当 NameNode 启动时,它从硬盘中读取 EditLog 和 FsImage
- 将所有的 EditLog 中的事务作用于内存中的 FsImage 上
- 并将这个最新版本的 FsImage 从内存中保存到本地磁盘上
- 然后删除旧的 EditLog,因为这个旧的 EditLog 已经作用在 FsImage上了
NameNode 启动后:
- 会进入一个被称为安全模式的特殊状态
- 处于安全模式的 NameNde 不会向 DataNode 发出任何数据块信息的复制或块删除的指令
- 在安全模式下,所有的 DataNode 会向 NameNode发送心跳信号和块状态报告
- 每当 NameNode 检测确认某个数据块的副本数目达到设置的最小值,那么该数据块就会被认为是副本安全(safely replicated)的
- 在一定时间比(可以配置)的数据块会被 NameNode 检测确认是安全之后,等待额外 30s NamNode就会退出安全模式状态
- 接下来会确定还有哪些数据块的副本没有达到指定数目,并将这些数据块复制到其他 DataNode 上
SecondaryNameNode(SNN)
Ha(high availability)模式没有 SecondaryNameNode ,HDFS 2.X 才有 Ha 模式
- 在非 Ha (高可用)模式下,SNN 一般是独立的节点,周期的完成对 NameNode 的 EditLog 向 FsImage 合并,减少 EditLog 大小,减少 NameNode 启动时间
- 根据配置文件设置的时间间隔 fs,checkpoint.period 默认 3600 秒
- 根据配置文件设置的 EditLog 大小 fs.checkpoint.size,规定 edits 文件的最大值默认为 64MB,超过这个值就会进行
HDFS-HA 解决方案
JournalNode 主从的职能:
- 主:增删改查,同步给从
- 从:查询,增删改的操作会传递给主
- 主与从:过半数同步数据通过即可
DataNode
- 建议不要超过 5000 台,网络的使用、通信等会对业务的访问造成影响
- 基于本地磁盘存储 block(文件的形式)
- 并保存 block 的校验和数据保存 block 的可靠性
- 与 NameNode 保持心跳,汇报 block 列表状态
服务器有:塔式、机架、刀片3种。
HDFS 写原理
摘录自:读写原理
HDFS 如何保证数据的完整性呢?
HDFS 读写过程中的异常处理与恢复_datanode发生重启_午后的红茶meton的博客-CSDN博客
HDFS 的 Block 块比一般单机文件系统大得多,默认为 128M。HDFS 的文件被拆分成 block-sized 的chunk,chunk 作为独立单元存储。比 Block 小的文件不会占用整个 Block,只会占据实际大小。例如, 如果一个文件大小为 1M,则在 HDFS 中只会占用 1M 的空间,而不是 128M。
- block:是文件传输的单位,文件分块上传,块的默认大小见:存储模型
- pcket:是第二大的单位,是 client 向 DataNode 或 DataNode 的PipeLine 之间传数据的单位,默认是 64KB,由一个个 chunk 组成
- chunk:是最小的单位,packet 是由一个个 chunk 组成,是 client 向 DataNode,或 DataNode 向 PipeLine 之间进行数据校验的基本单位,默认 512Byte,还带有一个校验和:checksum(4B),所以实际每个 chunk 写入 packet 的大小为 516Byte。
- 和 NameNode 交互
- NameNode 检查元数据文件的系统目录树
- 若系统目录树的父目录不存在该文件相关信息,返回客户端可以上传文件
- 请求上传第一个 block 数据块,以及数据块副本数量
- 触发副本放置策略,找到可用的数据节点,并对 DataNode 进行排序
- 将节点的 IP 地址返回给客户端
- 和排序的第一个 DataNode 建立 TCP 连接(Pipeline 管道),并把后续的 DataNode 传送给第一个 DataNode,然后和第二个 DataNode 建立 TCP 连接,以此类推
- 逐个返回建立完毕信息
- 客户端与 DataNode 建立数据传输流,开始发送数据包
- 客户端向 DataNode_01 上传第一个 Block 数据块,是以 Packet 为单位,发送数据块,所有的 Packet 依次传输
- Pipeline 反方向逐个发送 ACK
- 最终一个 block 传输完毕之后,继续下一个 block 传递
因为是流式的,DataNode_01 发送给 DataNode_02 之后,客户端还可以继续给DataNode_01 继续发送,一种变种的“并行” ,以此类推,会继续发送后续 block,直至传输完毕
Block块的N个副本的放置策略
- 第一个副本放置:如果在集群内上传 1T 文件,就放置在该 DN 上。如果在集群外上传,则找一个磁盘空间足够、CPU 够用的节点。
- 第二个副本:放置在和副本 1 不同机架的节点上;放置整个机架挂掉
- 第三个副本:放在副本 2 相同机架的节点
- 更多副本:随机机架
HDFS 读原理
- 为了降低整体的带宽消耗与读延时,HDFS 会尽量让读取程序读取离它最近的副本
- 如果在读取程序的同一个机架上有一个副本,那么就读取该副本
- 如果一个 HDFS 集群跨越多个数据中心,那么客户端也将首先读取本地数据中心的副本
- 下载文件可以不下载全部文件,可以只的某一 block 块
- HDFS 支持 client 给出文件的 offset 自定义连接哪些 block 的 DataNode 自定义获取数据
- 这个支持计算层分治、并行计算的核心
流程如下:
- 客户端向 NameNode 发起 RPC 请求,来获取请求文件 Block 数据块所在的位置
- NameNode 检测元数据文件,会视情况返回 Block 块信息或全部 Block 块信息,对于每个 Block 块,NameNode 都会返回该 Block 副本的 DataNode 地址
- 客户端会选取排序靠前的 DataNde 来依次读取 Block 块,每一个 Block 块都会进行 checkSum(完整性校验),若文件不完整,则客户端则会选取另外最近的 DataNode 进行读取,直到验证读取文件是完整的,则 Block 读取完毕
安装配置
基础设施
操作系统、环境、网络、必备软件
- 设置 IP 及主机名
- 关闭防火墙
- 设置 hosts 映射,一般使用 host 映射,真正执行的时候读取文件,转换成 IP 地址,在软件中引用的是名称而不是地址。所有软件引用该地址只需要修改 host 映射,解耦
- 时间同步,所有节点时间需要同步,不然做心跳时,可能认为有问题
- 安装 JDK
- 设置 SSH 免秘钥