Hadoop-HDFS

一、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调用namenodecreate方法

                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,Block128M2048packet

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、客户端会将这个消息传递给NNNN确认传输完成

        1、NN会将Block的信息记录到Entry,客户端会继续向NN询问第二块的存储位置,以此类推

11、当所有的block传输完成后,NNEntry中存储所有的FileBlockDN的映射关系关闭

        FsDataOutPutStream

6.2 微观流程

1、首先客户端从自己的硬盘以流的方式读取数据文件到自己的缓存中

2、然后将缓存中的数据以chunk512B)和checksum(4B)的方式放入到packet64K

        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,会有一个用来接收ackResponseProcessor进程,如果收到成功的ack

        如果某一个packetacktrue,那么就从ackqueue删除掉这个packet

        如果某一个packet ack false, ackqueue 中所有的 packet 重新挂载到 发送队列 , 重新发送

 

 七、HDFS读数据流程

 八、Hadoop1的困境

 九、Hadoop2.x

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值