hadoop2.0数据写入操作确认

iih3973s  于 2021-06-03  发布在  Hadoop
关注(0)|答案(2)|浏览(270)

我有一个关于hadoop数据写入的小问题
来自apache文档
对于常见情况,当复制系数为3时,hdfs的放置策略是将一个副本放在本地机架中的一个节点上,另一个放在不同(远程)机架中的节点上,最后一个放在同一远程机架中的不同节点上。此策略减少机架间写入通信量,这通常会提高写入性能。机架失效的几率远小于节点失效的几率;
在下图中,写入确认何时被视为成功?
1) 将数据写入第一个数据节点?
2) 将数据写入第一个数据节点+2个其他数据节点?

我问这个问题是因为,我在youtube视频中听到了两个相互矛盾的说法。一旦数据写入一个数据节点,一个引用的视频写入成功,另一个引用的视频确认只有在将数据写入所有三个节点后才会发送。

6jygbczu

6jygbczu1#

如果成功写入一个复制副本,则认为数据写入操作成功。它由hdfs-default.xml文件中的属性dfs.namenode.replication.min控制。如果在写入复制副本时datanode出现任何故障,则写入的数据不会被视为不成功,而是在复制不足的情况下进行,而在平衡集群时,复制不足会创建那些丢失的复制副本。ack包独立于写入datanodes的数据的状态。即使数据包没有被写入,确认包也被传送。

szqfcxe2

szqfcxe22#


步骤1:客户机通过调用distributedfilesystem上的create()方法来创建文件。
步骤2:distributedfilesystem对namenode进行rpc调用,以便在文件系统的命名空间中创建一个新文件,其中没有与之关联的块。
namenode执行各种检查,以确保该文件不存在,并且客户端具有创建该文件的正确权限。如果这些检查通过,namenode将记录新文件;否则,文件创建失败,客户端将抛出ioexception。分布式文件系统返回一个fsdataoutputstream,供客户端开始向其写入数据。
第3步:当客户端写入数据时,dfsoutputstream将其拆分为数据包,然后将数据包写入称为数据队列的内部队列。数据队列由datastreamer使用,datastreamer负责请求namenode通过挑选合适的datanode列表来分配新的块来存储副本。datanodes列表形成了一个管道,这里我们假设复制级别为3,因此管道中有3个节点。数据流器将数据包流到管道中的第一个数据节点,该数据节点存储数据包并将其转发到管道中的第二个数据节点。
步骤4:类似地,第二个数据节点存储数据包并将其转发到管道中的第三个(也是最后一个)数据节点。
步骤5:dfsoutputstream还维护等待datanodes确认的数据包的内部队列,称为ack队列。只有当数据包已被管道中的所有数据节点确认时,才会从ack队列中删除该数据包。
步骤6:当客户机完成数据写入后,它将对流调用close()。
步骤7:此操作将所有剩余的数据包刷新到datanode管道,并等待确认,然后再联系namenode以发出文件已完成的信号namenode已经知道文件由哪些块组成,因此它只需等待最小限度地复制块,然后才能成功返回。

相关问题