HDfsがnsを増加した後、DNレポートclusterId不整合エラーを再起動します
テスト環境でFastCopyをテストする準備をしています.以前はNSが1つしかなかったので、NSを1つ追加する準備をしてもテストしやすいので、すべての準備ができたら、DNを再起動しますが、DNは新しいNNに接続できません.以下のエラーを報告します.
エラープロンプトDNのclusterIDとNNのclusterIDが一致しません.同僚は、新しいNNをフォーマットするときにDNにもあるclusterID(CID-1561 e 550-a 7 b 9-4886-8 a 9 a-cc 2328 b 82912)を指定すればいいと注意しています.NNノードで実行します.
hdfs namenode -format -clusterid CID-1561e550-a7b9-4886-8a9a-cc2328b82912
ヒントNNとJNのフォーマットが完了すると、そのNNが起動し、新たに追加されたもう1つのNNはフォーマットを必要とせず、以下のコマンドを実行するだけで、以前に起動したNNのすべての情報を自分のディレクトリに同期することができます.
同期完了後、NNを起動し、その後すべてのDNを再起動し、NS 1とNS 2に対応するNNの上にすべてのDNが見えるようになった.
次にclusterID、すなわちclusterIDの役割について説明します.
clusterID、すなわちクラスタ固有のIDは、信頼できるDNがクラスタに接続されていることを確保する役割を果たし、DNにおけるclusterIDはDNが初めて起動したときにNNから取得される.
ローカルの各ストレージディレクトリの下にあるVERSIONファイルに永続化されます.
cat /data0/hadoop/dfs/data/current/VERSION
したがってHDFSがNSに加えてNSを追加する場合、新しいNNがフォーマットされる際には以前にもあったclusterIDを指定しなければならず、DNが新しいDNに正常に接続できない.
説明:
DN:DataNode
NN:NameNode
JN:JournalNode
NS:NameService
java.io.IOException: Incompatible clusterIDs in /data0/hadoop/dfs/data: namenode clusterID = CID-79c6e55b-5897-4a30-b278-149827ac200f; datanode clusterID = CID-1561e550-a7b9-4886-8a9a-cc2328b82912
at org.apache.hadoop.hdfs.server.datanode.DataStorage.doTransition(DataStorage.java:472)
at org.apache.hadoop.hdfs.server.datanode.DataStorage.recoverTransitionRead(DataStorage.java:225)
at org.apache.hadoop.hdfs.server.datanode.DataStorage.recoverTransitionRead(DataStorage.java:249)
at org.apache.hadoop.hdfs.server.datanode.DataNode.initStorage(DataNode.java:944)
at org.apache.hadoop.hdfs.server.datanode.DataNode.initBlockPool(DataNode.java:915)
at org.apache.hadoop.hdfs.server.datanode.BPOfferService.verifyAndSetNamespaceInfo(BPOfferService.java:274)
at org.apache.hadoop.hdfs.server.datanode.BPServiceActor.connectToNNAndHandshake(BPServiceActor.java:220)
at org.apache.hadoop.hdfs.server.datanode.BPServiceActor.run(BPServiceActor.java:815)
at java.lang.Thread.run(Thread.java:745)
エラープロンプトDNのclusterIDとNNのclusterIDが一致しません.同僚は、新しいNNをフォーマットするときにDNにもあるclusterID(CID-1561 e 550-a 7 b 9-4886-8 a 9 a-cc 2328 b 82912)を指定すればいいと注意しています.NNノードで実行します.
hdfs namenode -format -clusterid CID-1561e550-a7b9-4886-8a9a-cc2328b82912
ヒントNNとJNのフォーマットが完了すると、そのNNが起動し、新たに追加されたもう1つのNNはフォーマットを必要とせず、以下のコマンドを実行するだけで、以前に起動したNNのすべての情報を自分のディレクトリに同期することができます.
hdfs namenode -bootstrapStandby
同期完了後、NNを起動し、その後すべてのDNを再起動し、NS 1とNS 2に対応するNNの上にすべてのDNが見えるようになった.
次にclusterID、すなわちclusterIDの役割について説明します.
clusterID、すなわちクラスタ固有のIDは、信頼できるDNがクラスタに接続されていることを確保する役割を果たし、DNにおけるclusterIDはDNが初めて起動したときにNNから取得される.
private void connectToNNAndHandshake() throws IOException {
// get NN proxy
bpNamenode = dn.connectToNN(nnAddr);
// First phase of the handshake with NN - get the namespace
// info.
NamespaceInfo nsInfo = retrieveNamespaceInfo();
// Verify that this matches the other NN in this HA pair.
// This also initializes our block pool in the DN if we are
// the first NN connection for this BP.
bpos.verifyAndSetNamespaceInfo(nsInfo);
// Second phase of the handshake with the NN.
register();
}
NamespaceInfo retrieveNamespaceInfo() throws IOException {
NamespaceInfo nsInfo = null;
while (shouldRun()) {
try {
nsInfo = bpNamenode.versionRequest();
LOG.debug(this + " received versionRequest response: " + nsInfo);
break;
} catch(SocketTimeoutException e) { // namenode is busy
LOG.warn("Problem connecting to server: " + nnAddr);
} catch(IOException e ) { // namenode is not available
LOG.warn("Problem connecting to server: " + nnAddr);
}
// try again in a second
sleepAndLogInterrupts(5000, "requesting version info from NN");
}
if (nsInfo != null) {
checkNNVersion(nsInfo);
} else {
throw new IOException("DN shut down before block pool connected");
}
return nsInfo;
}
void initBlockPool(BPOfferService bpos) throws IOException {
NamespaceInfo nsInfo = bpos.getNamespaceInfo();
if (nsInfo == null) {
throw new IOException("NamespaceInfo not found: Block pool " + bpos
+ " should have retrieved namespace info before initBlockPool.");
}
// Register the new block pool with the BP manager.
blockPoolManager.addBlockPool(bpos);
setClusterId(nsInfo.clusterID, nsInfo.getBlockPoolID());
// In the case that this is the first block pool to connect, initialize
// the dataset, block scanners, etc.
initStorage(nsInfo);
initPeriodicScanners(conf);
data.addBlockPool(nsInfo.getBlockPoolID(), conf);
}
ローカルの各ストレージディレクトリの下にあるVERSIONファイルに永続化されます.
cat /data0/hadoop/dfs/data/current/VERSION
#Thu Oct 23 14:06:21 CST 2014
storageID=DS-35e3967e-51e4-4a6c-a3da-d2be044c8522
clusterID=CID-1561e550-a7b9-4886-8a9a-cc2328b82912
cTime=0
datanodeUuid=1327c11f-984c-4c07-a44a-70ba5e84621c
storageType=DATA_NODE
layoutVersion=-55
したがってHDFSがNSに加えてNSを追加する場合、新しいNNがフォーマットされる際には以前にもあったclusterIDを指定しなければならず、DNが新しいDNに正常に接続できない.
説明:
DN:DataNode
NN:NameNode
JN:JournalNode
NS:NameService