一、读流程

1、首先使用FileSystem.get函数与服务器建立连接

2、然后使用filesystem.open函数请求文件读取,此时namenode检测用户是否有权限以及文件是否存在然后根据网络拓扑获得一批存储块信息的列表封装到流中返回

3、客户端接收到流后分别与列表中的每一个块建立管道以64字节为单位读取文件,如果读取失败则标记此块并在列表中重新选择一个块去读取直至成功。每读取完一个块则断开管道,然后重新连接下一个管道如果此批块读完但是没有完成文件读取则申请下一批直至完成。

4、完成后close

二、写流程

1、程序通过FileSystem.get()方法与服务器建立连接

2、调用fileSystem.creat()方法请求文件发送namenode会检测是否允许我们上传文件(文件是否存在、是否有权限)当我们满足条件时namenode发送消息告知客户端可以操作此时客户获取FSDataOutputStream对象

3、获取FSDataOutputStream对象后调用fSDataOutputStream.write()方法进行文件发送此过程首先会将发送的数据分块;之后向namenode发送块发送申请;

4、收到客户端发送的块发送申请后namenode会查看用户列表并筛选(副本数、机架感知)出合适的datanode节点返回给客户端

5、客户端收到列表后与此列表中的用户建立管道直到datanode回信表示管道建立完毕

6、此时客户端会将要发送的数据以64字节的大小入数据队列

7、之后将数据队列中的数据出队,入确认队列同时发送给datanode每当我们收到一个管道传回的数据包接收完毕的消息时,我们都将确认队列中的数据出队
  如果此时数据传输出现了错误,那么我们将关闭管道,把坏掉的datanode移除此管道网络,将确认队列的数据重新填到数据队列的队首并且使得一个正常的datanode发送标志至namenode为今后坏掉的节点恢复连接后删除发送了一半的数据做准备。此外条件满足的情况下的情况下namenode还会分配给当前管道网络一个新的datanoe节点来存储数据此时根据namenode收到的标志本地复制文件至标志位之后(补齐到发送进度)正常传输数据。除此之外当我们写入的块大于等于最小副本数时我们也认为这个块发送成功。

8、循环第七步直至数据全部发送至数据队列,此时close数据流同时将数据全部发送至管道,然后等待确认

三、datanode与namenode交互

1、启动后datanode回去主动连接namenode,如果连接不上那就一直发送请求直至成功
2、每三秒namenode给datanode发送消息,如果10分钟内没有回应那么就认为此datanode不可用
3、每一个小时datanode会给namenode发送一此块信息

四、检查点操作

1、当我要进行检查点操作的时候Secondarynode会先向namenode发送申请,等到namenode同一请求后检查点操作才会开始
2、那么浓的同意请求后会先将log日志重命名同时新建一个空文件作为新的log存储,然后将最新的目录信息和重命名后的日志发送给Secondarynode。
3、Secondarynode收到后会将文件加载到内存中对目录信息执行log日志中的命令最后将执行完毕的目录信息发送回namenode

五、block为什么128M

  块大小设置过大会降低任务的执行速度
  块大小设置的国小会增加查询索引所用的时间。
  而128刚好使得索引时间与文件读取时间大约保持在1:100

六、副本怎么分

  假定有三个副本
  如果客户端在机架上那么就将第一个文件放置放到本机(不在机架就随机),
  第二个放到除本机所在机架的随机一个机架上,
  第三个放到上一个机架上的另外一个机器上

七、网络拓扑

  根据离客户端的远近进行块的传递

八、机架感知

  确认每台机器在机架中的位置

九、最小副本数

  若仅启动namenode时,当后启动的datanode的所有文件都达到最小副本数时(默认为1)30秒后取消安全模式
  写入的块大于等于最小副本数时我们认为这个块发送成功。