S-JIS[2016-09-17/2017-07-16] 変更履歴

Retzインストール(クラスター)メモ

Retzをインストールする手順。


概要

Retzは複数のコンポーネントで構成されており、コンポーネント毎に(別々の)サーバーにインストールする。

が、実際のところ、Mesosマスター+ZooKeeper(スタンドアローン(1台構成))+retz-serverを1台のサーバー(数GBのメモリーがあれば足りるらしい)にインストールすれば良さそう。
(retz-serverはJava8で動くので、Javaは8をインストールする必要がある)

Mesosエージェントは、実際にコマンド(ジョブ)を実行する各サーバーにインストールする。

retz-clientは、Retzの命令を発行するサーバーにだけインストールすればよい。
(retz-clientはJava8で動くので、Javaは8をインストールする必要がある)


ZooKeeperのインストール

  1. ZooKeeperをインストールする。
  2. ZooKeeperを初期化する。
    (1台(スタンドアローン)構成の場合、以下のコマンドを1回実行するだけ。複数台構成の場合は、たぶんmyidを変えながらそれぞれのサーバーで実行する)
    # zookeeper-server-initialize --myid=1
  3. ZooKeeperのクラスター構成を設定する。
    # vi /etc/zookeeper/conf/zoo.cfg
    末尾にZooKeeperを構成するサーバーを列挙する。 例:「server.1=ZooKeeperホスト名:2888:3888
    末尾の数値は、使用するTCPポートの範囲らしい。

Mesosマスターのインストール

  1. hwlocやnumactlをインストールする。
    # yum install hwloc numactl
  2. Mesosのyumリポジトリーを登録する。 
  3. Mesosをインストールする。
    # yum install mesos mesosphere-el-repo marathon
  4. ZooKeeperの場所を設定する。
    # vi /etc/mesos/zk
    zk://ZooKeeperホスト名:2181/mesos」といった値を設定する。

もしyum installの最中に以下のようなトランザクション確認エラーが出たら、既にインストールされているライブラリーが競合しているということなので、古いライブラリーを削除してから再実行する。

トランザクションの確認エラー
  file /usr/lib64/libevent-2.0.so.5.1.9 from install of libevent2-2.0.21-2.el6.x86_64 conflicts with file from package libevent-last-2.0.22-1.el6.remi.x86_64
  file /usr/lib64/libevent_core-2.0.so.5.1.9 from install of libevent2-2.0.21-2.el6.x86_64 conflicts with file from package libevent-last-2.0.22-1.el6.remi.x86_64
  file /usr/lib64/libevent_extra-2.0.so.5.1.9 from install of libevent2-2.0.21-2.el6.x86_64 conflicts with file from package libevent-last-2.0.22-1.el6.remi.x86_64
  file /usr/lib64/libevent_openssl-2.0.so.5.1.9 from install of libevent2-2.0.21-2.el6.x86_64 conflicts with file from package libevent-last-2.0.22-1.el6.remi.x86_64
  file /usr/lib64/libevent_pthreads-2.0.so.5.1.9 from install of libevent2-2.0.21-2.el6.x86_64 conflicts with file from package libevent-last-2.0.22-1.el6.remi.x86_64
# yum list | grep libevent
libevent-last.x86_64                       2.0.22-1.el6.remi            @remi
libevent.i686                              1.4.13-4.el6                 base
libevent.x86_64                            1.4.13-4.el6                 base
libevent-devel.i686                        1.4.13-4.el6                 base
libevent-devel.x86_64                      1.4.13-4.el6                 base
libevent-doc.noarch                        1.4.13-4.el6                 base
libevent-headers.noarch                    1.4.13-4.el6                 base
libevent-last-devel.x86_64                 2.0.22-1.el6.remi            remi
libevent-last-doc.noarch                   2.0.22-1.el6.remi            remi
libevent2.i686                             2.0.21-2.el6                 base
libevent2.x86_64                           2.0.21-2.el6                 base
libevent2-devel.i686                       2.0.21-2.el6                 base
libevent2-devel.x86_64                     2.0.21-2.el6                 base
libevent2-doc.noarch                       2.0.21-2.el6                 base

