hadoopのソースコードをeclipseにインポートしてデバッグ起動する時のメモ(DataNode編)
NameNode編に続き今回はDataNodeを起動する
org.apache.hadoop.hdfs.server.datanode.DataNodeのmainメソッドを起動する。
素直に起動した。
おわり
しかしログ出力の設定をしていなかったことに気づいてlog4j.propertiesを配置して、conf以下をビルドパスに加える
そしてもう一回起動してみるとエラーが出てた、、、
ERROR conf.Configuration: Failed to set setXIncludeAware(true) for parser org.apache.xerces.jaxp.DocumentBuilderFactoryImpl@114a0b74:java.lang.UnsupportedOperationException: setXIncludeAware is not supported on this JAXP implementation or earlier: class org.apache.xerces.jaxp.DocumentBuilderFactoryImpl java.lang.UnsupportedOperationException: setXIncludeAware is not supported on this JAXP implementation or earlier: class org.apache.xerces.jaxp.DocumentBuilderFactoryImpl at javax.xml.parsers.DocumentBuilderFactory.setXIncludeAware(DocumentBuilderFactory.java:589) at org.apache.hadoop.conf.Configuration.loadResource(Configuration.java:1143) at org.apache.hadoop.conf.Configuration.loadResources(Configuration.java:1119) at org.apache.hadoop.conf.Configuration.getProps(Configuration.java:1063) at org.apache.hadoop.conf.Configuration.set(Configuration.java:439) at org.apache.hadoop.hdfs.server.namenode.NameNode.setStartupOption(NameNode.java:1250) at org.apache.hadoop.hdfs.server.namenode.NameNode.createNameNode(NameNode.java:1267) at org.apache.hadoop.hdfs.server.namenode.NameNode.main(NameNode.java:1288)
調べてみると
org.apache.hadoop.conf.Configuration:loadResources()で以下のようなコードがある
DocumentBuilderFactory docBuilderFactory = DocumentBuilderFactory.newInstance(); //ignore all comments inside the xml file docBuilderFactory.setIgnoringComments(true); //allow includes in the xml file docBuilderFactory.setNamespaceAware(true); try { docBuilderFactory.setXIncludeAware(true); } catch (UnsupportedOperationException e) { LOG.error("Failed to set setXIncludeAware(true) for parser " + docBuilderFactory + ":" + e, e); }
このsetXIncludeAware(true)のメソッドでDocumentBuilderFactoryの実装ライブラリがXML Inclusionsをサポートしているかチェックしている。
hadoop-1.0.3のivyに設定されているxercesはバージョンが1.4.4なので、その実装だとsetXIncludeAware(true)はExcepitonを返すようになっていた。
とりあえず新しいxercesのバージョンではXML Inclusionsをサポートしているようなのでバージョンを上げて対応する
ivy.xmlを修正
<dependency org="xerces" name="xerces" rev="${xerces.version}" conf="jdiff->default"> </dependency>
↓
<dependency org="xerces" name="xercesImpl" rev="${xerces.version}" conf="jdiff->default"> </dependency>
libraries.propertiesのファイルを修正してバージョンを上げる
xerces.version=1.4.4 ↓ xerces.version=2.10.0
これで解決