hadoopのソースコードをeclipseにインポートしてデバッグ起動する時のメモ(NameNode編)

環境は
Mac OS10.7.4
Eclipse Version: Indigo Service Release 2

eclispe ivy pluginのインストール

http://www.atmarkit.co.jp/fjava/rensai4/devtool22/devtool22_1.html
を参考にivyのpluginをeclipseにインストール

hadoopのsvnリポジトリからcheckoutする

http://svn.apache.org/repos/asf/hadoop/common/trunk
直下をcheckoutする
※このsvnディレクトリをrootディレクトリとした階層プロジェクトになっている。(pom.xmlのparentタグを利用している)

依存ライブラリの解決

Ivyによるライブラリダウンロード

svnからのcheckoutしたプロジェクトだとivy.xmlとかが見つからなかったので、tar.gzでソースコードダウンロードしてeclipseにインポートする方法にする。
http://shuyo.wordpress.com/2011/03/08/hadoop-development-environment-with-eclipse/
を参考に、新規javaプロジェクトをhadoop-1.0.3という名前で作成してhadoop-1.0.3.tar.gzをインポートする。


上記サイトでは依存ライブラリは手動でlibに突っ込めみたいなこと書いてあるけど、ivyで解決できるっぽい。

  • hadoop-1.0.3/hadoop-1.0.3/ivy.xmlを右クリック
  • add ivy Libraryを選択
  • 出てきた設定画面でsettingsタブでProperty filesに$hadoop-1.0.3/hadoop-1.0.3/ivy/libraries.propertiesを追加

で、Finishで実行すると依存ライブラリを全部ダウンロードしてくれた


ビルド設定

とりあえずビルドパスを通してみる
こんな感じで通してみた。

hdfsを動かしたいのでcoreモジュールとhdfsモジュールを通した

coreモジュールのビルド設定

org.apache.hadoop.fs.kfsのコンパイルエラーに対処する

coreプロジェクトのorg.apache.hadoop.fs.kfsあたりでコンパイルエラーが出ているので調べてみると
どうやらKosmos File SystemというFSを利用する際のライブラリが足りてないみたいだ。
ivy.xmlを見てみると

    <!-- This is not in the repository
  <dependency org="org.kosmix"
    name=""
    rev="${kfs.version}"
    conf="kfs->default"/>-->

となっていたので、ivyでは取ってこれてないみたいなので、直接ダウンロードしてくる必要がある。
http://code.google.com/p/kosmosfs/
からtar.gzを落としてきて新規に作成したプロジェクトにインポート。
kfs-0.5/src/javaにビルドパスを通してkfs-0.5のビルドはOK。
hadoop-1.0.3側のプロジェクト参照を追加

これでorg.apache.hadoop.fs.kfsあたりのコンパイルエラーは解消


org.apache.hadoop.security.SecurityUtilのコンパイルエラーに対処する

import sun.net.dns.ResolverConfiguration;
import sun.net.util.IPAddressUtil;
が解決できないコンパイルエラーで、以下のような文言が出ている
Access restriction: The type ResolverConfiguration is not accessible due to restriction on required library /Library/Java/JavaVirtualMachines/1.7.0.jdk/Contents/Home/jre/lib/rt.jar

http://blog.bitmeister.jp/?p=1486
を見つけたので、「ほほーこんなんあるのかー」と思いつつ、sun/net/**をAccessibleにして登録したらコンパイルエラーが消えた。
色いろあるんもんだ。

hdfsモジュールのビルド設定

org.apache.hadoop.hdfs.server.namenode.JspHelperもコンパイルエラー

import javax.servlet.jsp.JspWriter;が解決できないエラーになっていたので、tomcat/lib以下を全部クラスパスに通して解決

NameNode起動

src/core/core-default.xmlに以下の値をセットする

	    <property>
	      <name>fs.default.name</name>
	      <value>hdfs://localhost:9000</value>
	    </property>
	    <property>
	      <name>hadoop.tmp.dir</name>
	      <value>/Users/${user.name}/development/hadoop-data</value>
	      <description>A base for other temporary directories.</description>
	    </property>


org.apache.hadoop.hdfs.server.namenode.NameNodeにメインメソッドがあるので起動する

NameNodeデータディレクトリをフォーマットする

そのまま起動すると
java.io.IOException: NameNode is not formatted.
が出るのでNameNodeのデータファイルを格納するディレクトリのフォーマットが必要

org.apache.hadoop.hdfs.server.namenode.NameNodeの起動オプションに-formatをつけるとNameNode.main()からNameNode.format()が呼ばれて
フォーマット処理がはしる

データディレクトリのフォーマットに関係しそうなクラスはこんな感じ
NameNode.java
|

FSNamesystem implements FSConstants, FSNamesystemMBean
|

FSDirectory implements FSConstants, Closeable
|

FSImage
|

Storage

java.io.IOException: webapps not found in CLASSPATHが出る問題

NameNodeのコンストラクタで初期化処理をする際にhttpServerを起動する処理中に
org.apache.hadoop.http.HttpServer:getWebAppsPath()
の中で
URL url = getClass().getClassLoader().getResource("webapps");
でIOExceptionが出ている。



hadoop-1.0.3/src/webappsをそのままソースディレクトリとして指定するとwebappsのなかのディレクトリが展開されてしまっていて、webappsのリソースが取得できない。
調べても回避方法がよくわからないので
hadoop-1.0.3/src/webapps/の下にもう一つwebappsディレクトリを作って、webapps以下を全部webapps/webapps/以下に移動させた。
再ビルドするとhadoop-1.0.3/bin以下にちゃんとwebappsディレクトリが作成されていることを確認




再度NameNodeのmainメソッドから実行してみるとNameNodeの起動に成功しました