# yum remove libevent-last
# yum install mesos mesosphere-el-repo marathon

retz-serverのインストール

  1. GitHubのretz/releaseでアーカイブファイルのURLを確認し、ダウンロードする。
    # wget https://github.com/retz/retz/releases/download/0.1.2/retz-server-0.1.2-1.el7.x86_64.rpm
  2. インストールする。
    # rpm -ivh retz-server-0.1.2-1.el7.x86_64.rpm
  3. 設定ファイルを変更する。
    # vi /opt/retz-server/etc/retz.properties
    retz.mesos 「localhost」をMesosマスターのホスト名に書き換える。
    retz.bind 「localhost」を自サーバーのホスト名に書き換える。
    retz.user ジョブを実行するユーザー。[2017-03-08]
    load-appで-Uを省略した際のユーザーとなる。
    retz.max.cpus 1つのアプリケーションで使用する最大CPU数。[2016-12-11]
    retz.max.mem 1つのアプリケーションで使用する最大メモリー量。[2016-12-11]
    retz.max.gpus 1つのアプリケーションで使用する最大GPU。[2016-12-11]
    GPUを使用しないなら0。
    retz.max.ports 1つのアプリケーションで確保できる最大ポート数。[2016-12-11]
    サーバータイプのアプリケーションの為のものなので、バッチアプリケーションでは必要ない。
    retz.max.disk 1つのアプリケーションで使用する最大ディスクサイズ。[2016-12-11]
    retz.planner.name プランナーの種類。[2016-12-11]
    nativeかpriorityを指定する。
    runコマンドで--prio(優先度)を指定する場合は、プランナーをpriorityにしておく必要がある。

Mesosエージェントのインストール

実際にコマンド(ジョブ)を実行するサーバーにインストールする。

  1. hwlocやnumactlをインストールする。
    (NUMAを使ってリソース情報を取得するらしい)
    # yum install hwloc hwloc-libs numactl numactl-libs
  2. Mesosのyumリポジトリーを登録する。
    # rpm -Uvh http://repos.mesosphere.com/el/7/noarch/RPMS/mesosphere-el-repo-7-2.noarch.rpm
  3. Mesosをインストールする。
    # yum install mesos mesosphere-el-repo
  4. 設定を変更する。
    # echo "cgroups/cpu,cgroups/mem" > /etc/mesos-slave/isolation
    # echo "true" > /etc/mesos-slave/cgroups_enable_cfs
  5. ZooKeeperの場所を設定する。
    # vi /etc/mesos/zk
    zk://ZooKeeperホスト名:2181/mesos」といった値を設定する。

retz-clientのインストール

  1. GitHubのretz/releaseでアーカイブファイルのURLを確認し、ダウンロードする。
    # wget https://github.com/retz/retz/releases/download/0.1.2/retz-client-0.1.2-1.el7.x86_64.rpm
  2. インストールする。
    # rpm -Uvh retz-client-0.1.2-1.el7.x86_64.rpm
  3. 設定ファイルを変更する。
    # vi /opt/retz-client/etc/retz.properties
    retz.server.uriの「localhost」をretz-serverのホスト名に書き換える。[/2016-12-15]

retz-clientを1台のサーバー上で大量(30個とか)に同時に実行しようとすると、リソース不足で実行できないことがある。[2017-02-25]
ulimit -u 4096」とかでプロセス数を増やしたら実行できるようになるかも。


ZooKeeperの起動

# zookeeper-server start

「ZooKeeper data directory is missing at /var/lib/zookeeper fix the path or run initialize」というエラーが出たら、ZooKeeperが初期化されていないと思われる。
zookeeper-server-initialize


Mesosマスターの起動

