YARN完全分散クラスタを構築する

Apache Hadoopの大本命、完全分散モード(クラスタ)を構築してみます。
疑似分散モードのように単一のノード内でマスター、スレーブの機能をJVMの上に立ち上げるのではなく、実際に各機能についてノードを分けて構築するタイプの構成です。MapReduce側はYARN(MRv2)を使います。

ClouderaとかHorton Worksが提供しているような、Hadoopフレームワークという便利なものが世の中にはありますが、まあ勉強のため素のYARNを構築してみましょう。

サービスとして常駐させるなどいろいろやり方はありますが、ここでは恐らく一番シンプルと思われるやり方(シェルスクリプトで逐一スタートする)で行きます。

おおよその流れは図のようなものです。

構成例

ここでは3台のLinuxマシンを使って構築することにしました。ここで使用している共通的な構成は以下の通り。バージョンやOSは特にこだわりがあるわけではなく、たまたまです。必要に応じて読み替えて下さい。

項目備考
Hadoopバージョン2.6.5
JDKバージョン8OpenJDK 1.8.0
実行ユーザusersudo権限あり
OSUbuntu (Server)16.04, 64ビット
インストールパス/usr/local/hadoop

また、それぞれ同じサブネットLANに接続した(Hyper-V上の)仮想マシンとして構築し、アドレス・ホスト名を次のように設定することにします。MasterはSlaveと兼用できます。

  • Masterノード (x1台)
    • IPアドレス 192.168.100.10, ホスト名 ha1
  • Slaveノード (x2台)
    • IPアドレス 192.168.100.11, ホスト名 ha2
    • IPアドレス 192.168.100.12, ホスト名 ha3

MasterノードにはYARNのResource managerとHDFSのName nodeを、SlaveにはNode managerとdata nodeを稼働させます。

クラスタの準備

クラスタの構築に必要な前提となる設定です。

JDKのインストール

HadoopはJava仮想マシン上で動作しますので、JDKをインストールしておく必要があります。
ここでは以下のコマンドでインストールしました。

SSH公開鍵の作成と配布

HadoopクラスタはSSH経由で相互にコミュニケーションしますので、互いに自動的に認証できるよう設定する必要があります。
そのためには、まず各ノードでキーペアを作成します。

SSHフォルダ~/.sshに秘密鍵と公開鍵ファイルid_rsa.pubが作成されます。
このように各ノードで自身の公開鍵を作成し、ログイン先の他ノードに登録しておく必要があります。SCPなどでクライアントにダウンロードしたあと各ノードにコピーするか、またはssh-copy-idコマンドを使います。

公開鍵ファイルをSCPなどでコピーする場合、ファイルの内容をauthorized_keysファイルに追記することで登録できます。

またはssh-copy-idコマンドを使います。

SSHのキー確認をスキップするよう設定を変更します。
SSHフォルダ~/.sshconfigファイルを作成して下記の内容で保存します。

hostsファイルの編集

ホスト名を解決させたいので、hostsファイルを設定しておきます。
DNSを用意している場合など、不要ならばこのステップは省略できます。

注意点は、(少なくともMasterノードでは)ローカルホストについてレコードを重複させないこと。
一般的なhostsファイルの書き方として、ループバック(127.0.0.1)と別にLAN上の自アドレスに対してホスト名を書いても問題になることはありませんが、この環境ではエラーになりSlaveノードがMasterノードへ接続できません。
例えば、以下の書き方はNGです。

Hadoopのインストール

バイナリをダウンロード、設置します。

ダウンロードと設置

使用するバージョンに応じて、tarballをダウンロードしてきます。
URLはApache Hadoop公式を参照して好きなミラーサイトを選んで下さい。

この例では、解凍したのち/var/local/へ移動、さらに/usr/local/hadoopにリンクを張っています。

上の例では、/varに一式を配置しているので、操作にはルート権限が必要ですが、もちろんユーザ領域に配置する場合は不要です。
実行バイナリや設定ファイルが含まれているので、Hadoopを起動するユーザに実行権限と編集(書き込み)権限を設定しておいて下さい。

環境変数の設定

Hadoopが依存している変数を渡すため、hadoop-config.shスクリプト先頭に追記し、各環境変数を設定します。

追記する内容は以下。

JAVA_HOMEはJDKがインストールされたパスです。

XML設定ファイルの上書き

設定はXMLファイルで記載します。最低限、core-site.xmlファイルとhdfs-site.xmlファイルを設定しておけば動くはず。

core-site.xmlファイルにはHDFSのName nodeを記載します。したがって、ここで記載するアドレスはMasterノードのもの。もちろん設定してあればホスト名でもOK。

hdfs-site.xmlファイルには、各ノードでname node/data nodeのデータ格納用に使うパスなどを記載します。パスはそれぞれのノードの役割に応じて指定して下さい。
最後のdfs...ip-hostname-checkプロパティはname node(Masterノード)のhdfs-site.xmlファイルにのみ記載するのでも構いません。

HDFSの構築

各ノードでHDFSに使用するディレクトリを作成しておきます。Hadoopの実行ユーザで編集できるよう設定して下さい。パスはhdfs-site.xmlに書いたものに揃えます。

また、HDFSのネームノードを初期化しておきましょう。

この時点でHDFSを起動できます。以下のようにシェルスクリプトを実行して下さい。

正常に構築できていれば、MasterノードのURL(http://192.168.100.10:50070/)にアクセスしたときに、HDFSの管理UIが表示されるはず。
各ノードでjpsコマンドを実行すると、担当プロセスが立ち上がっているか確認できます。

YARNの構築

YARNクラスタを構築するには、さらにyarn-site.xmlファイルを編集し、MasterノードのIPアドレスを指定します。

設定ファイルを保存し、各YARNノードを起動します。

正常に構築できていれば、MasterノードのURL(http://192.168.100.10:8088/)にアクセスしたときに、YARNの管理UI (Resource Manager Web UI)が表示されるはず。