org.apache.hadoop.hdfs.server.namenode.NotReplicatedYetException

3444 ワード

org.apache.hadoop.hdfs.server.namenode.NotReplicatedYetException: Not replicated yet:/nnThroughputBenchmark/addblock/AddblockBenchDir0/AddblockBench0     at org.apache.hadoop.hdfs.server.namenode.FSNamesystem.getAdditionalBlock(FSNamesystem.java:1350)     at org.apache.hadoop.hdfs.server.namenode.NameNode.addBlock(NameNode.java:400)     at org.apache.hadoop.hdfs.NNThroughputBenchmark.addBlocks(NNThroughputBenchmark.java:1228)     at org.apache.hadoop.hdfs.NNThroughputBenchmark.testAddBlcok(NNThroughputBenchmark.java:1216)     at org.apache.hadoop.hdfs.NNThroughputBenchmark.main(NNThroughputBenchmark.java:1247)     at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)     at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)     at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)     at java.lang.reflect.Method.invoke(Method.java:597)     at org.apache.hadoop.util.ProgramDriver$ProgramDescription.invoke(ProgramDriver.java:68)     at org.apache.hadoop.util.ProgramDriver.driver(ProgramDriver.java:141)     at org.apache.hadoop.test.AllTestDriver.main(AllTestDriver.java:90)     at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)     at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)     at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)     at java.lang.reflect.Method.invoke(Method.java:597)     at org.apache.hadoop.util.RunJar.main(RunJar.java:165)     at org.apache.hadoop.mapred.JobShell.run(JobShell.java:54)     at org.apache.hadoop.util.ToolRunner.run(ToolRunner.java:65)     at org.apache.hadoop.util.ToolRunner.run(ToolRunner.java:79)     at org.apache.hadoop.mapred.JobShell.main(JobShell.java:68)
NotReplicatedYetExceptionこの例外は、ファイルの書き込み中にデータブロックgetAdditionalBlock()を新たに割り当てたときにcheckFileProgress(pendingFile,false)を呼び出してファイルの最後から2番目のデータブロックのコピー数がシステムセキュリティコピー数の要件に達しているかどうかをチェックし、満たさない場合はNotReplicatedYetExceptionを捨てます.
checkFileProgress(pendingFile,true)はまた、ファイルの終了時にcompleteFileInternal()を呼び出し、ファイルのすべてのデータブロックをチェックし、ファイルにデータブロックのコピー数がセキュリティ要件より少ない場合はCompleteFileStatusに戻る.STILL_WAITING状態;
次に、主にファイル作成プロセスで新たに割り当てられたデータ・ブロックの流れを分析します.
1,Namenodeはネーミングスペースに新しいINodeノードを作成します.
2、新しいデータブロックのDN位置locationを選択してClientに戻り、ファイルの最後から2番目のデータブロックのコピー数がセキュリティ要件に達しているかどうかを確認します.そうしないと、NotReplicatedYetExceptionを捨てます(もちろん、最初のデータブロックはこのような検査をスキップします).
3,Clientはpipelineを書きます;
4,pipeline上のDNのPacketResponderスレッドは次のレベルのackを待っていて、1つのデータブロックを正常に受け入れた後finalizeBlock、addBlockを呼び出してvolumeMapに追加して、その後offerService()でNNにこのデータブロックが保存されていることを報告します;
5,NN処理blockReceived();
6、新しいデータブロックがあればステップ2に進む.
テスト時のコードクリップは次のとおりです.
NameNode.format(conf);  
Namenode.createNamenode();  
  
for(int idx=0; idx < dnNum; idx++) {  
  datanodes[idx] = new Datanode();  
  datanodes[idx].register();  
  datanodes[idx].sendHeartbeat();  
}  
  
nameNode.setSafeMode(FSConstants.SafeModeAction.SAFEMODE_LEAVE);  
  
nameNode.create(fileName, FsPermission.getDefault(),  
          clientName, true, repl, BLOCK_SIZE);  
  
LocatedBlock loc = nameNode.addBlock(fileName, clientName);  
  
datanodes[jdx].addBlock(loc.getBlock());  
  
nameNode.blockReceived(  
          datanodes[jdx].dnRegistration,  
          new Block[] {loc.getBlock()},  
          new String[] {""});  
  
nameNode.complete(fileName, clientName);