MacでHadoopスタンドアローンモード

HadoopのMapperやReducerを自分で書こうとすると,ローカルマシン上でHadoopを動かしたくなります.
Macなら最初からJVMも入ってるし,ソースを持ってくればそのままで動くか,と思ったらそうでもなかった.

何はともあれダウンロード

Mac用のパッケージはなさそう(?)なので,TarBallをそのままダウンロードします.
今回はclouderaからゲット.(hadoop-0.20.2+737.tar.gzとかがそうです)

JavaVM設定が必要

で,解凍した後にバージョン表示させようとしたら,さっそくコケました...

$ bin/hadoop -version
Exception in thread "main" java.lang.UnsupportedClassVersionError: Bad version number in .class file
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClass(ClassLoader.java:676)
at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:124)
at java.net.URLClassLoader.defineClass(URLClassLoader.java:260)
at java.net.URLClassLoader.access$100(URLClassLoader.java:56)
at java.net.URLClassLoader$1.run(URLClassLoader.java:195)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:188)
at java.lang.ClassLoader.loadClass(ClassLoader.java:317)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:280)
at java.lang.ClassLoader.loadClass(ClassLoader.java:252)
at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:375)
java version "1.5.0_26"
Java(TM) 2 Runtime Environment, Standard Edition (build 1.5.0_26-b03-376-9M3263)
Java HotSpot(TM) Client VM (build 1.5.0_26-156, mixed mode)


どうやらバージョンが合わないぞ,と怒られている模様.確か,HadoopでサポートされるのはJava6以上だったはず.
なので,Java Preferencesを立ち上げてJava SE 6を一番上に持ってきます.

# ↓を実行すると,GUI上で変更できます
/Applications/Utilities/Java\ Preferences.app/Contents/MacOS/Java\ Preferences 

ついでに,JAVA_HOMEも変えよう.

export JAVA_HOME=/System/Library/Frameworks/JavaVM.framework/Versions/1.6.0/Home


これで確認したところ,問題なさそうです.よかった.

# バージョン表示
$ bin/hadoop -version
java version "1.6.0_22"
Java(TM) SE Runtime Environment (build 1.6.0_22-b04-307-9M3263)
Java HotSpot(TM) 64-Bit Server VM (build 17.1-b03-307, mixed mode)

# dfsコマンドでファイルも見える
$ bin/hadoop dfs -ls /
Found 30 items
-rw-r--r--   1 root staff          0 2001-01-01 09:06 /.com.apple.timemachine.supported
-rwxrwxrwx   1                     0 2001-01-01 09:00 /.com.apple.timemachine.supported?i?Â? Mac ????j
...

その他

クラスパスも忘れずに設定しておきましょう.

export HADOOP_CLASSPATH=path/to/classes

Antを使う場合には,includeantruntime="false"を記述しておかないとwarningが出ます.
javacの箇所に追記して下さい.

<target name="compile">
  <javac srcdir="./"
  	 destdir="classes"
	 classpath="/path/to/hadoop-core-0.20.2+737.jar"
	 includeantruntime="false"
	 />
</target>