在《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

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

被折叠的 条评论
为什么被折叠?



