Да, когда размер файла редактирования в namenode увеличивается до определенного размера (по умолчанию: fs.checkpoint.size= 4194304), вторичное имя будет копировать fsimage и файл редактирования с сервера namenode.
Этот код из 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, который отличается от того, что находится во вторичном namenode, но их контрольная сумма каким-то образом становится одинаковой. Это может случиться, о чем вы никогда не узнаете. Копирование кажется лучшим вариантом, чтобы гарантировать, что копии одинаковы.
Надеюсь это поможет.
person
SSaikia_JtheRocker
schedule
04.07.2013