Quitada ブログ HAX

Hatena Blog でも Quitada ブログ

Apache Hadoop 疑似クラスターと MapReduce ジョブアプリ開発環境をサクッとテキトーに構築 - 中途半端編

MacBook Pro 上に、とりあえず動くことを優先に、以下のような構成で表題のことを実現しようと思ったわけでして。

YARN な感じも試したかったので、現状最新の Apache Hadoop 2.2.0 で、コンパイルするのに maven とか必要そうで面倒だったので、tar ball 版をダウンロードして、Linux VM の所定の箇所で解凍、インストール完了。はて?設定はどうやってやるんだろう…。超エクスプレス設定方法を期待して、Apache Hadoop の本家サイトの Getting Started 的なところ見てもなんだか Getting Stared できやしないし、ググってみても Hadoop 1.0 以前の設定方法紹介サイト様は結構ヒットするけど、2.x 系がなかなかない…。ようやく発見したのが以下のサイト様。

こちらの設定で、おおむね動きましたー。ただし、そのままだと当初 NodeManager がログに以下ようなエラーをはいて起動に失敗してました。

2013-11-19 23:05:24,963 FATAL org.apache.hadoop.yarn.server.nodemanager.NodeManager: Error starting NodeManager
java.lang.IllegalArgumentException: The ServiceName: mapreduce.shuffle set in yarn.nodemanager.aux-services is invalid.The valid service name should only contain a-zA-Z0-9_ and can not start with numbers

Hadoop 2.2.0 の仕様変更か何かで、yarn-site.xml の yarn.nodemanager.aux-services プロパティーに設定する値は、mapreduce.shuffle から mapreduce_shuffle に変更する必要があるみたいです。

さて各デーモンは動いたっぽいですが、NameNode のリスンホストが localhost なんですよね。つまり、今回疑似クラスターを構築した Linux VM 上からでないと、ジョブ投入できないわけです。ジョブは Parallels Desktop を動かしている MacBook Pro から投入したいのですが、Linux VM はネットワーク的にはリモートマシンに見えるので、ホストアドレスに明示的に IP やら名前解決可能なホスト名を記述してやれば良いということですね。

で設定変更します。まず core-site.xml ファイルですが(基本、これだけの変更で OK ですが)、以下のように Linux VM の IP アドレス(と、あとデフォルト値で実質省略可能だけどポート番号)を設定してやります(NameNode のリスンアドレス・ポート設定)。

<property>
  <name>fs.defaultFS</name>
  <value>hdfs://192.168.0.101:8020</value>
</property>

次に、mapred-site.xml ファイルですが、個人的には以下を追加しました。デフォルトでは、全アドレスリスンという感じ(0.0.0.0:10020 みたいな)なので、明示的設定は不要ですが、複数 NIC あるときとか気持ち悪い動きをしそうなので、後々困らないために敢えて固定値を設定したく。

<property>
  <name>mapreduce.jobhistory.address</name>
  <value>192.168.0.101:10020</value>
</property>
<property>
  <name>mapreduce.jobhistory.webapp.address</name>
  <value>192.168.0.101:19888</value>
</property>

最後に、yarn-site.xml ファイルですが、こちらも敢えて設定するのは不要ですが、mapred-site.xml ファイルと同じ理由で個人的に以下を追加しました(デフォルトで全アドレスリスンなので)。

<property>
  <name>yarn.resourcemanager.hostname</name>
  <value>192.168.0.101</value>
</property>

#ま、結局「動けばいい」という観点では、core-site.xml ファイルの fs.defaultFS だけの変更で良いですね。

疑似クラスター環境ができあがったところで、次は IntelliJ IDEA での MapReduce ジョブ開発プロジェクトの作成です。はい、これは(英語ですけど)以下のサイト様を参照するのが良いでしょう。

ただこれで普通に IDE 上から Run やら Debug で実行しても、ローカルマシン上で MapReduce ジョブを動かして、ローカルファイルシステムに入出力するだけで、先に構築した疑似クラスター上でジョブ実行しないわけですね。そのためには、"hadoop jar" コマンドで IDE 上で作成した各種 MapReduce ジョブクラスをかためた jar を指定して、なおかつジョブ投入先を先ほど構築した疑似クラスター宛てに設定して、ジョブ実行してやる必要があると思うのですよ。まー、これも IntelliJ IDEA 上からできたら格好いいとは思いますが、今回はとりあえず後まわし(本ブログエントリーが、中途半端編なゆえん)。おそらく、以下の機能を使えば実現可能かとは思います。教えて!サムライズムの偉い人

とりあえず以下の方法で、手動で "hadoop jar" にて Mac OS からジョブ投入できました。

  1. Apache Hadoop 2.2.0 の tar ball を Mac 上の適当なディレクトリに解凍(すでに開発環境構築の際にどこかに解凍してるとは思われるけど)→ hadoop コマンドへのパス(/[Hadoop 解凍ディレクトリ]/bin)を、環境変数 PATH に通す
  2. 先に構築した疑似クラスター環境のコンフィグレーションファイル(*-sie.xml)をディレクトリごと、Linux VM から、Mac OS 上のどこかのディレクトリにコピー→そのディレクトリを、環境変数 HADOOP_CONF_DIR に通す
  3. "hadoop jar" コマンドで MapReduce ジョブ投入

次のチャレンジは、この手動での動作確認を IntelliJ IDEA 上で自動的にできるようにすることですかね。いつやるかは分かりませんが。ともあれ、使用した Linux VM は、64 bit OS なんですが、Apache Hadoop 2.2.0 の tar ball に含まれるネイティブライブラリーが 32 bit モジュールのため、hadoop コマンド実行する度に以下ウォーニングがでるんですよね。

13/11/20 00:11:16 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable

これらをでなくする設定方法の調査か、64 bit モジュールをコンパイルするのが先かな…。

Hadoop徹底入門 第2版 オープンソース分散処理環境の構築

Hadoop徹底入門 第2版 オープンソース分散処理環境の構築