问题导读
1、做一个HDFS写文件的测试,需要准备什么环境?
2、如何对DataNode分析,有哪些节点?
3、Client发起写文件的请求流程是什么?
这里做一个测试HDFS写文件的测试
NameNode分析
看看hadoop的namenode的日志
我在hadoop集群里只上线了3台几点,replication的也是等于3,就是一个机器一个块。
DataNode分析
分别在192.168.1.2(DN1),192.168.1.3(DN2),192.168.1.4(DN3)上抓包
DN1 : 192.168.1.2
三次握手(DN1和Client建立连接)
DN1和client通信(Client开始发第一个包,seq=439,ack=440)
DN1和DN2通信(DN1和DN2建立连接,三次握手)
DN1和DN2通信(DN1把第一个包发给DN2,收到确认)
DN1和Client通信(仔细看下面的ack是440,到这里才是对第一个包的确认,代表三个DN都完成第一个包处理)
Client开始发第二个包,seq=440,ack=487
DN1和DN2通信(DN1把第二个包转发给DN2)
DN1和Client通信(确认第二个包,代表3个DN完成第二个包处理)
Client开始发第三个包
DN1和DN2通信(DN1把第三个包发送给DN2)
DN1和Client通信(DN1告诉Client已经写完)
DN1和DN2,Client断开连接,看时间是14:24:50.476223
在看看DN1上的日志
DN2 : 192.168.1.3
三次握手 起始时间是14:24:50.449860
开始发包,192.168.1.2 和 192.168.1.3之间TCP的传输
断开连接,看时间是14:24:50.476039
下面的DN2的日志
DN3 : 192.168.1.4
三次握手 起始时间是14:24:50.452130
开始发包,192.168.1.3 和 192.168.1.4之间TCP的传输
断开连接,看时间是14:24:50.474757
下面是DN3的日志
总结
Client发起写的文件的请求,先把本地要写的文件分割成一个一个块,每写一个块之前向NN申请,告诉NN“我有一个Block1要写”,NN就会返回给Client可以写的DN列表,这里是3个(具体的决策由NN调度),Client收到DN列表后,就开始向第一个DN建立连接,然后发送一个package(Block1的切片),里面的实现有一个发送队列的,每个packages在这个队列里面。现在Client发送了package1的同时,DN1会和DN2建立TCP连接,DN2会和DN3建立连接,可以看上面的时间。DN1收到第一个package1后,会把package1转发到DN2,DN2转发到DN3。DN3接收完成给DN2回复,DN2给DN1回复,然后DN1回复给Client。Client端接收到ack,把packages1从发送队列里移除,然后开始发送packages2。直到一个Blocks发送完,然后发送第二个Block,按照上面的步骤走。当所有的Block都发送完成,Client就会告诉NN,全部发送成功,然后NN就把这个文件的信息正式写入到NameSpace里面,可以上面NN日志的最后一条。
1、做一个HDFS写文件的测试,需要准备什么环境?
2、如何对DataNode分析,有哪些节点?
3、Client发起写文件的请求流程是什么?
这里做一个测试HDFS写文件的测试
NameNode分析
看看hadoop的namenode的日志
我在hadoop集群里只上线了3台几点,replication的也是等于3,就是一个机器一个块。
DataNode分析
分别在192.168.1.2(DN1),192.168.1.3(DN2),192.168.1.4(DN3)上抓包
DN1 : 192.168.1.2
三次握手(DN1和Client建立连接)
DN1和client通信(Client开始发第一个包,seq=439,ack=440)
DN1和DN2通信(DN1和DN2建立连接,三次握手)
DN1和DN2通信(DN1把第一个包发给DN2,收到确认)
DN1和Client通信(仔细看下面的ack是440,到这里才是对第一个包的确认,代表三个DN都完成第一个包处理)
Client开始发第二个包,seq=440,ack=487
DN1和DN2通信(DN1把第二个包转发给DN2)
DN1和Client通信(确认第二个包,代表3个DN完成第二个包处理)
Client开始发第三个包
DN1和DN2通信(DN1把第三个包发送给DN2)
DN1和Client通信(DN1告诉Client已经写完)
DN1和DN2,Client断开连接,看时间是14:24:50.476223
在看看DN1上的日志
DN2 : 192.168.1.3
三次握手 起始时间是14:24:50.449860
开始发包,192.168.1.2 和 192.168.1.3之间TCP的传输
断开连接,看时间是14:24:50.476039
下面的DN2的日志
DN3 : 192.168.1.4
三次握手 起始时间是14:24:50.452130
开始发包,192.168.1.3 和 192.168.1.4之间TCP的传输
断开连接,看时间是14:24:50.474757
下面是DN3的日志
总结
Client发起写的文件的请求,先把本地要写的文件分割成一个一个块,每写一个块之前向NN申请,告诉NN“我有一个Block1要写”,NN就会返回给Client可以写的DN列表,这里是3个(具体的决策由NN调度),Client收到DN列表后,就开始向第一个DN建立连接,然后发送一个package(Block1的切片),里面的实现有一个发送队列的,每个packages在这个队列里面。现在Client发送了package1的同时,DN1会和DN2建立TCP连接,DN2会和DN3建立连接,可以看上面的时间。DN1收到第一个package1后,会把package1转发到DN2,DN2转发到DN3。DN3接收完成给DN2回复,DN2给DN1回复,然后DN1回复给Client。Client端接收到ack,把packages1从发送队列里移除,然后开始发送packages2。直到一个Blocks发送完,然后发送第二个Block,按照上面的步骤走。当所有的Block都发送完成,Client就会告诉NN,全部发送成功,然后NN就把这个文件的信息正式写入到NameSpace里面,可以上面NN日志的最后一条。