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