上文分析了客户端提交写数据的請求过程,本文研究DataNode对此請求的处理。先看一下DataNode启动的过程,见startDataNode方法:
1. 它与NameNode通信,注册自己的信息,基于RPC通信机制和DatanodeProtocol协议。
2. 创建DataXceiverServer,通过建立ServerSocket,与Client和其它DataNode进行读写数据。
3. 创建一个http server,用来提供网页浏览状态。
4. 创建一个IPC server,用来接受Client(基于ClientDatanodeProtocol)和其它DataNode(基于 InterDatanodeProtocol)的請求。注意InterDatanodeProtocol协议只有 getBlockMetaDataInfo方法和updateBlock方法,ClientDatanodeProtocol也只有 recoverBlock方法,它们用于出错的恢复处理,暂且不管。
注意客户端与DataNode的数据传输是直接基于IP/TCP(Socket)的,即根据第二步,与第四步的原理不同。看一下DataXceiverServer是如何工作的:
1. 每接受一个 socket請求, 新创建一个 DataXceiver 来处理。
2. DataXceiver通过DataTransferProtocol来接收数据,首先读出一个byte来表示此次請求的类型,如OP_READ_BLOCK,OP_WRITE_BLOCK等。我们顺着OP_WRITE_BLOCK分析写操作。
3. DataXceiver的writeBlock方法将block写到disk上。它从socket得到的DataInputStream按顺序读取一些信 息,包括block的大小,需要传输的DataNode的数量和信息。在进一步读取block数据之前,它先将这些头信息传输给剩余的DataNode。 所有的DataNode组成一条链状,依次传递数据。
4. 然后DataXceiver再利用BlockReceiver来读取block的数据,并同样在读取的过程中传输给其它DataNode。回想 Client端是如何发送的?(将Block划分成若干packet来发送)同理,这里也是以packet来读取的。注意BlockReceiver的 receivePacket方法,它在读取一个packet后,马上转发给DataNode链的下一个结点。
关于写过程的分析,也推荐《Hadoop_The_Definitive_Guide》一书。
假设写过程一切顺利,那么这些数据是如何在DataNode里存放的呢?这涉及到文件的存储结构,留在以后分析。
1. 它与NameNode通信,注册自己的信息,基于RPC通信机制和DatanodeProtocol协议。
2. 创建DataXceiverServer,通过建立ServerSocket,与Client和其它DataNode进行读写数据。
3. 创建一个http server,用来提供网页浏览状态。
4. 创建一个IPC server,用来接受Client(基于ClientDatanodeProtocol)和其它DataNode(基于 InterDatanodeProtocol)的請求。注意InterDatanodeProtocol协议只有 getBlockMetaDataInfo方法和updateBlock方法,ClientDatanodeProtocol也只有 recoverBlock方法,它们用于出错的恢复处理,暂且不管。
注意客户端与DataNode的数据传输是直接基于IP/TCP(Socket)的,即根据第二步,与第四步的原理不同。看一下DataXceiverServer是如何工作的:
1. 每接受一个 socket請求, 新创建一个 DataXceiver 来处理。
2. DataXceiver通过DataTransferProtocol来接收数据,首先读出一个byte来表示此次請求的类型,如OP_READ_BLOCK,OP_WRITE_BLOCK等。我们顺着OP_WRITE_BLOCK分析写操作。
3. DataXceiver的writeBlock方法将block写到disk上。它从socket得到的DataInputStream按顺序读取一些信 息,包括block的大小,需要传输的DataNode的数量和信息。在进一步读取block数据之前,它先将这些头信息传输给剩余的DataNode。 所有的DataNode组成一条链状,依次传递数据。
4. 然后DataXceiver再利用BlockReceiver来读取block的数据,并同样在读取的过程中传输给其它DataNode。回想 Client端是如何发送的?(将Block划分成若干packet来发送)同理,这里也是以packet来读取的。注意BlockReceiver的 receivePacket方法,它在读取一个packet后,马上转发给DataNode链的下一个结点。
关于写过程的分析,也推荐《Hadoop_The_Definitive_Guide》一书。
假设写过程一切顺利,那么这些数据是如何在DataNode里存放的呢?这涉及到文件的存储结构,留在以后分析。