ML115 G5 でHadoopを始めよう
激安サーバでHadoop構築
Hadoop導入記シリーズ:
- Hadoop導入記01「Hadoop導入記スタートのお知らせ」
- Hadoop導入記02「固定IPアドレスのアドレス変更」
- Hadoop導入記03「NISを使ってマシン間でアカウントを共有する」
- Hadoop導入記04「NIS+NFSでhomeディレクトリを共有する」
- Hadoop導入記05「Hadoopが複数台動作しました」
- Hadoop導入記06「autofsの設定がおかしい?」
- Hadoop導入記07「Hadoop用ユーザを作る」
- Hadoop導入記08「SSHに制限をかける」
- Hadoop導入記09「Hadoopをついにインストール それとJDKも」
- Hadoop導入記10「Hadoopの設定とテスト」
では、ML115 G5と呼ばれるhp製サーバマシンを複数台(2台)利用してHadoopを動作させました。
家庭でHadoop環境を安価に作りたい。個人で気軽にHadoopを使ってみたい。企業だけど金がなくって安いのでやってみたい。という人にML115 G5は悪くないと思います。
今、激安サーバ ML115 G5 がさらに安い!
3月後半に突入し、毎年恒例(?)な激安サーバキャンペーンをNTT-X Storeが展開してくれています(激安!超特価!サーバー祭り!!)。なんと、2台セットで19,600円。一台あたり9,800円です。しかも送料無料。前述のように、Hadoopを動かしてみるのには十分なPCが1万円でおつりが来る価格で入手可能です。
おそらく、このキャンペーンは3月いっぱい(30日までかも)くらいで終了します。今こそ家庭内分散環境を!という人はぜひご検討あれ。ここまで安いのはこういうキャンペーンの時だけですし、これより安いのは見たことないです。
かくいう私も
3,4台目を検討中です。
安いからって
むやみに買わないように注意しましょう。大きいですし。必要な人に廻してあげてください^^;
Hadoopの解説書:オライリー「Hadoop」
いつのまにやら、オライリーから「Hadoop」が出版されていますね(2010年01月)。Hadoopについて詳しく書いてある本、特に日本語資料はとても貴重なので、Hadoopを本格的にやるなら今はこれしかないかもしれません。
Hadoop
雲の世界の向こうをつかむ クラウドの技術
Microsoftのクラウドコンピューティング Windows Azure入門
Hadoop導入記10「Hadoopの設定とテスト」
とりあえず、導入はこの記事で最後にしようと思います。
Hadoopを展開してできたディレクトリがhadoop-0.18.3だったとします。まずは、マスターノードを登録します。マスターノードのホスト名はml1としていたので、hadoop-0.18.3/conf/mastersの内容を
ml1
とします。で、今度はスレーブとなるノードの設定ですが、2台しかないので、マスターノードにも働いてもらいます。編集するのはhadoop-0.18.3/conf/slavesで、
ml1 ml2
となります。
つづいて、もっと細かい設定をhadoop-0.18.3/conf/hadoop-site.xmlで行います。解説サイトにhadoop-0.18.3/conf/hadoop-default.xmlをhadoop-site.xmlにコピーしてから編集すると書いてあるものがありますが、読み込み時にhadoop-default.xmlを上書きする形でhadoop-site.xmlを読み込むそうなので、そのコピーはあんまり有効とは言えません。使わない項目がたくさんありすぎてややこしいので。
なーんて思ってたんですが、hadoop-default.xmlの冒頭に以下のように書いてありました。
Do not modify this file directly. Instead, copy entries that you wish to modify from this file into hadoop-site.xml and change them there. If hadoop-site.xml does not already exist, create it.
さて、で、その設定ですが、私は初期設定がfile:///になっているfs.default.nameのvalueをhdfs://ml1:54321、mapred.job.trackerのvalueをml1:54322としてみました。
これでhadoop自体の設定が終わったと思ってこの後のテストを行ってみると問題がいろいろ発生。ちょっといかに補足します
一つ目は、JAVA_HOMEがセットされていませんというエラー。これは、環境変数を設定する場所がデフォルトでいいと思っていたことに起因します。実際は、hadoop-0.18.3/conf/hadoop-env.shに設定しないといけないらしい。ということで、そこに
export JAVA_HOME=/usr/java/default
と記述しました。
二つ目は、ノードを起動させるときにConnection closed by 127.0.0.1と出てしまうことです。これは、SSHの設定に不備があると言うことなのですが、一番の問題は、SSHで一度も接続したことがないと失敗するということです。どういうことかというと、一度もSSHコマンドでログインしたことがないと、ホストを信頼するという情報(~/.ssh/known_hosts)が作成されていないからみたいです。ということで、一度はコマンドから
$su - hadooper
$ssh ml1
$ssh ml2
というかんじでSSHログインしてみておいてください。これでもだめなら、SSHの設定を見直してみてください。特に、sshコマンドからも接続できないときは、アクセス制限の設定が怪しいと思われます。
はい、では、いよいよHadoopの実行テストをしてみます。まず、Hadoopのノードを起動する前に、namenodeが使う領域のフォーマットを行います。コマンドは1つだけで、
$hadoop-0.18.3/bin/hadoop namenode -format
とすればOKです。
続いて、ノードを起動します。ここで起動するときにSSHで通信しています。
$hadoop-0.18.3/bin/start-all.sh
ここでエラーが出なければラッキー。出てしまったら、というか、私は出まくったんですが、がんばって対処してください。で、これが終わったら続いて、サンプルを動かしてみます。ここでは、有名な単語をカウントするサンプルを動かします。ここはほとんど「MapReduceのJava実装Apache Hadoopを使ってみた(@IT)」「Hadoopのインストールとサンプルプログラムの実行(CodeZine)」を使っています。まず、入力ファイルを調達します。
$cd hadoop-0.18.3 $cp conf/*.xml input/
続いて、この入力ファイルをhdfsへコピーします。
$bin/hadoop dfs -copyFromLocal input input
コピー先の内容は、以下のようにすることで確認(ls)ができます。
$bin/hadoop dfs -ls
そして、いよいよサンプルを実行します。
$bin/hadoop jar hadoop-0.18.3-examples.jar wordcount input output
これで、それっぽい進捗画面が出たらOKです。
なんだか、いろいろ飛ばした感じがするんですが、大まかにこんな感じでうまく動かすことができました。また細かいことを思い出したように書くかもしれませんが、Hadoop導入記モードはこれで終了します。
Hadoop導入記09「Hadoopをついにインストール それとJDKも」
ここまでの記事のことをいろいろ行ってから、やっとHadoopのインストールです。
まず、Hadoop自体のダウンロード方法ですが、Hadoop公式サイトからダウンロードします。
DLするときの注意ですが、Hadoopでなくてもそうなのですが、安定版をダウンロードしてください。安定版のリンクが見つからない!と思うかもしれませんが、とにかくダウンロードサーバまでリンクをたどってみてください。すると、そのサーバの中に「stable」というフォルダがあります。その中身が安定版です。安定版だからと言って、ファイル名にstableが入っているわけでもないのでさらに注意です。ファイル名はhadoop-0.18.3.tar.gzといった感じです。
ダウンロードしたファイルは圧縮されているので、
$tar xzf hadoop-0.18.3.tar.gz
として、解凍してください。
以上で、Hadoopのインストール(ただし、設定をのぞく)が完了しました。あっけないです。
あ、Sun製のJDKをインストールするのがまだでしたね。ということで、JDKをダウンロードします。ダウンロードはSunのサイトからできます。ダウンロードするのは上から2つめの「Java SE Development Kit (JDK)」の最新版です。この記事を書いている時点で「JDK 6 Update 13」です。そのうち「JDK 6 Update 14」とかになってるかも。
ダウンロードするときは、プラットフォームで「Linux」や「Linux x64」などを適切に選んでください。ダウンロードするファイルは「jdk-6u13-linux-x64-rpm.bin(64bit)」「jdk-6u13-linux-i586-rpm.bin(32bit)」といった感じのファイル名です。
つづきは、「Javaアプリケーションサーバー構築(Tomcat6)(CentOSで自宅サーバー構築)」を参考にしてみてください。とても詳しく書かれています。
ここでは、とりあえず環境変数の記述を/etc/profileではなく、/home/hadooper(Hadoop用アカウント)/.bash_profileに記述しておいてください。なぜなら、/etc/profileは、/homeディレクトリではないので共有されていないからです。実際JDKを使うのはHadoopユーザなので、最低限/home/hadooper/.bash_profileに記述すればOKです。ログイン時に読み込まれます。そこまで行えばJDKのインストールも終了です。
実はこの後はまったのですが、ここでいくらJAVA_HOMEを正しく設定したとしても、Hadoopを実行するときにError JAVA_HOME is not set hadoopみたいなことを言われてしまいます。まぁ、そのことは次回。
Hadoop導入記08「SSHに制限をかける」
前回はHadoop用にアカウントhadooperを作成しました。しかし、このアカウントはパスフレーズなしでSSHからログインできてしまって常識的に考えて危険です。なので、もともとルータなどにより外のネットワークと切り離されたプライベートネットワークで構築すべきなんだそうです。まぁ、そうだとしても何があるか分かりませんし、勉強がてらちゃんとプライベートネットワークからだけSSHでログインできるように制限してみます。
この制限は、PAMを認証に使うことにより行います。というか、私も詳細については詳しくありません。いつものことですが。ここでは、/etc/pam.d/sshdの先頭に以下のように書いてください。
account required /lib/security/pam_access.so (64bitなら account required /lib64/security/pam_access.so
すでにhomeディレクトリの共有は行いましたが、/etcディレクトリは共有していないので、この設定と次の設定はすべてのマシンに記述してください。
あ、ちなみに、どうして毎回64bitなら~って書いているかと言いますと、実際私が64bitOS(CentOS)で設定しているからです。
で、続いて、制限の内容を/etc/security/access.confに以下のように記述します。
- : hadooper : ALL EXCEPT 192.168.1.0/24 127.0.0.0/24
これは、禁止します(-)、hadooperへの接続を、すべてのIPアドレスから(ALL)、ただし以下をのぞきます(EXCEPT)、192.168.1.0/24からと、127.0.0.0/24。という漢字の意味です。
これで、hadooperにログインできるのが、ローカルからだけになりました。/etc/security/access.confではいろいろな制限が可能なので、調べてみてください。
次は、いよいよHadoopのインストールです。というか、これやったの数日前なんですよね、はやくHadoop導入記書き上げちゃいたいなぁ・・・
Hadoop導入記07「Hadoop用ユーザを作る」
いつも使っているユーザをパスフレーズなしにするのってなんか微妙なので、Hadoop専用のユーザとして、「hadooper」というアカウントを作ってみます。
#useradd --create-home hadooper
#userpasswd hadooper
で、もうこの時点でSSHを使っていたんですが、設定で以下のことを確認しました。設定は/etc/ssh/sshd_configです。
Protocol 2これで、SSH Version 2(だったっけ?)で通信し、rootのログインを禁止し、アカウントのパスワードによる認証を禁止にしました。さて、そんでもってhadooper用の設定をします。
PermitRootlogin no
passwordAuthentication no
#su - hadooperとします。SSHでログインしたいユーザ(hadooper)になった状態でssh-keygenを利用して認証鍵を作成します。
$ssh-keygen -t rsa -P ""
$cp ~/.ssh/id_rsa.pub ~/.ssh/authorized_keys2これがものすごく大切になります。作成した鍵は、id_rsaとid_rsa.pubでペアですが、これは鍵を作成しただけで、これを使うという意味ではないからです。ちゃんと使ってもらうために、名前をauthorized_keys2にしています。つづいて、この鍵はほかのユーザから見られたくないので、
$chmod 700 ~/.sshとしておきましょう。
$chmod 700 ~/.ssh/*
以下余談。
今回はhadooper用に鍵を作成しましたが、もし、普段使うために鍵を作ったならば、ログインしたいPCWindowsなど)には、id_rsaを持って行ってください。私はputtyを利用していますが、puttyの場合は、puttygen.exeを利用してid_rsaを変換し*.ppkファイルを作成する必要があるので注意してください。
続きも今から書きますが、次はこのSSHアカウントのログインに制限をかける設定についてです。