Hadoopをインストールしたのでメモ。

野良HadoopとportsのHadoop

Hadoopを野良で入れるか、portsから入れるか。
結局portsにした。その訳は。

hadoopはJavaで動作する。
ということは、Javaさえ入っていれば、インストールに特殊な手間の必要なくhadoopが動作するはず。
だからインストールを扱う記事、blog等々はhadoopをダウンロードしてtarで展開して…、というものがほとんど。
FreeBSDでだってそれは同じ。

しかしFreeBSDでは、hadoopがportsに収録されている。
portsだと依存するportsを一括で入れてくれるし、ユーザ追加や権限設定なども自動でしてくれる。
便利な一方、世の中の記事とは違うところ(おもにファイル配置)が出てきたり、ひょっとすると最新版を使えないリスクもある。

どっちもどっちだが、hadoopが初めてならportsから入れるのが良いと判断した。
Javaなど依存portsのインストールが面倒だし、そもそもやりたいことはHadoopのセットアップではなくてその先にあるわけだから。
なお2013/7/23時点でportsのhadoopは1.0.0の模様。

hadoopのインストール

ports、と言っておきながらなんだけど、けっこう量があるのでスピード重視でpackageから入れた。

まずpackageの入手先を近所のftpに設定する。~/.profileに書いとけ。

PACKAGEROOT="ftp://ftp2.jp.freebsd.org";export PACKAGEROOT

sudoを使うならvisudoで以下の行をアンコメントしておく。

Defaults env_keep += "PKG_PATH PKG_DBDIR PKG_TMPDIR TMPDIR PACKAGEROOT PACKAGESITE PKGDIR FTP_PASSIVE_MODE"

インストール。あそうそう、bashとrsyncも忘れずにね。

$ sudo pkg_add -r bash rsync hadoop

しばらく放置。

事前準備

一式が入ったのだが、hadoopを動かす前に準備がいる。
OpenJDK向け設定、ホスト名の設定、JAVA_HOMEの設定。

OpenJDK向けの設定

OpenJDKをインストールすると以下の表示が現れる。
素直に設定する。

===============================================================
This OpenJDK implementation requires fdescfs(5) mounted on /dev/fd and
procfs(5) mounted on /proc.

If you have not done it yet, please do the following:

mount -t fdescfs fdesc /dev/fd
mount -t procfs proc /proc

To make it permanent, you need the following lines in /etc/fstab:

fdesc /dev/fd fdescfs rw 0 0
proc /proc procfs rw 0 0

===============================================================

以下のように。

$ sudo mount -t fdescfs fdesc /dev/fd
$ sudo mount -t procfs proc /proc
$ mount
/dev/da0p2 on / (ufs, local, journaled soft-updates)
devfs on /dev (devfs, local, multilabel)
fdescfs on /dev/fd (fdescfs)
procfs on /proc (procfs, local)

/etc/fstabにも以下の通り記載しておく(空白はタブで)

fdesc /dev/fd fdescfs rw 0 0
proc /proc procfs rw 0 0

ホスト名の設定

hadoopはhostnameが解決できないと動作しない。
/etc/hostsにhostnameの記載があるか確認して、なければ加える。
DHCPでIPアドレス取得しているなら、127.0.0.1のところにホスト名を入れる。
以下はhostnameがvanillaの場合

127.0.0.1 localhost localhost.my.domain vanilla

JAVA_HOMEの設定

portsからHadoopをインストールしているなら不要。
/usr/local/etc/hadoop/envvars.d/000.java_home.envでJAVA_HOMEを設定している。
そして000.java_home.envは起動の都度、読み込まれる(後述)。

export JAVA_HOME=${JAVA_HOME:-/usr/local/openjdk6}

portsから入れていないんだったら、hadoopを使うユーザの~/.profileで設定しておく。

JAVA_HOME=/usr/local/openjdk6;export JAVA_HOME

ファイル配置

ファイル配置の確認。
portsから入れると、FreeBSDの流儀に沿ってファイルが配置される。

openjdk6の場所

/usr/local/openjdk6

hadoop関連

各ディレクトリの中身

openjdk6

$ ls /usr/local/openjdk6/
ASSEMBLY_EXCEPTION demo man
LICENSE include sample
THIRD_PARTY_README jre src.zip bin lib

hadoop関連ファイル

$ ls /usr/local/etc/hadoop
capacity-scheduler.xml hadoop-policy.xml
configuration.xsl hdfs-site.xml
core-site.xml log4j.properties
envvars.d mapred-queue-acls.xml
fair-scheduler.xml mapred-site.xml
hadoop-env.sh taskcontroller.cfg
hadoop-metrics2.properties

$ ls /usr/local/share/hadoop/
bin hadoop-core-1.0.0.jar lib
contrib hadoop-test-1.0.0.jar webapps
hadoop-ant-1.0.0.jar hadoop-tools-1.0.0.jar

$ ls /usr/local/share/examples/hadoop/
conf hdfs-default.xml
core-default.xml mapred-default.xml
hadoop-examples-1.0.0.jar

これでインストールはおしまい。
hadoopはこれだけでも動く。しかしその前に。

/usr/local/bin/hadoopってなんだ

FreeBSDのports特有のものと思うけど、/usr/local/bin/hadoopについて。

/usr/local/bin/hadoopを便宜的にhadoopコマンドと呼ぶ。
hadoop一式は/usr/local/share/hadoop下にあるのに一体これはなんだろう。

中身を見ればすぐ分かる。hadoopコマンドの正体はbashスクリプト。
もう少し見ると、環境変数を設定してからhadoopの実体を呼ぶwrapperであると分かる。
と同時に、環境変数の設定は/usr/local/etc/hadoop/envvars.dの下に置いておけばよいと言う点も分かる。

#!/usr/bin/env bash
for i in `ls /usr/local/etc/hadoop/envvars.d/*.env`
do
. ${i}
done

exec /usr/local/share/hadoop/bin/hadoop $@

続き

[FreeBSD] portsのHadoopで分散(x-distributed)モードを動かす準備
[Hadoop]Hadoop 擬似分散(Psuedo-distributed)モードの設定
[Hadoop]擬似分散モードで実験
[Hadoop] 擬似分散モードから完全分散モードへ(データノードの追加)