浅谈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.手动滚动镜像文件 && 编辑日志
- 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达到副本数量的包之后,会清空,证明数据写入成功