1.1Hadoop 是什么
狭义上来说,hadoop就是单独指代hadoop这个软件,广义上来说,hadoop指代大数据的一一个生态圈。
1.2Hadoop官网
1.3Hadoop Model
- Hadoop Common 基础型功能
- Hadoop Distributed File System 负责存放数据
- Hadoop YARN 负责资源的调配
- Hadoop MapReduce 大数据的计算框架
- Hadoop Ozone 数据存放到仓库
- Hadoop Submarine 机器学习引擎
2.分布式文件系统架构
DFS Distributed File System: 分布式文件系统,将我们的数据存放在多台电脑上存储,分布式文件系统有很多, HDFS是mapreduce(计算框架)计算的基础。
2.1文件切分思想
(1)文件存放在一个磁盘上效率比较低,如果文件特别大会超出单机的存储范围
(2)字节数组:文件在磁盘真实存储文件的抽象概念,数组可以进行拆分和组装,源文件不会受到影响。
(3)切分数据:对字节数组进行切分
(4)拼接数据:按照数组的偏移量将数据连接到一起,将字节数组链接到一起
(5)偏移量:当前数据在数组中的相对位置,可以理解为下标,数组都有对应的索引下标,可以快速的定位数据。
(6)数据存储的原理:不管文件的大小,所有的文件都是字节数组构成,如果切分文件就是将一个字节数组分成多份,将切分后的数据拼接到一起,数据可以继续使用,需要根据数据的偏移量将它们重新拼接到一起。
2.2 Block拆分标准
(1) 拆分的数据块需要等大,通过偏移量知道这个块的位置
(2)数据块Block:数据被切分后一个整体称之为块,在Hadoop1.x默认大小为64M,下Hadoop2.x默认大小为128M,同一个文件中,每个数据块的大小要一直除了最后一个节点外。
注意事项:1.HDFS中一旦文件被存储,数据不允许被修改,但是可以被追加(需要手动打开,不推荐)
(1)修改会影响偏移量
(2)修改会导致数据倾斜
2.3 Block数据安全
(1)肯定要对存储的数据做备份
(2)备份的数据肯定不能存放在一个节点上,使用数据的时候可以就近获取数据
(3)备份的数量要小于等于节点的数量
(4)每个数据块会有3个副本,相同副本是不会存放在同一个节点上
(5)副本的数量可以变更,可能近期的数据被分析的可能性大,副本数可以多设置几个,后期数据也可能很少被分析,可以减少副本数
2.4 Block的管理效率
(1)需要专门给节点进行分工:存储-DataNode、记录-NameNode、日志-secondaryNameNode
2.5 HDFS的特点
(1)优点:
1.高容错性:保存多个副本,且提供容错机制。副本丢失或宕机自动恢复,默认存3份
2.运行在廉价的机器上:通过副本提高可靠性,提供了容错和恢复机制
3.适合批量处理:移动计算而非数据,数据位置暴露给计算机框架
4.适合大数据的处理:TB级别的数据,甚至PB级别的数据,百万规模以上的文件数量
5.流式数据访问:一次写入,多次读取,高吞吐量,所以同时处理大量数据
(2)缺点:
1.不擅长延迟数据访问,比如毫秒级
2.不擅长小文件的分区
3.不擅长并发写入,文件随机修改,一个文件只能有一个写入者,仅支持添加不支持修改。
3. 文件的数据类型
3.1 元数据 ![](https://i-blog.csdnimg.cn/blog_migrate/4c3fb122f1e35362a6ed33ef4544476f.png)
3.2 文件数据
真实存在于文件中的数据
4.NameNode(NN)
(1)接受客户端的读写服务,NN存放文件与Block的映射关系,会记录Block与DataNode的映射关系,但是不会持久化。
(2)保存文件的元数据信息,文件的归属、文件权限、文件的大小时间
(3)收集Block的信息,系统启动时,DN启动的时候,会将自己节点上存储的Block信息汇报给NN ,NN接受请求之后重新生成映射关系
(4)集群运行中,NN与DN保持心跳机制,三秒钟发送一次,NN与DN保持心跳机制,三秒钟发送一次 ,如果DN超过10分钟+30秒没有心跳,那么NN会将当前DN存储的数据转存到其他节点。
(5)NameNode为了效率,将所有的操作都在内存中完成,不会和磁盘进行任何的数据交换,但是出现的问题是数据保存在内存中,掉电易失。
(6)NameNode非常排斥存储小文件,一般小文件在存储之前需要进行压缩
5. DataNode(DN)
(1) 存放的是文件的数据信息和验证文件完整性的校验信息
(2)启动时,汇报之前先验证Block文件是否被损坏,向NN汇报当前DN上block的信息
(3)运行时,向NN保持心跳机制,客户可以向DN读写数据
(4)当客户端读写数据的时候,首先去NN查询file与block与dn的映射,然后客户端直接与dn建立连接,然后读写数据
6.SecondaryNameNode
6.1NN意外终止找回数据传统解决方案
(1)日志机制
做任何操作之前先记录日志,当NN下次启动的时候,只需要重新按照以前的日志“重做”一遍即可。
缺点:edits文件大小不可控,随着时间的发展,集群启动的时间会越来越长、有可能日志中存在大量的无效日志。
优点:绝对不会丢失文件
(2)拍摄快照
将内存中的数据写出到硬盘上(序列化),启动时还可以将硬盘上的数据写回到内存中(反序列化)。
缺点:关机时间过长,如果是异常关机,数据还在内存中,没法写入到硬盘,写出频率过高,导致内存使用效率低。
优点:启动时间较短
6.2 SNN解决方案
(1)解决思路(日志edits+快照fsimage):让日志大小可控,定时快照保存,不会NN执行一次操作就合并一次并写出,于是设置了一个阈值当日志文件超过64M时,或者时间超过3600秒,就会生成新的日志文件。
6.3 SNN数据恢复
(1)强行杀死NameNode节点--kill -9 NN的端口 (2)清空namenode下name中的fsimage和edtis文件
[root@node01 ~]# rm -rf /var/yjx/hadoop/full/dfs/name/current/*
(3)secondary namenode下的name中的fsimage和edits复制到namenode对应文件夹中
[root@node01 ~]# scp -r root@node02:/var/yjx/hadoop/full/dfs/namesecondary/current/* /var/yjx/hadoop/full/dfs/name/current
(4) 启动namenode
[root@node01 ~]#hadoop-daemon.sh start namenode
(5)访问namenode节点页面,成功
7.机架感知
(1) 机架感知(rack awareness)是为了保证副本在集群的安全性
(2)需要将副本放在不同的DN节点上,节点也需要一定的考量(可靠性、可用性、带宽消耗)
(3)第一个节点:集群内部(优先考虑和客户端相同节点作为第一个节点),集群外部(选择资源丰富且不繁忙的节点为第一个节点)
(4)第二个节点:选择和第一个节点不同机架的其他节点
(5)第三个节点:与第二个节点相同机架的其他节点
(6)第N个节点:与前面节点不重复的其他节点
8.HDFS写数据流程
写数据就是将客户端的数据上传到HDFS
8.1宏观流程
(1)客户端向HDFS发送写数据请求
(2)filesystem通过rpc调用namenode的create方法
1. nn首先检查是否有足够的空间权限等条件创建这个文件,或者这个路径是否已经存在,权限
1. 有:NN会针对这个文件创建一个空的Entry对象,并返回成功状态给DFS
2. 没有:直接抛出对应的异常,给予客户端错误提示信息
(3) DFS如果接收到成功状态,会创建一个对象 FSDataOutputStream的对象给客户端使用
(4) 客户端需要向NN询问第一个Block存放的位置
NN通过机架感知策略 (node1 node 2 node8)
(5)需要将客户端和DN节点创建连接-根据NN返回的节点创建pipeline(管道),管道其实就是socket连接
(6)客户端将文件按照块block切分数据,但是按照packet发送数据
1. 默认一个packet大小为64K,Block128M为2048个packet
(7) 客户端通过pipeline管道开始使用FSDataOutputStream对象将数据输出
(8)如果客户端接收到最后一个pakcet的成功状态,说明当前block传输完成,管道就会被撤销
(9) 客户端会将这个消息传递给NN,NN确认传输完成
NN会将block的信息记录到Entry,客户端会继续向NN询问第二个块的存储位置,依次类推
(10) 当所有的block传输完成后,NN在Entry中存储所有的File与Block与DN的映射关系关闭
9. HDFS读数据流程
(1)首先客户端发送请求到DFS,申请读取某一个文件
(2)DFS去NN查找这个文件的信息(权限,文件是否存在)
如果文件不存在,抛出指定的错误
如果文件存在,返回成功状态
(3) DFS创建FSDataInputStream对象,客户端通过这个对象读取数据
(4) 客户端获取文件第一个Block信息,返回DN1 DN2 DN3
(5)客户端直接就近原则选择DN1对应的数据即可
(6)依次类推读取其他块的信息,直到最后一个块,将Block合并成一个文件
(7)关闭FSDataInputStream