Rav*_*abu 3 hadoop hdfs hadoop2
我有一个关于hadoop数据写入的小查询
来自Apache文档
对于常见情况,当复制因子为3时,HDFS的放置策略是将一个副本放在本地机架中的一个节点上,另一个放在另一个(远程)机架中的节点上,而最后一个放在同一节点上的另一个节点上远程机架.此策略可以减少机架间写入流量,从而提高写入性能.机架故障的可能性远小于节点故障的可能性;
在下面的图像中,写入确认被视为成功?
1)将数据写入第一个数据节点?
2)将数据写入第一个数据节点+2个其他数据节点?
我问这个问题因为,我在youtube视频中听到了两个相互矛盾的陈述.一个视频引用一旦数据写入一个数据节点就写入成功,而其他视频引用只有在将数据写入所有三个节点后才会发送确认.
步骤1:客户端通过在DistributedFileSystem上调用create()方法来创建文件.
步骤2: DistributedFileSystem对namenode进行RPC调用,以在文件系统的命名空间中创建一个新文件,没有与之关联的块.
namenode执行各种检查以确保文件尚不存在,并且客户端具有创建文件的正确权限.如果这些检查通过,则namenode会记录新文件; 否则,文件创建失败,客户端抛出IOException.TheDistributedFileSystem返回FSDataOutputStream,供客户端开始写入数据.
步骤3:当客户端写入数据时,DFSOutputStream将其拆分为数据包,并将其写入内部队列,称为数据队列.数据队列由DataStreamer使用,DataStreamer负责通过选择合适的数据节点列表来请求namenode分配新块以存储副本.数据节点列表形成一个管道,这里我们假设复制级别为3,因此管道中有三个节点.DataStreamer将数据包流式传输到管道中的第一个datanode,后者存储数据包并将其转发到管道中的第二个datanode.
步骤4:类似地,第二个数据节点存储数据包并将其转发到管道中的第三个(和最后一个)数据节点.
步骤5: DFSOutputStream还维护一个等待数据节点确认的数据包的内部队列,称为ack队列.只有当管道中的所有数据节点都已确认时,才会从ack队列中删除数据包.
步骤6:当客户端完成数据写入后,它会调用流上的close().
步骤7:此操作将所有剩余数据包刷新到datanode管道,并在联系namenode之前等待确认,以表明文件已完成namenode已知道文件由哪些块组成,因此它只需要等待块在成功返回之前进行最低限度的复制.