HDFS是否具有与Cassandra一样的写入一致性,让我们说当我将一个文件写入HDFS时,何时能获得成功的响应,是第一次复制完成还是完成3次复制? (假设rep = 3)
答案 0 :(得分:3)
与Hadoop
相比,Cassandra
的工作方式不同。
您有两个与复制相关的参数。
dfs.replication
:默认块复制。创建文件时,可以指定实际的复制数。如果未在创建时间
dfs.namenode.replication.min
:最小块复制。
一旦满足dfs.namenode.replication.min
,写操作将被视为成功。
但是这个复制到dfs.replication
将在顺序管道中发生。第一个Datanode写入块并将其转发到第二个Datanode。第二个Datanode写入块并将其转发到第三个Datanode。
DFSOutputStream
还维护一个等待数据节点确认的数据包内部队列,称为ack队列。
只有当管道中的所有Datanode确认时,才会从ack队列中删除数据包。
您可以在相关的SE问题中找到更多详细信息:
答案 1 :(得分:1)
在正常过程中,客户端将等到所有副本发送"确认"对于所有数据包。但是如果在写入过程中DataNode失败,客户端将继续将数据写入剩余的DataNode,如果确认接收所有包的DataNode数量等于或大于最小副本数量,则它将成功(默认1)。在这种情况下,由于副本数量少于所需的副本数量,因此这些块将被标记为未复制,NameNode将以异步方式复制它们。
然后,即使没有创建所有必需的副本,写入过程也可以返回成功。
如果您想强制仅在创建所有副本时成功,则可以将属性 dfs.namenode.replication.min (默认值1)设置为等于 dfs.replication (默认3)
答案 2 :(得分:0)
写入解剖结构就像 - 当客户端尝试在群集上写入文件时,它将联系NN以获取DN。 NN将执行所有检查并验证客户端。现在客户端将直接联系DN来编写文件。如果复制因子设置为3并且有2个文件分割。数据将存储在6个DN中。在这里,机架意识政策有所了解。
现在存储并行完成的2个文件分割,并以顺序方式完成复制。第3个DN将向第2个DN发送确认,第2个DN将向第1个DN发送确认信号。
当收到第一个DN +其他DN(另一个分割)的确认时,将向客户发送确认。