読者です 読者をやめる 読者になる 読者になる

夢とガラクタの集積場

落ちこぼれ三流エンジニアである管理人の夢想=『夢』と、潰えた夢=『ガラクタ』の集積場です。

Apache Mesosをrpmでインストールして動作を確認する(その1

こんにちは。

SparkのStandalone版を動作させたので、次はクラスタ環境用にMesosの環境を構築してみます。
・・・Spark on YARNについてはCDHでまとまっているのでここではとりあえず省略。いえ、もちろんHDFSとかは使いますけどね。

下記の以前の投稿でApache Mesosの環境構築を行っているのですが、
ソースコードをそのままビルドし、ディレクトリ的にも固定化されていて非常に使いにくいものでした。

Apache Spark on Mesos の環境構築(その1
Apache Spark on Mesos の環境構築(その2
Apache Spark on Mesos の環境構築(その3

そのため、Mesosphereが公開しているrpmファイルを用いたインストールを試してみます。

1.前提環境

以後の記事において前提とする環境は以下の通りです。
※使うのがrpmとなり、依存パッケージなども変動するのでマシンを作りなおしています。
性能や事前の設定はApache Spark on Mesos の環境構築(その1と同様です。

あとはopenjdk-1.7.0を最新版に更新し、develパッケージもインストールしています。

# yum update java-1.7.0-openjdk
# yum install java-1.7.0-openjdk-devel

2.Mesosのパッケージファイル配布サイト

Mesosのパッケージは以下のサイトからダウンロードします。
http://mesosphere.io/

ダウンロードボタンからダウンロードページに行けますので、そこからダウンロードとなります。

配布パッケージの対応OSは以下の通り。すべて64bit版となっています。
Ubuntu 12.04
Ubuntu 12.10
Ubuntu 13.04
Debian Wheezy
Centos 6
RedHat 6

なので、ここからrpmファイルをダウンロードして使用します。

3.Mesosのインストール

では、実際にインストールを行います。

# wget http://downloads.mesosphere.io/master/centos/6/mesos_0.14.0-rc4_x86_64.rpm
# rpm -ivh mesos_0.14.0-rc4_x86_64.rpm

これでダウンロードが可能です。rpmファイルの中身は以下のようになっています。
サービス化の準備も進めているように見えますが、今回インストールしましたが特にserviceに登録されたはしませんでした。

/etc/default/mesos
/etc/default/mesos-master
/etc/default/mesos-slave
/etc/init/mesos-master.conf
/etc/init/mesos-slave.conf
/etc/mesos/zk
/usr/bin/mesos-init-wrapper
/usr/local/bin/mesos-local
/usr/local/bin/mesos-log
/usr/local/bin/mesos-mesos
/usr/local/include/mesos/executor.hpp
/usr/local/include/mesos/mesos.hpp
/usr/local/include/mesos/mesos.pb.h
/usr/local/include/mesos/mesos.proto
/usr/local/include/mesos/resources.hpp
/usr/local/include/mesos/scheduler.hpp
/usr/local/include/mesos/values.hpp
/usr/local/lib/libmesos-0.14.0.so
/usr/local/lib/libmesos.la
/usr/local/lib/libmesos.so
/usr/local/libexec/mesos/mesos-executor
/usr/local/libexec/mesos/mesos-launcher
/usr/local/sbin/mesos-daemon.sh
/usr/local/sbin/mesos-master
/usr/local/sbin/mesos-slave
/usr/local/sbin/mesos-start-cluster.sh
/usr/local/sbin/mesos-start-masters.sh
/usr/local/sbin/mesos-start-slaves.sh
/usr/local/sbin/mesos-stop-cluster.sh
/usr/local/sbin/mesos-stop-masters.sh
/usr/local/sbin/mesos-stop-slaves.sh
/usr/local/share/mesos/webui/master/static/browse.html
/usr/local/share/mesos/webui/master/static/css/bootstrap-2.3.2.min.css
/usr/local/share/mesos/webui/master/static/css/bootstrap-responsive-2.3.2.min.css
/usr/local/share/mesos/webui/master/static/css/graph.css
/usr/local/share/mesos/webui/master/static/css/mesos.css
/usr/local/share/mesos/webui/master/static/dashboard.html
/usr/local/share/mesos/webui/master/static/framework.html
/usr/local/share/mesos/webui/master/static/frameworks.html
/usr/local/share/mesos/webui/master/static/home.html
/usr/local/share/mesos/webui/master/static/ico/favicon.ico
/usr/local/share/mesos/webui/master/static/img/glyphicons-halflings-white.png
/usr/local/share/mesos/webui/master/static/img/glyphicons-halflings.png
/usr/local/share/mesos/webui/master/static/img/loading.gif
/usr/local/share/mesos/webui/master/static/index.html
/usr/local/share/mesos/webui/master/static/js/angular-1.0.7.js
/usr/local/share/mesos/webui/master/static/js/angular-1.0.7.min.js
/usr/local/share/mesos/webui/master/static/js/app.js
/usr/local/share/mesos/webui/master/static/js/controllers.js
/usr/local/share/mesos/webui/master/static/js/cubism.v1.js
/usr/local/share/mesos/webui/master/static/js/cubism.v1.min.js
/usr/local/share/mesos/webui/master/static/js/d3.v2.js
/usr/local/share/mesos/webui/master/static/js/d3.v2.min.js
/usr/local/share/mesos/webui/master/static/js/dashboard.js
/usr/local/share/mesos/webui/master/static/js/jquery-1.7.1.js
/usr/local/share/mesos/webui/master/static/js/jquery-1.7.1.min.js
/usr/local/share/mesos/webui/master/static/js/jquery.pailer.js
/usr/local/share/mesos/webui/master/static/js/relative-date.js
/usr/local/share/mesos/webui/master/static/js/ui-bootstrap-tpls-0.4.0.js
/usr/local/share/mesos/webui/master/static/js/ui-bootstrap-tpls-0.4.0.min.js
/usr/local/share/mesos/webui/master/static/js/underscore-1.4.3.js
/usr/local/share/mesos/webui/master/static/js/underscore-1.4.3.min.js
/usr/local/share/mesos/webui/master/static/js/zeroclipboard-1.1.7.js
/usr/local/share/mesos/webui/master/static/js/zeroclipboard-1.1.7.min.js
/usr/local/share/mesos/webui/master/static/obj/zeroclipboard-1.1.7.swf
/usr/local/share/mesos/webui/master/static/pailer.html
/usr/local/share/mesos/webui/master/static/slave.html
/usr/local/share/mesos/webui/master/static/slave_executor.html
/usr/local/share/mesos/webui/master/static/slave_framework.html
/usr/local/share/mesos/webui/master/static/slaves.html
/usr/local/var/mesos/deploy/mesos-deploy-env.sh.template
/usr/local/var/mesos/deploy/mesos-master-env.sh.template
/usr/local/var/mesos/deploy/mesos-slave-env.sh.template
/usr/share/doc/mesos/CHANGELOG
/usr/share/java/mesos-0.14.0.jar
/var/log/mesos

では、実際に起動してみます・・・と思ったのですが、
なんか起動シェルっぽいのが一杯あってどれを使えばいいのか分からない(汗
加えてmesos-master等を実行すると以下のエラーが発生します。

# mesos-master
mesos-master: error while loading shared libraries: libjvm.so: cannot open shared object file: No such file or directory

そのため、インストールされたファイルにライブラリパスやMaster/Slave、ZooKeeperのアドレスを設定する必要がありそう。

3.各種ファイルの構成

そんなわけで、起動スクリプトや設定ファイルのように思われるファイルの中を確認してみます。
「個々のファイルが何をやっているか?」を解説していく形になります。

  • /etc/default/mesos
  • /etc/default/mesos-master
  • /etc/default/mesos-slave

環境変数設定。ULIMITやZooKeeperのアドレス、ポート番号を指定している。

  • /etc/init/mesos-master.conf
  • /etc/init/mesos-slave.conf

ランレベルの設定と、「/usr/bin/mesos-init-wrapper master/slave」の呼び出し。

  • /etc/mesos/zk

ZooKeeperのアドレス定義

  • /usr/bin/mesos-init-wrapper

/etc/default/mesos、/etc/default/mesos-slave、/etc/default/mesos-masterを読み込み、
/usr/local/sbin/mesos-slave、/usr/local/sbin/mesos-masterを呼び出す。

  • /usr/local/sbin/mesos-daemon.sh

/usr/local/var/mesos/deploy/mesos-master-env.sh、/usr/local/var/mesos/deploy/mesos-slave-env.shを読み込む。
その上で/usr/local/sbin/mesos-slave、/usr/local/sbin/mesos-masterをnohupで呼び出す。

  • /usr/local/sbin/mesos-start-cluster.sh

実行ディレクトリ、インストールディレクトリを初期化し、mesos-start-masters.sh、mesos-start-slaves.shを呼び出す。

  • /usr/local/sbin/mesos-start-slaves.sh

mesos-deploy-env.shを読み込み、/usr/local/var/mesos/deploy/slavesに記述されたホストのslaveプロセスをmesos-daemon.shを用いて呼び出す。

  • /usr/local/sbin/mesos-start-masters.sh

mesos-deploy-env.shを読み込み、/usr/local/var/mesos/deploy/mastersに記述されたホストのmasterプロセスをmesos-daemon.shを用いて呼び出す。

  • /usr/local/sbin/mesos-stop-cluster.sh
  • /usr/local/sbin/mesos-stop-masters.sh
  • /usr/local/sbin/mesos-stop-slaves.sh

mesos-start-*.shの逆。但し、終了はkillallコマンドで行っている。

  • /usr/local/var/mesos/deploy/mesos-deploy-env.sh.template
  • /usr/local/var/mesos/deploy/mesos-master-env.sh.template
  • /usr/local/var/mesos/deploy/mesos-slave-env.sh.template

環境設定を記述するテンプレートファイル。
初期は「mesos-deploy-env.sh.template」にssh用の環境設定、「mesos-slave-env.sh.template」にMESOS_masterがあるのみ。

  • /usr/local/bin/mesos-local
  • /usr/local/bin/mesos-log
  • /usr/local/bin/mesos-mesos
  • /usr/local/libexec/mesos/mesos-executor
  • /usr/local/libexec/mesos/mesos-launcher
  • /usr/local/sbin/mesos-master
  • /usr/local/sbin/mesos-slave

実行バイナリファイル。

ファイル間の呼び出し階層をまとめると以下のようになりました。
■起動処理系

mesos-start-cluster.sh 
├mesos-deploy-env.sh
|
├―mesos-start-masters.sh (mastersのリモートホストが対象)
|  └mesos-daemon.sh
|      ├mesos-master-env.sh
|      └/usr/local/sbin/mesos-master
|
└―mesos-start-slaves.sh (slaveのリモートホストが対象)
    └mesos-daemon.sh
        ├mesos-slave-env.sh
        └/usr/local/sbin/mesos-slave

■停止処理系

mesos-stop-cluster.sh 
├mesos-deploy-env.sh
|
├―mesos-stop-slaves.sh (slaveのリモートホストのslaveプロセスを終了)
|
└―mesos-stop-masters.sh (mastersのリモートホストのmasterプロセスを終了)

■サービス処理系(不完全?)

mesos-master.conf 
|
└mesos-init-wrapper
    └/etc/default/mesos
    ├/etc/default/mesos-master
    └/usr/local/sbin/mesos-master

mesos-slave.conf 
|
└mesos-init-wrapper
    └/etc/default/mesos
    ├/etc/default/mesos-slave
    └/usr/local/sbin/mesos-slave

4.実際に何を用いて起動/停止を行うか?

サービス処理系は現状不完全のように見えるので、とりあえず今回は使いません。
そのため、設定を以下のファイルのように記述し、
リモートも含めて起動したい場合はmesos-start-cluster.sh、ローカルで起動したい場合はmesos-daemon.shを使用するのがよさそうです。

  • mesos-deploy-env.sh:masters、slavesへの接続設定
  • mesos-master-env.sh:mesos-masterの環境設定
  • mesos-slave-env.sh:mesos-slaveの環境設定

とりあえず、設定の方法などはわかったので、後は次回設定を行い、起動して動作を確認してみます。