今天也要努力学习
HDFS=====分布式文件系统
hdfs的写流程:
取某一时点的一个block块进行分析:
1:hdfs的客户端(client)首先需要向namenode发起写的请求,调用Distributed Filesystem的create方法进行联系,请求是要写入到NameNode的虚拟目录树中的一个虚拟目录下,如果是第一次的请求,NameNode会对这个path、文件名以及权限(是否拥有写的权限)进行检验,如果该path下的文件名已经存在或者权限不够则请求失败,校验用过就会在对应的path路径下创建相应文件(在文件未传输完成时,这个文件后会显示 copying,copying状态下的文件不能被读取)。
2:namenode根据副本放置策略(参考文章尾部)返回三个namenoded节点(注意:传输完成后datanode节点会根据心跳机制来返回健康状态与位置信息给namenode,namenode将位置信息即offset记录到文件中,以便后期文件的读取)。
3:客户端通过读取namenode返回的三个datanode的位置信息选出一个节点进行连接。
4:客户端与namenode之间以Pipeline即管道连接的连接方式进行连接:客户端调用FSDataOutputStream的write方法与第一个datanode进行连接,第一个节点与第二个节点进行连接,第二个节点与第三个节点进行连接,这里的传输单位是自定义按块切分的packet(默认64kb)而不是按块传输,目的在于充分利用时间线的重叠(并行传输),提高传输效率,避免因为块的副本数的增加而带来的传输负载问题,这就是管道连接的优势所在。
5:传输完成后返回一个ack packet,标识一个block块的传输完成。
6:当一个文件(一个文件可能有多个block块)传输完成即写入成功,调用FSDataOutputStream的close方法关闭输出流以及Distributed Filesystem的complete方法告知namenode写入成功(copying标识消失)。
hdfs的读流程
1:客户端向namenode发出读的请求,调用Distributed Filesystem的open方法进行联系,namenode返回一个文件的block列表即相关的位置信息。
2:namenode根据客户端的位置进行近距离优先排序返回一个block位置信息列表,客户端可以选取选取距离最近的节点进行块(副本)的读取以提高读取效率, 这是hdfs支撑实现计算向数据移动,本地化读取的重要保证。
3:调用FSDataInputStream的read方法去datanode上读取数据。
4:当文件数据读取完成,调用close方法关闭输入流。
block的副本放置策略:随机挑选一个机架(机架式服务器)上资源空闲的一个节点放置第一个副本(客户端在集群内时优先放在同一个服务器下,以便本地化的读取实现),第二,三副本放在同一机架上不同的节点上且与第一个副本不在一个机架上(避免副本同时丢失)。ps:同一节点不能放置两个副本