HDFS源码分析DataXceiver之整体流程

本文深入剖析HDFS中DataXceiver的工作原理,包括其成员变量、构造方法及核心处理流程,尤其关注数据读写请求的处理机制。

        在《HDFS源码分析之DataXceiverServer》一文中,我们了解到在DataNode中,有一个后台工作的线程DataXceiverServer。它被用于接收来自客户端或其他数据节点的数据读写请求,为每个数据读写请求创建一个单独的线程去处理。而处理每次读写请求时所创建的线程,就是本文要讲的DataXceiver。本文,我们来看下DataXceiver的具体实现,着重讲解下它得到数据读写请求后的整体处理流程。

        首先,我们先看下DataXceiver的成员变量,具体如下:

  // 封装了Socket、输入流、输出流的Peer,是DataXceiver线程工作的主要依托者
  private Peer peer;
  
  // 通讯两端地址:远端地址remoteAddress、本地端地址localAddress,均是从peer(即socket)中获得的
  private final String remoteAddress; // address of remote side
  private final String localAddress;  // local address of this daemon
  
  // DataNode节点进程实例datanode
  private final DataNode datanode;
  
  // DataNode节点配置信息dnConf
  private final DNConf dnConf;
  
  // DataXceiverServer线程实例dataXceiverServer
  private final DataXceiverServer dataXceiverServer;
  
  // 连接DataNode是否使用主机名,取参数dfs.datanode.use.datanode.hostname,参数未配置的话默认为false,不使用
  private final boolean connectToDnViaHostname;
  
  // 接收到一个操作op的开始时间
  private long opStartTime; //the start time of receiving an Op
  
  // InputStream输入流socketIn
  private final InputStream socketIn;
  
  // OutputStream输出流socketOut
  private OutputStream socketOut;
  
  // 数据块接收器BlockReceiver对象blockReceiver
  private BlockReceiver blockReceiver = null;
  
  /**
   * Client Name used in previous operation. Not available on first request
   * on the socket.
   * previousOpClientName为之前操作的客户端名字,它对于socket上的第一个请求不可用
   */
  private String previousOpClientName;
        既然DataXceiver是为处理数据读写请求而创建的线程,那么Socket、输入流、输出流就是必不可少的成员。而首当其冲的Peer,便封装了Socket、输入流、输出流的Peer,是DataXceiver线程工作的主要依托者,而接下来的输入流socketIn、输出流socketOut都是来自peer的socket。另外,DataXceiver还提供了通讯两端地址:远端地址remoteAddress、本地端地址localAddress,均是从peer(即socket)中获得的。

        既然是由DataNode上的DataXceiverServer线程创建的,那么自然少不了datanode、dataXceiverServer、dnConf等变量,并且,它是专门用来处理数据读写请求的,自然也需要像数据块接收器BlockReceiver对象blockReceiver这种成员变量。dnConf是DNConf类型的数据节点DataNode上的配置信息。

        剩下的几个,便是在处理具体的数据读写请求时用到的connectToDnViaHostname、opStartTime、previousOpClientName等变量。其中,connectToDnViaHostname标识连接DataNode是否使用主机名,取参数dfs.datanode.use.datanode.hostname,参数未配置的话默认为false,不使用,opStartTime为接收到一个操作op的开始时间,最后的previousOpClientName为之前操作的客户端名字,它对于socket上的第一个请求不可用。

        下面我们再看下它的构造方法,只有一个private的,如下:

  /**
   * 私有构造函数,需要Peer、DataNode、DataXceiverServer三个参数
   */
  private DataXceiver(Peer peer, DataNode datanode,
      DataXceiverServer dataXceiverServer) throws IOException {

	// peer、datanode、dataXceiverServer等成员变量直接赋值
    this.peer = peer;
    this.dnConf = datanode.getDnConf();
    
    // 输入流socketIn、输出流socketOut来自peer的socket
    this.socketIn = peer.getInputS
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值