MesosマスターはZooKeeperを使用するので、先にZooKeeperを起動しておく。

CentOS6の場合

# start mesos-master
# start marathon

※marathonは起動しなくても特に問題ないらしい。[2017-06-12]

なお、/etc/hostsにMesosエージェントのホスト名が定義されていないと、Mesosエージェントからの接続があっても正常に認識されないっぽい。[2016-12-15]


retz-serverの起動

$ nohup /opt/retz-server/bin/retz-server &

本格的にサービス化したい場合は、supervisordを使う?


Mesosエージェントの起動

Mesosエージェントを起動するとMesosマスターに通信するので、先にMesosマスターを起動しておく。

CentOS7の場合

# systemctl start mesos-slave

Mesosエージェントを入れたサーバーでファイアウォールが有効になっていると、MesosマスターからMesosスレーブに通信できなくてエラーになる。

Mesosマスターのログ(/var/log/mesos/mesos-master.WARNING):

W0914 17:26:59.010690 32239 master.cpp:5620] Master returning resources offered because agent 24a33018-e542-4f8c-8c33-9041bc7fe61e-S74 at slave(1)@192.168.1.11:5051 (slave1) is disconnected
E0914 17:36:22.199347 32240 process.cpp:2105] Failed to shutdown socket with fd 31: Transport endpoint is not connected

MesosスレーブのTCPポート5051に接続できない。
(通信できるなら、試しに「curl スレーブのホスト名:5051」を実行したら正常終了するはず)

CentOS7のファイアウォールでTCPポート5051を開ける方法

# firewall-cmd --permanent --add-port=5051/tcp
# firewall-cmd --reload

Mesosエージェントの動作確認

MesosエージェントからMesos経由で「java -version」を実行してみる。

$ mesos-execute --command="java -version" --master=ホスト名:5050 --name=java-version
〜
Received status update TASK_RUNNING for task 'java-version'
〜
Received status update TASK_FINISHED for task 'java-version'
〜

ホスト名は、Mesosマスターのホスト名を指定する。

コマンドが実行されれば、TASK_FINISHEDが表示される。
コマンドの実行結果自体は表示されない。(Mesosの画面http://ホスト名:5050」から見られる らしい)


retz-clientの動作確認

retz-clientのコマンドを適当に実行してみる。

$ /opt/retz-client/bin/retz-client help
$ /opt/retz-client/bin/retz-client list

retz-serverのステータス確認

retz-serverのステータス(使用中のリソースや確保しているリソース)を確認する方法。[2017-06-12]

$ curl http://retz-serverのホスト名:9090/status

↓実行結果の例

{"command":"status","queueLength":166,"runningLength":2,"totalUsed":{"cpu":44,"memMB":416000,"gpu":0,"ports":0,"diskMB":64,"nodes":0},"numSlaves":0,"offers":0,"totalOffered":{"cpu":0,"memMB":0,"gpu":0,"ports":0,"diskMB":0,"nodes":0},"serverVersion":"retz-server-0.2.6 (0.2.6)","status":"ok","version":"0.2.0"}

totalOfferedがMesosに対して要求しているリソース、totalUsedがRetz(Retz経由で実行されたタスク)が使用しているリソース。
offerされているにも関わらずusedが0の場合、Mesosからリソースが取得できないと考えられる為、Mesosのステータスを確認する。


Mesosのステータス確認

ブラウザーから「http://Mesosマスターのホスト名:5050」を開くと、Mesosのステータスが確認できる。[2017-06-12]

画面上部のツールバーっぽいメニューから「Frameworks」を選び、そこで表示される画面の「Active Frameworks」を見ると、フレームワーク(Retz等)がどれくらいのリソースを使っているかが確認できる。
(もしRetz以外のフレームワークがリソースを占有しているとRetzはリソースを確保できないので、Retzのタスクは実行できない状態になる)


Retz目次へ戻る / 技術メモへ戻る
メールの送信先:ひしだま