hdfs架构与使用以及启动流程

本文详细介绍了HDFS的架构,包括如何解决单点故障和内存受限问题,以及NameNode和DataNode的启动流程。此外,还阐述了HDFS的使用方法,如文件检查、设置副本系数等命令。NameNode启动涉及加载元数据、启动HTTP服务器和RPC服务器,而DataNode启动则包括注册到NameNode、建立与NameNode的连接并握手。
摘要由CSDN通过智能技术生成

hdfs架构:

Haoop1存在的问题:

  • name node 单点故障
  • name node内存受限

如何解决单点故障:

  自然而然会想到,再加一个name node节点,但是,他是有状态的,那么就需要数据同步,可以直接交互同步,但是为了解耦合,易扩展,我们引入QJM(也可以用zk替代);

  还有个问题需要解决,故障时候,自动切换问题,这时候就要引入zk,然后通过zkfc(由于有状态的特殊性,所以比较复杂)对namenode监控,然后对zk进行操作,最终做到故障自动切换;

如何解决内存受限问题:

  在单点故障的解决方案基础上,进行扩展(zk不变,其他内容进行复制,这样由namenode扩展为namenode1,namenode2,存储内容各不相同)

hdfs使用:

fs -test:

-e 检查文件是否存在。如果存在则返回0。
-z 检查文件是否是0字节。如果是则返回0。
-d 如果路径是个目录,则返回1,否则返回0。

fs -ls:
权限 <副本数> 用户ID 组ID 文件大小 修改日期 修改时间 文件名

fs -setrep -w 3:

改变文件副本系数

其他命令:

  8 cat
  9 chgrp
 10 chmod
 11 chown
 12 copyFromLocal
 13 copyToLocal
 14 cp
 15 du
 16 dus
 17 expunge
 18 get
 19 getmerge
 21 lsr
 22 mkdir
 23 movefromLocal
 24 mv
 25 put
 26 rm
 27 rmr
 29 stat
 30 tail
 32 text
 33 touchz

namenode启动流程:

先介绍下namenode:

  1. 控制两个关键表,分别是,文件名->块序列号表,块->机器列表表;
  2. 第一张表存储在磁盘,第二张表在每次namenode出现都会重新构建;
  3. namenode主要暴露rpc接口和http接口给外部使用;
  4. 实现了三个主要的协议,一个是clientproto,用于客户端访问;
  5. 一个是datanodeproto,用于datanode同步blocks,这些方法会被重复自动的调用;
  6. 最后一个是namenodeproto,用于从节点namenode或者再平衡获取部分namenodr状态;

流程:

  1. main-》createNameNode,解析命令行参数,运行某个模式,先看default,直接new NameNode;构造namenode角色;(还有角色backup,checkpoint)
  2. 构造中,设置地址,serviceid,nanenodeid,创建HA状态等,然后initialize;
  3. 以配置的用户进行登录,如果是namenode角色,starthttpserver,启动HTTP server(支持http,https,http/https),默认端口50070,setupServlets添加一些处理方法eg:/data/*
  4. loadNamesystem 加载元数据,构造FSImage,包含image 目录和edit 目录,--》FSNamesystem.loadFSImage-》
    1. recoverTransitionRead,把最近的image和editlog合并
    2. saveNamespace,若需要存储,则写入磁盘
    3. openEditLogForWrite,打开用于写入事务的editlog
    4. 加载完成,设置标记,通知其他线程,cond.nodify
  5. 启动rpcserver,createRpcServer-》构造NameNodeRpcServer,该类实现了一些协议,包括前面提到的clientproto/namenodeproto等,启动client rpc,service rpc;
  6. startCommonServices-》startCommonServices,对于配置的fsimage/editlog路径检查磁盘资源够不够,step标明进入安全模式,等待datanode报告
    1. getCompleteBlocksTotal,后续再分析,如何获取到完整block数目的
    2. 核心函数checkMode,多个地方调用,针对安全模式的进入进出, 满足下面任意条件进入安全模式:
      1. 刚才检查磁盘空间是否不足
      2. 存活的data node个数 小于阈值 *
      3. 完整的block数乘以系数(配置0.999)得到阈值,如果blocksafe数小于阈值 
    3. 安全模式后续要另外起一节单分析了;
    4. activate激活几个线程,后续再分析;
      1. pendingReplications.start(); 
      2. datanodeManager.activate(conf);(1.启动停用监控线程;2.heartbeatManager心跳处理线程;)
      3. this.replicationThread.start();
  7. HaState.enterState,HaState有多个实现,backup/active/standby,现在是进入ActiveState实现-》startActiveServices
    1. FSNamesystem.startActiveServices-》
      1. info
      2. editLog.initJournalsForWrite()-》initJournals,在journalSet添加了本地文件系统FileJournalManager,和QuorumJournalManager;
      3. getFSImage().editLog.openFeditLogorWrite();这里会初始化日志输出流和日志段-》startLogSegment
      4. 初始化FSEditLog.editLogStream = startLogSegment

namenode thread处理:

heartbeatManager.heartbeatThread:

  1. heartbeatManager,维护了,DatanodeDescriptor列表,Stats统计,heartbeatThread线程,FSNamesystem,BlockManager;
  2. 该线程5s执行一次,每次检查上次心跳时间,如果小于30s,调用heartbeatCheck,并设置上次心跳时间;
  3. 遍历datanodes(registerDatanode加入的datanode节点DatanodeDescriptor),判断是否dead,如果上次更新时间(heartbeat rpc更新)经过10分30秒没更新,说明dead;

namenode rpc server:

registerDatanode:

  1. FSNamesystem.registerDatanode-》registerDatanode-》初始化datanode信息DatanodeDescriptor,heartbeatManager.register(添加DatanodeDescriptor,然后updateHeartbeatState)

datanode启动流程:

先介绍下datanode:

  1. datanode有规律的与namenode通信,也会和客户端和其他datanode节点不时通信;
  2. 存储一系列有名字的block,允许客户端读/写block,也会响应namenode的指令,删除或者复制block;
  3. 维护一张表,存于磁盘并会把内容汇报给namenode;
  4. namenode不会直接联系datanode,只是通过datanode心跳来调用namenode方法并返回值;
  5. 启动server供客户端和datanode调用;

  

流程:

  1. createDataNode-》startInfoServer-》构造DataStorage,initDataXceiver(重要),启动0.0.0.0:50075 httpserver,initIpcServer初始化rpcserver,构造blockPoolManager(每组namenode是一个blockpool,即一个联邦);
  2. blockPoolManager.refreshNamenodes-》doRefreshNamenodes
    1. 获取所有nameservice,弄清楚新加的nameservice和更新的nameservice;
    2. 每个联邦对应一个nameservice,为每个nameservice创建一个BPOfferService,BPOfferService获取nameservice的所有namenode地址,然后为每个namenode创建一个BPServiceActor
    3. startAll-》每个BPOfferService,遍历所有BPServiceActor,start,启动线程,具体内容看run方法
      1. connectToNNAndHandshake-》connectToNN,获取namenode rpc代理,register-》registerDatanode,调用rpc服务,向namenode发送registerDatanode,这时候需要去看namenode rpc server如何处理的;
    4. 删除当前有的但是已经不存在的nameservices,stop BPServiceActor;
    5. 更新nameservices中已经改变的namenode;

  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

MyObject-C

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值