Hadoop核心知识学习记录
2022-06-14 15:42:20 2 举报
AI智能生成
Hadoop核心知识学习记录
作者其他创作
大纲/内容
HDFS的一种工作状态,集群启动时的一个状态
处于安全模式的状态下,只向客户端提供文件的只读视图,不接受对命名空间的修改,同时NameNode节点也不会进行数据块的复制或者删除
系统中的数据块的位置并不是由NameNode维护的,而是以块列表的形式存储在DataNode中
安全模式下,各个DataNode会向NameNode发送自身的数据块列表
安全模式下,NameNode发现数据节点过少会启动数据块复制过程
1、首先将镜像文件(fsimage)载入内存,并执行编辑日志(edits)中的各项操作
2、一旦在内存中成功建立文件系统元数据的映像,则创建一个新的fsimage文件和一个空的编辑日志
3、NameNode开始监听RPC和Http请求
4、此时NameNode处于安全模式,只接受客户端的读请求
5、当NameNode有足够的数据块信息后,便在30秒后退出安全模式
NameNode启动时
hadoop dfsadmin -safemode enter
进入安全模式
hadoop dfsadmin -safemode get
查看安全模式状态
hadoop dfsadmin -safemode leave
强制NameNode退出安全模式
hadoop dfsadmin -safemode wait
等待一直到安全模式结束
手动开启安全模式
启动安全模式
安全模式
公钥,私钥
kerberos
为了保证副本在集群的安全性
可靠性
可用性
带宽消耗
将副本放在不同的DN节点上,考虑以下几点
优先考虑和客户端形同节点作为第一节点
集群内部
选择资源丰富且不繁忙的节点为第一节点
集群外部
第一节点
和第一节点不同机架的其他节点
第二节点
与第二节点相同机架的其他节点
第三节点
与前面节点不重复的其他节点
第N节点
节点选择
机架感知(Rack Awareness)
机架感知策略
使得HDFS支持多个命名空间,并且允许在HDFS中同时存在多个Name Node
NameNode所能存储的对象(文件+块)数目受到NameNode所在JVM的heap size的限制
命名空间(Namespace)的限制
整个HDFS文件系统的吞吐量受限于单个Namenode的吞吐量
性能瓶颈
HDFS上的一个实验程序就很有可能影响整个HDFS上运行的程序
隔离问题
Namenode的宕机无疑会导致整个集群不可用
集群的可用性
将Namenode的Heap空间扩大到512GB启动花费的时间太长
Namenode在Full GC时,如果发生错误将会导致整个集群宕机
纵向扩展
单NN的局限性
属于单个命名空间的一组块管理区域
每一个datanode为所有的block pool存储
Datanode是一个物理概念,而block pool是一个重新将block划分的逻辑概念
一个Namenode失效不会影响其下的datanode为其他Namenode的服务
datanode与Namenode建立联系并开始会话后自动建立Block pool
块池(Block Pool)
一个Namespace和它的Block Pool合在一起称作Namespace Volume
Namespace Volume是一个独立完整的管理单元。当一个Namenode/Namespace被删除,与之相对应的Block Pool也也被删除
命名空间卷(Namespace Volume)
通过多个namenode/namespace把元数据的存储和管理分散到多个节点中
namenode/namespace可以通过增加机器来进行水平扩展
Federation
联邦机制(Federation)
hadoop2.x启用了主备节点切换模式(1主1备)
解决单点故障
通过联邦机制
性能问题
通过日志管理系统实时存储日志
日志问题
Hadoop2.x升级重点解决Hadoop1.x的缺陷
NN 的主节点(活跃的)
接受客户端请求,查询数据块DN信息
存储数据的元数据信息:Block信息、与DN的映射
ANN(Active NameNode)
NN 的备用节点
不会发出任何指令
内存数据和主节点内存数据几乎是一致的
SNN(Standby NameNode)
启动时:接受DN的block汇报
运行时:时刻和DN保持心跳
存储完全基于内存
存储的优点:数据处理效率高
存储的缺点:数据不能持久化
相同点
SNN不能发出任何指令
不同点
两者的区别
HA集群的状态正确至关重要,一次只能有一个NameNode处于活动状态
NN(NameNode )
文件的Block数据存储
数据存储在硬盘
启动时:同时向两个NN(ANN、SNN)汇报Block信息
运行时:同时和两个NN(ANN、SNN)节点保持心跳机制
DN(DataNode)
共享存储系统,NameNode通过共享存储系统实现日志数据同步
一般由奇数个 JN(JournalNode)节点组成,实现原理与Zookeeper一致(Paxos)
每个JN对外有一个简易的RPC接口,以供NN读写EditLog到JN本地磁盘
1、ANN产生日志文件时同时发送到JN的集群中的每一个节点上
2、JN集群中只要有半数以上的节点接受到日志,那么这条日志就生效
3、SNN 每隔一段时间就去QJM上获取最新日志并合并日志
QJM合并日志和镜像
JournalNode只允许单个NN成为主节点。在故障转移期间,将要变为活动状态的NN将承担写入JournalNodes的角色,这将有效地防止另一个NN继续处于活动状态,从而使新的Active节点可以安全地进行故障转移
QJM(Quorum JournalNode Manager)
为主备切换控制器提供主备选举支持
辅助投票
和ZKFC保持心跳机制,确定ZKFC的存活
ZK(Zookeeper)
Zookeeper故障转移控制器
在ANN故障时借助Zookeeper实现指定主备选举和切换
为了防止因为NN的GC(垃圾回收)失败导致心跳受影响,ZKFC作为一个daemon进程从NN分离出来
对NN的主备切换进行总体控制,及时检测NN的健康状态
当ZKFC只检查到一个节点是健康状态时,直接将其设置为主节点
当ZKFC检查到有两个节点是健康状态时,发起投票机制,选出一个主节点,一个备用节点,并修改主备节点的状态
集群启动时
负责检测NN的健康状态
HealthMonitor
订阅事件并管理NN的状态,负责fencing
ZKFailoverController
负责完成自动主备切换
ActiveStandbyElector
3大组件协同实现主备切换
1、HealthMonitor时刻监听ANN的健康状态,当ANN出现故障时,反馈给ZKFailoverController
2、通知ActiveStandbyElector需要主备选举
3、利用Zookeeper完成主备选举
4、选举完成后通知ZKFailoverController主备选举结果
5、最后切换主备状态
故障时主备切换流程
集群运行时
1、NameNode 在选举成功后,ActiveStandbyElector会在 zk 上创建一个ActiveStandbyElectorLock 临时节点,而没有选举成功的备 NameNode 中的 ActiveStandbyElector会监控这个节点
2、如果 Active NameNode 对应的 HealthMonitor 检测到 NameNode 的状态异常时, ZKFailoverController 会主动删除当前在 Zookeeper 上建立的临时节点ActiveStandbyElectorLock
4、处于 Standby 状态的 NameNode 的 ActiveStandbyElector 注册的监听器就会收到这个节点的 NodeDeleted 事件,并创建 ActiveStandbyElectorLock 临时节点,本来处于 Standby 状态的 NameNode 就选举为Active NameNode 并随后开始切换为 Active 状态
主备节点正常切换流程
ZKFC(Zookeeper Failover Controller)
分支主题
Hadoop-HA集群组件
出现两个NameNode同时服务于整个集群的情况
定义
网络延时
心跳故障
设备故障
原因
主从NN切换时,由于ANN出现问题,另一个SNN会认为ANN成为失效状态,此时SNN会转换成活跃状态,此时集群中将会出现两个SNN
NN在垃圾回收(GC)时,可能会在长时间内整个系统无响应
ZKFC无法向ZK写入心跳信息,可能会导致临时节点掉线,SNN会切换到 Active 状态
场景
任一时刻,只能有一个 NN 可以写入
第三方共享存储
1、NN与DN心跳时,NN携带当前状态和序列号
2、DN本地维护此序列号,当接收到的序列化小于本地的序列号时,不让其进行连接
需要保证只有一个 NN 发出与管理数据副本有关的删除命令
DataNode
需要保证同一时刻只有一个 NN 能够对 Client 的请求发出正确的响应
Client
解决方案(隔离-Fencing)
1、当NN成为ANN之后会创建Zookeeper临时节点ActiveStandbyElectorLock和持久节点ActiveBreadCrumb,这个节点里面保存了这个 ANN的地址信息
正常的状态下关闭时,会一起删除这个持久节点
通过 SSH 登录到目标机器上,执行命令 fuser 将对应的进程杀死
sshfence
执行一个用户自定义的 shell 脚本来将对应的进程隔离
shellfence
隔离措施
异常的状态下关闭时,那么由于ActiveBreadCrumb 是持久节点,会一直保留下来,后面当另一个 NN选主成功之后,会注意到上一个ANN 遗留下来的这个节点,从而会回调 ZKFailoverController的方法对旧的 ANN 进行 fencing ----尝试调用这个旧 ANN的 HAServiceProtocol RPC 接口的transitionToStandby 方法,看能不能把它转换为 Standby 状态,如果不能就执行 Hadoop 配置文件之中预定义的隔离措施
2、ANN的 ActiveStandbyElector在关闭 Zookeeper Session 的时候
3、在成功地执行完成 fencing 之后,选主成功的 ActiveStandbyElector 才会回调 ZKFailoverController 的 becomeActive 方法将对应的 NN转换为 Active 状态,开始对外提供服务
4、新的主NN创建临时节点ActiveStandbyElectorLock和持久化节点ActiveBreadCrumb ,并将自己的主机地址Node02赋值给初始化节点
解决方案实现
脑裂(Brain-Spilt)
Hadoop-HA
擦除编码EC(Erasure Encoding)
一主多备
服务器端口修改
DataNode 平均分配
jdk8
优化hadoop-ha脚本
重构Hadoop Client Jar包
其他
Hadoop3.x新特性
1、数据的存储:分布式的文件系统
2、数据的计算:分布式计算
大数据思想
分
Hadoop最早起源于Nutch
狭义上来说,hadoop就是单独指代hadoop这个软件
广义上来说,hadoop指代大数据的一个生态圈,包括很多其他的软件
Common
HDFS(Hadoop Distributed File System)分布式文件系统
YARN(Yet Another Resource Negotiator)另一种资源协调者
MapReduce
核心Model
HBase
Hive
Spark
Redis
Zookeeper
Flink
Pig
......
相关项目
Hadoop简介
基于硬盘之上的一个文件管理的工具
操作文件系统可以和硬盘进行解耦
FS(File System)文件系统
将数据存放在多台电脑上存储
HDFS是mapreduce计算的基础
DFS(Distributed File System)分布式文件系统
文件系统架构
文件存放在一个磁盘上效率低
文件在磁盘真实存储文件的抽象概念
数组可以进行拆分和组装,源文件不会受到影响
字节数组
对字节数组进行切分
切分数组
拼接数据
当前数据在数组中的相对位置,可以理解为下标
偏移量
不管文件的的大小,所有的文件都是由字节数组构成
切分文件,就是将一个字节数组分成多份
将切分后的数据拼接到一起,数据可以继续使用
根据数据的偏移量将他们重新拼接到一起
数据存储的原理
文件切分思想
拆分的数据块需要等大,除了最后一个节点外
拆分标准
数据被切分后的一个整体称之为块
文件大小不同可以设置不同的块的数量
根据文件大小和集群节点的数量综合考虑块的大小
块的大小一旦文件上传之后就不允许被修改
数据块 Block
修改会影响偏移量
修改会导致数据倾斜
修改数据会导致蝴蝶效益
追加设置需要手动打开
HDFS中一旦文件被存储,数据不允许被修改,可追加
一般HDFS存储的都是历史数据,Hadoop的mr都用来进行离线数据的处理
Block拆分标准
对存储数据做备份
备份的数据肯定不能存放在一个节点上
使用数据的时候可以就近获取数据
备份的数量要小于等于节点的数量
相同副本是不会存放在同一个节点上
副本的数量可以变更
Block 数据安全
管理文件系统的命名空间
维护着文件系统树及整棵树内所有的文件和目录
存放文件与Block的映射关系
记录Block与DataNode的映射关系,不会持久化
接受客户端的读写服务
文件的归属、权限、大小、时间
Block的信息,不持久化,每次开启集群时DN上报
保存文件的元数据信息
NN关机的时候是不会存储任意的Block与DN的映射信息
DN启动的时候,会将自己节点上存储的Block信息汇报给NN
NN接受请求之后重新生成映射关系
如果某个数据块的副本数小于设置数,那么NN会将这个副本拷贝到其他节点
NN与DN保持心跳机制,三秒钟发送一次
如果客户端需要读取或者上传数据的时候,NN可以知道DN的健康情况
可以让客户端读取存活的DN节点
集群运行中
收集Block的信息
如果DN超过10分钟+30秒没有心跳,那么NN会将当前DN存储的数据转存到其他节点
超时时长的计算公式为:timeout = 2 * heartbeat.recheck.interval + 10 * dfs.heartbeat.interval
heartbeat.recheck.interval 大小默认为5分钟,dfs.heartbeat.interval默认为3秒
心跳机制
功能
效率高:所有的操作都在内存中完成
NameNode不会和磁盘进行任何的数据交换
数据不会持久化
数据保存在内存中,掉电易失
存在问题
性能
内存大小决定DN的文件数量
NameNode(NN)
记录 NameNode
管理当前节点上的数据
数据存放在硬盘上
非常排斥存储小文件,一般小文件在存储之前需要进行压缩
存放文件的数据信息和验证文件完整性的校验信息
汇报之前先验证Block文件是否被损坏
向NN汇报当前DN上block的信息
向NN保持心跳机制
客户可以向DN读写数据
汇报数据信息
客户端直接与dn建立连接,然后读写数据
客户端读取数据时,去NN查询file与block与dn的映射
DataNode(DN)
存储 DataNode
做任何操作之前先记录日志
当NN下次启动的时候,只需要重新按照以前的日志“重做”一遍即可
不会丢失数据
优点
edits文件大小不可控,随着时间的发展,集群启动的时间会越来越长
有可能日志中存在大量的无效日志
缺点
日志机制
序列化:将内存中的数据写出到硬盘上
反序列化:启动时将硬盘上的数据写回到内存中
启动时间较短
关机时间过长
如果是异常关机,数据还在内存中,没法写入到硬盘
如果写出频率过高,导致内存使用效率低
拍摄快照
传统解决方案
日志大小可控
定时快照保存
日志(edits)+快照(fsimage)
edits_0000000000000000001
fsimage_00000000000000000
seen_txid
VERSION
启动集群时自动产生四个文件
edits_inprogress-000000001
每次操作都会记录日志
dfs.namenode.checkpoint.period 每隔多久做一次checkpoint ,默认3600s
dfs.namenode.checkpoint.txns 每隔多少操作次数做一次checkpoint,默认1000000次
dfs.namenode.checkpoint.check.period 每个多久检查一次操作次数,默认60s
edits_inprogress-000000001 -->edits_0000001
创建新的日志文件edits_inprogress-0000000016
随着时间的推移,日志文件会越来越大,当达到阈值的时候(64M 或 3600秒),会生成新的日志文件
解决方案
SNN解决方案
1、强行杀死NameNode节点
2、清空namenode下name中的fsimage和edtis文件
3、把node2里的secondary namenode下的name中的fsimage和edits复制到node1下namenode对应文件夹中
4、启动NameNode
5、访问NameNode节点页面
SNN数据恢复
SecondaryNameNode(SNN)
日志 SecondaryNameNode
实施分工合作
Block 管理效率
高容错性
批处理
大数据处理
流式数据访问
不擅长低延迟数据访问
不擅长小文件发分区
不擅长并发写入
HDFS的特点
HDFD分布式文件系统架构
将客户端的数据上传到HDFS
1、客户端读取文件内容,传入HDFS
2、HDFS远程调用NameNode,NameNode 进行文件校验
3、客户端创建输出流FSDataOutputStream
4、FSDataOutputStream将数据写入DataNode时,通过packect进行写入
5、Data进行逐步传输到其他节点,DataNode之间组成Pileline
6、当DataNode传输完成后 ,上报信息给NameNode,把Block与DataNode映射更新,关闭FsDataOutputStream
7、如果在传输时有某个DataNode出现异常,相关联的传输就会终止,但只要
宏观流程
1、客户端从自己的硬盘以流的方式读取文件到自己的缓存中
2、将缓存中的数据以chunk和checksum的方式放入到packet
3、当packet满的时候加入并添加到DataQueue中
4、DataStreamer开始从DataQueue队列上取出一个packet,通过FSDataOutputStream发送到Pipleline
5、客户端发送一个Packect数据包以后开始接受ack,会有一个用来接受ack的ResponseProcessor进程,如果收到成功的ack
6、当DataNode写完Packet以后,要给AckQueue发消息,告知可以删除此packet,同时也会告知DataStreamer
7、DataNode写Packet时,它会去根据checksum校验Packet数据是否完整,成功以后才写入,同时将checksum记录到meta文件中
微观流程
HDFS写数据流程
1、首先客户端发送请求到DFS,申请读取某一个文件
如果文件不存在,抛出指定的错误
如果文件存在,返回成功状态
3、DFS创建FSDataInputStream对象,客户端通过这个对象读取数据
5、客户端直接就近原则选择DN1对应的数据即可
6、依次类推读取其他块的信息,直到最后一个块,将Block合并成一个文件
7、关闭FSDataInputStream
HDFS读数据流程
分布式存储:HDFS
2、map阶段
3、combiner阶段:这是一个可选择的函数,实质上是一种reduce操作。combiner是map的后续操作,主要是在map计算出中间文件前做一个简单的合并重复key的操作。
4、reduce
作业运行顺序
分布式计算:MapReduce
Hadoop
0 条评论
回复 删除
下一页