浅谈hadoop中namenode启动过程分析以及datanode数据写入的过程

1.启动namenode过程分析

分析如下

 

       0)namenode先进入安全模式,在此模式下,文件均处于只读状态

       1)namenode将fsimage镜像文件加载到内存

            如图第一个

       2)将edits_inprogress实例化为edits文件:

                edits_inprogress是当前会话的操作日志文件

       3)namenode将edits文件加载到内存

       4)将fsimage文件与edits文件进行融合,通过旧的fsimage文件重现edits文件的操作步骤,生成新的fsimage文件

                  图中 checkPoint 位置即为检查点,两文件融合的地方

看一下启动之前curret下的文件

启动之后的current下的文件

此时日志文件镜像文件都已滚动,有新的日志文件和镜像文件

       5)退出安全模式,文件可写

2.secondarynamenode 自动滚动镜像文件和日志文件

================================

    每隔一小时做一次如下操作

       1)2nn通知namenode将edits文件进行滚动

       2)2nn将namenode中的edits文件和fsimage文件通过http GET发送到自己的文件夹下

       3)将fsimage文件与edits文件进行融合,通过旧的fsimage文件重现edits文件的操作步骤,生成新的fsimage文件(.ckpt)

       4)2nn将融合后的检查点文件传给namenode (http post)

       5)namenode将检查点文件进行重命名为新的fsimage文件

2.手动滚动镜像文件 && 编辑日志

  1. hdfs dfsadmin -rollEdits       //编辑日志滚动

    2.hdfs dfsadmin -safemode enter // 进入安全模式

3.hdfs dfsadmin -safemode leave // 进入安全模式

    hdfs dfsadmin -saveNamespace       //手动滚动镜像文件滚动namenode数据流程

4.hadoop 中datanode写入数据过程分析

1、初始化文件系统

    FileSystem fs = FileSystem.get(conf);

2、在namenode中写入元数据

    DFSOutputStream:dfsClient.namenode.create();

           ClientNamenodeProtocolTranslatorPB:rpcProxy.create();

1、通过两个配置文件core-site.xml和core-default.xml初始化configuration

    2、通过配置文件中的fs.defaultFS指定的值初始化文件系统

       file:///   =====> org.apache.hadoop.hdfs.LocalFileSystem

       hdfs://xxxx   =====> org.apache.hadoop.hdfs.DistributedFileSystem

 

    3、在namenode中写入元数据

       客户端:idea

       服务端:hdfs文件系统

在文件进行写入的时候,为了避免丢失数据,hadoop引入了校验和机制,校验和可配置

       默认校验和是CRC32C算法 ====> 每隔512字节进行校验

       核心代码:

         dfsClient.namenode.create();//创建 namenode 写入方法

           ClientNamenodeProtocolTranslatorPB:rpcProxy.create();//写入name node,此时创建一个Rpc调用,此时在名称空间写入,此时还没有数据块

3、写入数据

写入的数据以packet的形式存在的

    (1)创建包过程

       读取数据到内存中,每隔512字节(chunk)进行一次校验(crc32c),校验和的数据长度为4字节

       每隔9个chunk(4608)字节,会将数据flush刷新到packet中,packet会添加序列号并放在dataQueue数据队列末尾

(C is checksum data, D is payload data)

      

        [_________CCCCCCCCC________________DDDDDDDDDDDDDDDD___]

                  ^        ^               ^               ^

                  |        checksumPos     dataStart       dataPos

                  checksumStart

    (2)写包过程

       从数据队列(dataQueue)中获取一个包(packet)

       选择一个数据节点,在其中创建一个块,并通过此数据节点向其他数据节点架设管线(socket)

       使用 串行化技术,在块中写入数据(packet)

       写完此datanode之后,datanode之间会通过管线(套接字),向其他datanode进行数据的二次写入

       每写完一个datanode之后,datanode会将包(packet)发到确认队列(ackQueue)中,确认数据传输成功

       dataQueue.removeFirst();

       ackQueue.addLast(one);

       dataQueue.notifyAll();

 

       ackQueue达到副本数量的包之后,会清空,证明数据写入成功

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值