文章目录
启动StandbyCheckpointer
// 接上篇
StandbyState public void enterState(HAContext context)
NameNodeHAContext public void startStandbyServices()
FSNamesystem void startStandbyServices(final Configuration conf)
standbyCheckpointer = new StandbyCheckpointer(conf, this);
this.thread = new CheckpointerThread()
在 StandbyCheckpointer
启动 CheckpointerThread
线程,进行周期性检查;
如果满足条件 uncheckpointed >= checkpointConf.getTxnCount()
或者 secsSinceLast >= checkpointConf.getPeriod()
则执行 StandbyCheckpointer
的 doCheckpoint()
方法。
doCheckpoint
doCheckpoint()
先将所有FSImage 持久化为文件,然后再通过HTTP PUT方法传送到NN中
save FSImage文件
StandbyCheckpointer private void doCheckpoint()
FSImage public synchronized void saveNamespace()
FSImage private synchronized void saveFSImageInAllDirs() {
List<Thread> saveThreads = new ArrayList<Thread>();
// save images into current
for (Iterator<StorageDirectory> it
= storage.dirIterator(NameNodeDirType.IMAGE); it.hasNext();) {
StorageDirectory sd = it.next();
FSImageSaver saver = new FSImageSaver(ctx, sd, nnf);
Thread saveThread = new Thread(saver, saver.toString());
saveThreads.add(saveThread);
saveThread.start();
}
waitForThreads(saveThreads);
}
// Storage
/**
* Write all data storage files.
* @throws IOException
*/
public void writeAll() throws IOException {
this.layoutVersion = getServiceLayoutVersion();
for (Iterator<StorageDirectory> it = storageDirs.iterator(); it.hasNext();) {
writeProperties(it.next());
}
}
启动独立线程,SNN 向NN PUT FSImage
TransferFsImage.uploadImageFromStorage(activeNNAddress, conf,
namesystem.getFSImage().getStorage(), imageType, txid, canceler);
// TransferFsImage
public static void uploadImageFromStorage()
// Uploads the imagefile using HTTP PUT method
private static void uploadImage()
private static void writeFileToPutRequest()
ImageServlet 接收 FSImage
标准 HTTPServlet,通过doPut() 方法接收FSImage文件