- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
在检查点方面,权威指南说
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/
如何使用TortoiseHg列出特定商业用户的签到,或者在命令行上使用hg列出失败? 最佳答案 hg log命令具有“用户”选项(-u或--user)。找到我的提交,我可以做... hg log --
我是一名优秀的程序员,十分优秀!