8t's BBR

よくつまったあれこれをメモ

Hadoopクラスタ構成への道 ~完全分散編~

※疑似分散までは前記事を参照
Hadoopクラスタ構築への道 ~疑似分散編~ - 8t's BBR
※前記事の続きという形で

準備

まずはHadoopクラスタを組みたいサーバーすべてにHadoopを入れます。
一つ一つ手作業でやってもいいですが、疑似分散までできているサーバーがあるなら、rsyncコマンドを使ってhadoopディレクトリを丸々コピーしてやればいいと思います。

# 前記事と同じhadoop-2.7.2を使っている場合
rsync -auvz hadoop-2.7.2へのパス コピー先IPアドレス:コピーしたいディレクトリ先のパス

あとは、環境変数の指定(sourceコマンドで反映させるのを忘れないこと)とかjavaをインストールしておけば準備は完了です。
これもpdshコマンドとかを使ってまとめてやれると楽かと思います。


よくわからんし、クラスタの規模もかなり小さいし、一台一台手作業でやるよーって人は前記事を参考に頑張ってください。



設定ファイルの変更

次に各ノードの設定ファイル。
公式にはいろいろと書いてあるが、とりあえず動かすだけなら以下の記述で十分っぽい。

MasterノードとSlaveノード共通の設定

# core-site.xml

<configuration>
    <property>
        <name>fs.defaultFS</name>
        <value>hdfs://[masterノードのIPアドレス]:9000</value>
    </property>
</configuration>


# hdfs-site.xml

<configuration>
    <property>
        <name>dfs.replication</name>
        <value>3</value>
    </property>
</configuration>


# yarn-site.xml

<configuration>
    <property>
        <name>yarn.nodemanager.aux-services</name>
        <value>mapreduce_shuffle</value>
    </property>

  <property>
    <name>yarn.resourcemanager.hostname</name>
	<value>[masterノードのIPアドレス]</value>
  </property>
</configuration>


Masterノードの設定

疑似分散からの続きであれば特に変更はないが、masterノードで
# mapred-site.xml

<configuration>
    <property>
        <name>mapreduce.framework.name</name>
        <value>yarn</value>
    </property>
</configuration>

での記述も確認。


実行

あとはNamenodeのフォーマットして、master、slaveの各ノードでデーモンを起動

# masterノード
$  hdfs namenode -format
$  hadoop-daemon.sh start namenode
$  yarn-deamon.sh start resourcemanager

# slaveノード
$  hadoop-daemon.sh start datanode
$  yarn-daemon.sh start nodemanager

これでうまくいけば、サンプルアプリケーションまで動かせる。



つまったところ
  • Datanodeは立ち上げるが、Namenodeとつながらない

これに1週間近く手間取った。logを見ればhostname cannot resolvedとなっている。sshtelnetはつながるし、Hadoopの設定の何かがだめなことは予想できるのだがいつまでたっても原因がわからず・・・
苦手な英語のサイトまでみてようやく見つけた。
Why Datanode is Denied Communication With Namenode - Rowanto Luo
つまるところ、Namenodeはブラックリストなるものをもっていて、そこにあるIPのやつとは接続しないらしい
(なんでslaveノードがブラックリスト化されてんだよ・・・、てかいつされたんだよ・・・)
というわけで、とりあえずブラックリストにあるIPかどうか調べるのを無効にしてやれとのこと
namenodeのhdfs-site.xml

<property>
  <name>dfs.namenode.datanode.registration.ip-hostname-check</name>
  <value>false</value>
</property>

の記述を追加すればいいだけ。
てかこんなん知らねぇよ。公式に書いてくれ。


  • jobが途中から進行しない

ログを見ると、名前解決ができないとのこと。またか。
各ノードの/etc/hostsにそれぞれのノードのIPとhostnameを追加してやる。
まだエラー。また英語のサイト巡りしてみると/etc/hostsのローカルループバック127.0.1.1が駄目とのこと
割り当てているIPアドレスに変えたらなんとかなった。