Hadoop-HDFS

1.1Hadoop 是什么

        狭义上来说,hadoop就是单独指代hadoop这个软件,广义上来说,hadoop指代大数据的一一个生态圈。

1.2Hadoop官网

        网址 http://hadoop.apache.org/

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 元数据       

         

        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     

        

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值