具体概念介绍
Distributed FileSystem:进行抽象封装,FileSystem会利用JDK的反射机制创建一个DistributedFileSystem实例(对象),然后调用它的initialize()方法
逻辑切分:客户端并没有将文件真正切分,只是画了个标志线加以区分
写操作,上传文件,所以本地是输入流,hdfs是输出流
第三步有哪几个DataNode服务器上:这里指副本数,设置了几个副本,就返回几个DataNode(记住数据是存储在DataNode)我设置了三个副本,所以,返回三个;
同时,返回的DataNode也有一定规矩,首先第一个DataNode是距离客户端最近的,后两个是根据第一个选出,产生了两个问题,如何判断最近,以及如何根据第一个选,这个请看: 拓扑距离和机架感知.
第七步,packet为单位,每个64KB
传输Packet:dn1收到之后,一边往本地落盘,一边传给dn2,之后的dn2同理,当dn3落盘结束之后,它将成功信息发给dn2,之后dn2需要等自己成功并且收到dn3成功信息之后,将成功信息发给dn1,同理,dn1在接收到dn2成功信息并且自己落盘成功之后发给客户端,此时一个packet就成功了;注意packet不是逐个发的,是一个队列同时发的,成功了,在队列里删除掉,这样全部packet发完,第一块就传完了,接着传第二块,第二次选择的DataNode可能和第一次一样,也可能不一样
传输过程中几种失败可能:
1.在建立通道时失败,这样直接上传失败,直接抛异常2.在传输数据过程中失败: 1).客户端传输Packet到第一个DataNode过程中失败就上传失败2)dn1与dn2或者dn2与dn3之间的传输Packet失败,上传仍然进行,并且传出成功信号,因为即使这两个过程失败了,副本数就变成1了,hdfs有高容错性,副本丢失,第一个DataNode会触发自动备份,自动寻找两个DataNode读流程
1)客户端通过Distributed FileSystem向NameNode请求下载文件,NameNode通过查询元数据,找到文件块所在的DataNode地址。 2)挑选一台DataNode(就近原则,然后随机)服务器,请求读取数据。 3)DataNode开始传输数据给客户端(从磁盘里面读取数据输入流,以Packet为单位来做校验)。 4)客户端以Packet为单位接收,先在本地缓存,然后写入目标文件。 5)下载完第一块,在重复上面2.3步下载