HDFS分析(三)
DFSClient代码很复杂,但是不外乎几种情况:和NameNode的通讯,和DataNode的通讯,写入数据到DataNode和从DataNode读到数据
DFSClient和NameNode的通讯就是通过上文分析的RPC.getProxy()获得NameNode的代理进而和NameNode进行通讯
DFSCLient和DataNode的通讯就不是这样了,狗血的不明白为什么要这样做,DFSCLient和DataNode之间使用DFSOutputStream和DFSInputStream进行数据写入和读取
DFSCLient.DFSOutputStream:DFSCLient和DataNode的通讯时,需要创建DFSOutputStream,然后写入数据时其实是缓存在DFSOutputStream的数据队列里(Packet Queue),
有其他线程从数据队列里面拿到Packet进行写入
DFSCLient.DFSOutputStream.Packet,DFSClient向DataNode写入数据的时候是一个一个Packet写入的
DFSCLient.DFSOutputStream.DataStreamer,真正写入数据的类,在线程中循环的从数据队列里拿到Packet,然后真正的写入Socket
DFSCLient.DFSOutputStream.ResponseProcessor,数据写入DataNode会等待DataNode的响应,ResponseProcessor就是干这个事情的
在DataNode这边在DataNode启动的时候会启动DataXceiverServer,DataXceiverServer在线程循环中监听来自DFSClient的socket请求,然后启动
DataXceiver来处理和DFSClient的数据的读写
下面是几张类图: