gpt4 book ai didi

hadoop - 检查点 : Is fsimage always copied from namenode

转载 作者:可可西里 更新时间:2023-11-01 15:17:26 24 4
gpt4 key购买 nike

在检查点方面,权威指南说

1. The secondary asks the primary to roll its edits file, so new edits goes to a new file
2. The secondary retrieves fsimage and edits from primary (using HTTP GET)

在检查点结束时,辅助名称节点将更新的 fsimage 发送到名称节点。

现在次要名称节点有最新的 fsimage,在下一个检查点中,次要名称节点将再次从名称节点复制 fsimage?如果是为什么?它不能简单地使用校验和比较两个

最佳答案

是的,当 namenode 中的编辑文件大小增长到特定大小时(默认值:fs.checkpoint.size= 4194304),secondary name 将从 namenode 服务器复制 fsimage 和编辑文件。

SecondaryNameNode.java 中的这段代码解释了 -

        long size = namenode.getEditLogSize();
if (size >= checkpointSize ||
now >= lastCheckpointTime + 1000 * checkpointPeriod) {
doCheckpoint();
lastCheckpointTime = now;
}

请检查 doCheckpoint(); 何时被调用。

原因的答案是 Hadoop 遵循的设计(虽然我不知道为什么要遵循这个设计)- 请参阅下面的代码正在做什么(我只保留与这个问题相关的陈述)。您可能会看到如何调用函数 downloadCheckpointFiles(sig)doMerge(sig)

/**
* Create a new checkpoint
*/
void doCheckpoint() throws IOException {

//---other code skipped---

// Tell the namenode to start logging transactions in a new edit file
// Retuns a token that would be used to upload the merged image.
CheckpointSignature sig = (CheckpointSignature)namenode.rollEditLog();


downloadCheckpointFiles(sig); // Fetch fsimage and edits
doMerge(sig); // Do the merge

//
// Upload the new image into the NameNode. Then tell the Namenode
// to make this new uploaded image as the most current image.
//
putFSImage(sig);


namenode.rollFsImage();
checkpointImage.endCheckpoint();

//----other code skipped----
}

然后 downloadCheckpointFiles(sig); 如何从上面的 doCheckpoint() 中调用。请参阅下面的代码 -

/**
* Download <code>fsimage</code> and <code>edits</code>
* files from the name-node.
* @throws IOException
*/
private void downloadCheckpointFiles(final CheckpointSignature sig
) throws IOException {
try {
UserGroupInformation.getCurrentUser().doAs(new PrivilegedExceptionAction<Void>() {

@Override
public Void run() throws Exception {


// get fsimage
String fileid = "getimage=1";
File[] srcNames = checkpointImage.getImageFiles();
assert srcNames.length > 0 : "No checkpoint targets.";
TransferFsImage.getFileClient(fsName, fileid, srcNames);
LOG.info("Downloaded file " + srcNames[0].getName() + " size " +
srcNames[0].length() + " bytes.");

// get edits file
fileid = "getedit=1";
srcNames = checkpointImage.getEditsFiles();
assert srcNames.length > 0 : "No checkpoint targets.";
TransferFsImage.getFileClient(fsName, fileid, srcNames);
LOG.info("Downloaded file " + srcNames[0].getName() + " size " +
srcNames[0].length() + " bytes.");

checkpointImage.checkpointUploadDone();
return null;
}
});
} catch (InterruptedException e) {
throw new RuntimeException(e);
}

}

而且,对于你的倒数第三个问题——“它不能简单地使用校验和来比较两个”——

一个可能的原因是他们不想冒任何风险,因为两个不同文件的校验和有时可能相同。假设在 Namenode 中你有一个 fsImage,它与 secondarynamenode 中的不同,但它们的校验和不知何故变得相同。这可能会发生,你可能永远不会知道。复制似乎是确保副本相同的最佳选择。

希望这对您有所帮助。

关于hadoop - 检查点 : Is fsimage always copied from namenode,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17476485/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com