/** * Add a namenode to cluster and start it. Configuration of datanodes in the cluster is refreshed * to register with the new namenode. * * @return newly started namenode */ public NameNodeInfo addNameNode(Configuration conf) throws IOException { if (!federation) { throw new IOException("cannot add namenode to non-federated cluster"); } int nnIndex = nameNodes.length; int numNameNodes = nameNodes.length + 1; NameNodeInfo[] newlist = new NameNodeInfo[numNameNodes]; System.arraycopy(nameNodes, 0, newlist, 0, nameNodes.length); nameNodes = newlist; nameNodes[nnIndex] = new NameNodeInfo(nnIndex); NameNodeInfo nni = nameNodes[nnIndex]; nni.createAvatarDirs(); String nameserviceId = NAMESERVICE_ID_PREFIX + nnIndex; String nameserviceIds = conf.get(FSConstants.DFS_FEDERATION_NAMESERVICES); nameserviceIds += "," + nameserviceId; nni.initGeneralConf(conf, nameserviceId); conf.set(FSConstants.DFS_FEDERATION_NAMESERVICES, nameserviceIds); nni.updateAvatarConf(conf); startAvatarNode(nni); // Refresh datanodes with the newly started namenode for (DataNodeProperties dn : dataNodes) { DataNode datanode = dn.datanode; datanode.refreshNamenodes(conf); } // Wait for new namenode to get registrations from all the datanodes waitDataNodesActive(nnIndex); return nni; }
private void startAvatarNodes() throws IOException { for (NameNodeInfo nni : this.nameNodes) { nni.updateAvatarConf(this.conf); startAvatarNode(nni); } }