说明
数据节点的最重要的功能点,是管理数据节点的数据块,并可以和NN,DN交互读写。
- DFSClient将数据块写入数据节点中
- DFSClient从数据节点中读取数据块
- 数据节点复制
读写操作基于DataTransferProtocol
DataTransferProtocol
- readBlock
DN上读取指定的数据块 - writeBlock
DN上指定数据块写入到Pipeline中 - transferBlock
等等
先只关注读写,其他的复制,失败等不影响主线。
Sender和Receiver
Sender和Receiver是DataTransferProtocol的子类,Sender发送调用请求,Receiver响应请求。
Sender类流程
以sender类readBock方法实现为例
- 参数序列化
- 指定OP
- 调用send发送
send方法写入DataTransferProtocol版本号,OP,参数
out.write(Xxx)
out.flush
通过IO流发送给远程的Datanode,DN接收到请求后,调用readBlock操作。
Receiver
- readop 解析sender的请求
- processOp 处理sender的请求
- 通过子类DataXceiver实现具体的opReadBlock等操作
Receiver相当于简单工厂模式,对不同的op进行分类
DataXceiverServer
IO流如何进行远程调用的(相当于socket的服务端,负责接收请求)
sender访问dataXceiverServer,将请求转发给receiver
启动时创建DataXceiverServer对象
设置TCPPeerServer,参数缓冲区等信息
DataXceiverServer监听所有的流式接口,端口等
放到守护线程中
- 短路读相关
localDataXceiverServer响应短路读
run方法
构建连接之后,所有的功能都是在run方法中执行的(循环方法)。
DataXceiverServer负责连接的建立以及构造和启动DataXceiver,流式接口由DataXceiver响应。
- 检查datanode.xceivercount是否超过总数,datanode状态以及是否在升级等
- 如果满足条件,peerServer.accept.构造dataXceiver
如果有datanode异常,kill线程等,直接关闭peerServer。常规的关闭时修改状态值.
DataXceiver
响应DataXserver的收到的请求,响应sender发送的请求。
DataXceiver是以daemon方式启动的独立线程,里面有一个run方法,我们注重关注下run方法
run方法
1)获取网络的输入/输出流
2)装饰输入流(增加缓存等)
3) 调用父类(Receiver)的readOp接口解析出op
4)调用父类(Receiver)的processOp处理这个流式请求
数据处理方法
processOp处理参数,是在DataXceiver中具体实现的。
DataXceiver具体实现了读方法,写方法,短路读以及其他方法。
小节
数据节点的读取写入,底层均调用了tcp请求。
构造DataXceiverServer接收请求,请求者是sender,收到请求之后根据操作码不同,转发到不同的方法中。
发送和接收的请求包括操作码,参数等。
DataXceiver Deamon线程进行具体的流处理。
具体的处理过程接下来梳理。