一、Hadoop简介
Hadoop是一种处理、存储、计算海量的分布式非结构化数据的开源框架。
优点:
1、高可靠性。Hadoop的按位存储数据的能力让人们信赖。
2、高扩展性。Hadoop是在可用的计算机集簇间分配数据并完成数据计算的,这些集簇可以扩展到数以千计的节点中。
3、高效性。Hadoop可以在各个节点上动态的移动数据,并保证各个节点的动态平衡,因此处理速度非常快。
4、高容错性。Hadoop能够自动保存数据的多个副本,并且能够将失败的任务重新分配。
5、低成本。Hadoop是开源的,项目开发的成本较低。
二、分布式文件系统架构
2.1 文件切分思想
数据存储原理:不管文件有多大,都是按照字节数组构成的,如果我们要拆分文件,其实就是将字节数组分成多份。拆分后的字节数组拼接起来可以继续使用,不影响源文件,我们根据数据的偏移量将其进行合并。
2.2 Block拆分标准
拆分的数据块需要等大,数据拉取的时候时间需要一致,通过偏移量就知道这个块当前的位置。同一个文件中,每一个块大小一致,除了最后一个块之外。在H2以后默认大小128M。
HDFS中一旦文件被存储就不允许被修改,修改会影响偏移量,修改会导致数据倾斜,修改会导致蝴蝶效应。可以被追加但是不推荐,追加设置需要手动打开。
2.3 Block数据安全
肯定要对数据做备份
备份数据不能存放在一个节点上,备份的数据不能存放在一个节点上,备份数量要小于等于节点数,每个数据块有三个副本,相同的副本不会存储在同一个节点上,副本数也可以根据近期数据被分析的可能性来进行变更。
2.4 Block的管理效率
存储:DataNode
记录:NameNode
日志:SecondNameNode
三、NameNode
3.1 功能
接收客户端的读写服务
NameNode存放文件与Block的映射关系
NameNode记录Block与DataNode的映射关系,但是不会持久化
保存文件的元数据信息
文件的归属
文件的权限
文件的大小时间
Block信息,但是Block的位置信息不会被持久化,需要每次开启集群的时候DataNode上报。
收集Block的信息
系统启动时
NN关机的时候是不会存储任意的Block与DataNode的映射信息的
DN启动的时候会自动将自己节点上存储的Block信息汇报给NN
NN接收请求之后会重新生成映射关系
如果数据块的副本数小于设置数,那么NN会将这个副本拷贝到其他节点
集群运行中
NN与DN保持心跳机制,三秒钟发送一次
如果客户端需要读取或者上传数据的时候,NN可以知道DN的健康情况
可以让客户端读取存活的DN节点
如果NN与DN三秒没有心跳则认为DN出现异常
此时不会让新的数据写到这个异常的DN中
客户端访问的时候不提供异常DN节点地址
如果超过十分钟+30秒没有心跳,那么NN会将当前DN节点存储的数据转移到其他的节点。
3.2 性能
NameNode为了效率,将所有的操作都在内存中进行
NameNode不会和磁盘进行任何的数据交换
问题:
数据的持久化
断电易失
四、DataNode(DN)
4.1 功能
存放的是文件的数据信息和验证文件完整性的校验信息
数据会存放在硬盘上
汇报
启动时
汇报之前先验证Block块是否被损坏
想NN汇报当前DN上Block信息
运行中
和NN保持心跳
客户端可以向DN写数据
当客户端读写数据的时候,首先去NN查询file与DN是映射
然后客户端直接与DN建立连接,然后读写数据
五、SecondNameNode
5.1 传统解决方案
日志机制
做任何操作之前首先记录日志
当下次NN启动的时候只需按照以前的日志重做一遍即可
缺点:
edits大小不可控,随着时间的增加,集群启动的时间会越来越长
有可能日志中存在大量的无效日志
优点:
绝对不会丢失数据
拍摄快照
我们可以将内存中的数据写到磁盘上
序列化
启动时还可以将磁盘中的数据写入到内存中
反序列化
缺点:
关机时间过长
如果时异常关机,内存中的数据还没有写入到磁盘
如果写出频率过高,导致内存使用率较低
优点:
启动时间较短
5.2 SNN解决方案
解决思路(日志edits+快照fsimage)
让日志大小可控
定时保存快照
解决方案:
当我们启动一个集群的时候会产生四个文件
edits_0000000000000000001
fsimage_00000000000000000
seen_txid
VERSION
我们每次操作都会记录日志-->edits_inprogress-000000001
随着时间的推移日志文件会越来越大,当达到阈值的时候会生成新的日志文件
edits_inprogress-000000001 -->edits_0000001
创建新的日志文件edits_inprogress-0000000016
六、HDFS写数据流程
写数据就时将客户端数据写到HDFS上
6.1 宏观流程
1、客户端向HDFS发送写数据请求
hdfs dfs -put tomcat.tar.gz /yjx/
2、filesystem通过rpc调用namenode的create方法
1、nn首先检查是否有足够的空间权限等条件创建这个文件,或者这个路径是否已经存在,权限
1、有:NN会针对这个文件创建一个空的Entry对象,并返回成功状态给DFS
2、没有:抛出异常
3、DFS如果接收到成功状态,会创建一个对象 FSDataOutputStream的对象给客户端使用
4、客户端向NN询问第一个Block存放的位置
通过机架感知策略(node1 node 2 node8)
5、需要将客户端和DN节点创建连接
1、管道pipeline
客户端和node01创建连接socket
客户端和node02创建连接socket
客户端和node08创建连接socket
6、客户端按照packet发送数据
1、默认一个packet大小为64K,Block128M为2048个packet
7、客户端通过piepeline管道开始使用FSDataoutputStream对象将数据输出
1、客户端首先将packet发送给node01,同时给予node01一个ack状态
2、node01接收数据后会将数据传递给node02,同时给予node02一个ack状态
3、node2接受数据后会将数据继续传递给node8,同时给予node8一个ack状态
4、node08将这个packet接收完成之后,会相应这个ack为true给node02
5、node2会响应给node1 ,同理node1响应给客户端
8、客户端接收到成功的状态,就认为某个packet发送成功了,直到当前块所有的packet都发送完成
9、如果客户端接收到最后一个packet的成功状态,说明当前Block传输完成,管道就会被撤销
10、客户端会将这个消息传递给NN,NN确认传输完成
1、NN会将Block的信息记录到Entry,客户端会继续向NN询问第二块的存储位置,以此类推
11、当所有的block传输完成后,NN在Entry中存储所有的File与Block与DN的映射关系关闭
FsDataOutPutStream
6.2 微观流程
1、首先客户端从自己的硬盘以流的方式读取数据文件到自己的缓存中
2、然后将缓存中的数据以chunk(512B)和checksum(4B)的方式放入到packet(64K)
1、chunk:checksum=128:1
2、checksum:在数据处理和数据通信领域中,用于校验目的的一组数据项的和
3、Packet中的数据分为两类,一类是实际数据包,另一类是header包。
4、一个Packet数据包的组成结构
3、当packet满的时候加入到 添加到 dataqueue ,
4、datastreamer开始从dataqueue队列上取出一个packet,通过FSDataOPS发送到Pipleline
在取出的时候,也会将packet加入到ackQueue,典型的生产者消费者模式
5、客户端发送一个Packet数据包以后开始接收ack,会有一个用来接收ack的ResponseProcessor进程,如果收到成功的ack
如果某一个packet的ack为true,那么就从ackqueue删除掉这个packet
七、HDFS读数据流程
八、Hadoop1的困境
九、Hadoop2.x