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

これで解決