現在位置: ホーム / ゲストブログ / [第4回]Linux/OSS エヴァンジェリスト古賀政純の ”旬”のオープンソースソフトウェア~Apache Mesos(後編)~

[第4回]Linux/OSS エヴァンジェリスト古賀政純の ”旬”のオープンソースソフトウェア~Apache Mesos(後編)~

今回のゲストブログは、日本ヒューレット・パッカードが公式に認定するオープンソース・Linuxテクノロジーエバンジェリストの古賀政純さんです。連載第3回と第4回に分けて、『次世代の計算資源管理ソフトウェアApache Mesosに迫る』と題して、資源割り当ての自動化ソフトウェアであるApche Mesosについて取り上げています。様々な商用の資源管理ソフトウェアが存在する中、オープンソースソフトウェアのApache Mesosに注目が集まっています。この最近の話題のSparkやDockerとの連携を意識したApache Mesosとは、一体何者なのでしょうか?そして、Mesosを導入することによって、どのようなIT基盤になるのでしょうか?前回は、過去から存在する資源管理ソフトウェアも紹介しながら、Apache Mesosを紹介しました。今回は、Apache Mesosのインストール手順、基本的な使用法を簡単に紹介します。(2015年11月18日)

 



次世代の計算資源管理ソフトウェアApache Mesosに迫る(後編)

Docker環境でMesosを構築してみる

それでは、Mesosの環境を実際に構築してみましょう。Mesosの環境は、マスターノードと複数のスレーブノードからなる複数の物理サーバーで構成されますが、勉強用ならば、物理サーバー1台で構成することも可能です。また、Docker環境があれば、複雑なインストール手順を経ることなく、Mesosを簡単に動作させることができます。今回は、1台の物理サーバーで稼働するDocker環境で、Mesosのマスターノードとスレーブノードを稼働させます。さらに、MesosのGUIツールであるMarathonとChronosを使ったジョブの投入までの具体的な手順を紹介します。以下では、ホストOSとしてCentOS 7.1の環境を想定しますが、Mesosマスター、MesosスレーブともにDockerコンテナーで稼働させます。ですので、Linuxにおいて、ある程度Dockerの管理に慣れておく必要があります。筆者がThinkITインプレスグループのITmediaに、基本的なDockerの管理手法に関する連載記事を掲載していますので、Dockerに不慣れな方は、まずそちらをご覧ください。まずは、物理サーバーにDockerが稼働するホストOS(今回はCentOS 7.1)をインストールしてください。プロキシーサーバー経由でインターネットにアクセスする場合は、以下のように、事前にホストOS上で、プロキシーサーバーの設定が必要です。

# vi /etc/yum.conf
...
proxy=http://プロキシーサーバーのFQDN:8080
...

 
ホストOSにDockerをインストールします。

# yum install -y docker 


次に、ホストOS上で、Dockerイメージをインターネット経由で入手するため、プロキシーの設定を行います。

# vi /etc/sysconfig/docker-network
...
http_proxy=http://プロキシーサーバーのFQDN:8080
https_proxy=http://プロキシーサーバーのFQDN:8080
no_proxy=localhost,/var/run/docker.sock
...


ホストOSでDockerを稼働させます。

# systemctl start docker
# systemctl enable docker

 
今回、MesosマスターとホストOSは、同じホスト名、IPアドレスを共有する設定としますので、hostnameコマンドで、Mesosマスターとなるホスト名(apollo4200gen9.jpn.linux.hpe.comとします)を調べておきます。

# hostname
apollo4200gen9.jpn.linux.hpe.com

 
Mesos環境にアクセスするクライアントマシンとホストOSの/etc/hostsファイルを編集し、ホストOS(Mesosマスター)の名前を登録しておきます。

# vi /etc/hosts
...
172.16.99.160 apollo4200gen9.jpn.linux.hpe.com apollo4200gen9
...

 

Mesosマスターの構築

ホストOS上でDockerが稼働できたら、Mesosマスターを構築します。Mesosマスター用のDockerイメージがインターネット経由で入手することができます。マスタノードでは、以下のDockerイメージからなるDockerコンテナー4つを起動することになります。

• garland/zookeeper :Zookeeper
• garland/mesosphere-docker-mesos-master :Mesosマスター
• garland/mesosphere-docker-marathon :Marathon
• mesosphere/chronos :Chronos

マスターノードに必要なZookeeperのDockerイメージを入手し、Dockerコンテナーを稼働させます。

# docker run -d -p 2181:2181 -p 2888:2888 -p 3888:3888 --name zk0001 garland/zookeeper

 
zookeeperのDockerコンテナー「zk0001」がホストOS上で稼働できているかを確認します。

 

# docker ps -a
CONTAINER ID   IMAGE              COMMAND       ...   STATUS         PORTS                     ...   NAMES
555f1a9b27a8   garland/zookeeper  "/opt/run.sh" ...   Up 5 seconds   0.0.0.0:2181->2181/tcp,   ...   zk0001


「STATUS」の所が「Up」になっていることを確認してください。「Exited」となっている場合は、うまく起動できていませんので、docker run実行時のオプションなどを再度確認し、「docker rm -f zk0001」でDockerコンテナーを削除し、再びDockerコンテナーを起動してください。ZookeeperのDockerコンテナーが稼働できたら、次に、MesosマスターのDockerイメージを入手し、コンテナーを起動します。ここでは、MesosマスターのIPアドレスとしてホストOSのIPアドレス(172.16.99.160/16)を指定しています。

# docker run -d --net="host" -p 5050:5050 --name "master0001" \
-e "MESOS_HOSTNAME=apollo4200gen9" \
-e "MESOS_IP=172.16.99.160" \
-e "MESOS_LOG_DIR=/var/log/mesos" \
-e "MESOS_PORT=5050" \
-e "MESOS_QUORUM=1" \
-e "MESOS_REGISTRY=in_memory" \
-e "MESOS_WORK_DIR=/var/lib/mesos" \
-e "MESOS_ZK=zk://172.16.99.160:2181/mesos" \
garland/mesosphere-docker-mesos-master

 
MesosマスターのDockerコンテナーが稼働しているかを確認します。

 

# docker ps -a
CONTAINER ID  IMAGE                                     COMMAND         ...   STATUS         ...   NAMES
4eaa7efa0aa1   garland/mesosphere-docker-mesos-master   "mesos-master"  ...   Up 8 seconds   ...   master0001
...

以上で、MesosマスターをDockerコンテナーで稼働させることができました。ここでもSTATUSが「Up」になっているかを確認してください。

Marathonの構築

次に、MarathonのDockerイメージを入手し、Marathonが稼働するDockerコンテナーを稼働させます。マスターノードのIPアドレスは、「--master」及び、「--zk」で指定しますが、今回は、マスターノードとホストOSのIPアドレスが同一になる設定にしますので、MesosマスターのDockerコンテナーが稼働するホストOSのIPアドレス(172.16.99.160/16)を指定します。

# docker run -d -p 8080:8080 --name marathon0001 garland/mesosphere-docker-marathon \
--master zk://172.16.99.160:2181/mesos --zk zk://172.16.99.160:2181/marathon

 
MarathonのDockerコンテナーが稼働しているかを確認します。

# docker ps -a
CONTAINER ID  IMAGE                                COMMAND               ...   STATUS        ...   NAMES
88caec180a73  garland/mesosphere-docker-marathon   "/opt/marathon/bin/s  ...   Up 8 seconds  ...   marathon0001
...

 

Chronosの構築

Marathonと同様に、ChronosのDockerイメージを入手し、Chronosが稼働するDockerコンテナーを稼働させます。ここでもマスターノードのIPアドレスは、MesosマスターのDockerコンテナーが稼働するホストOSのIPアドレス(172.16.99.160/16)を指定します。

# docker run -d -p 4400:4400 \
--name chronos0001 \
mesosphere/chronos /usr/bin/chronos \
--http_port 4400 \
--master zk://172.16.99.160:2181/mesos \
--zk_hosts zk://172.16.99.160:2181/mesos

 
ChronosのDockerコンテナーが稼働しているかを確認します。

 

# docker ps -a
CONTAINER ID   IMAGE                COMMAND             ...   STATUS       PORTS                    ...   NAMES
79e3c313acae   mesosphere/chronos   "/usr/bin/chronos   ...   Up 8 hours   0.0.0.0:4400->4400/tcp   ...   chronos0001

 

Mesosスレーブの構築

Zookeper、Mesosマスター、Marathon、そしてChronosのDockerコンテナーが正常に稼働できたら、最後に、Mesosスレーブを稼働させます。Mesosマスターを同じ物理サーバー上のホストOSで作業します。ここでも指定するIPアドレスは、Dockerが稼働するホストOSのIPアドレス(172.16.99.160/16)です。

# docker run -d -p 5051:5051 --name slave0001 --hostname slave0001 \
--entrypoint="mesos-slave" \
-e "MESOS_HOSTNAME= apollo4200gen9" \
-e "MESOS_MASTER=zk://172.16.99.160:2181/mesos" \
-e "MESOS_LOG_DIR=/var/log/mesos" \
-e "MESOS_LOGGING_LEVEL=INFO" \
garland/mesosphere-docker-mesos-master:latest

 
MesosスレーブのDockerコンテナーが稼働しているかを確認します。今回は、1台の物理サーバー上に、Zookeeper、Mesosマスター、Marathon、Chronos、そして、Mesosスレーブが稼働するため、Dockerコンテナーは、以下のように5つ起動しているはずです。

 

# docker ps -a
CONTAINER ID  IMAGE                                    ...   COMMAND            ...   STATUS       ...   NAMES
738fb3679d96  garland/mesosphere-docker-mesos-master   ...   "mesos-slave"      ...   Up 8 sec     ...   slave0001
79e3c313acae  mesosphere/chronos                       ...   "/usr/bin/chronos  ...  Up 8 hours   ...   chronos0001
88caec180a73  garland/mesosphere-docker-marathon       ...   "/opt/marathon     ...   Up 8 sec     ...   marathon0001
ce8623a7e18b  garland/mesosphere-docker-mesos-master   ...   "mesos-master"     ...   Up 5 min     ...   master0001
555f1a9b27a8  garland/zookeeper                        ...   "/opt/run.sh"      ...   Up 5 min     ...   zk0001


Mesosマスターのホスト名「apollo4200gen9.jpn.linux.hpe.com」に5050番ポートを付与し、Mesosの管理画面にアクセスできるかを確認します。

 

# firefox http://apollo4200gen9.jpn.linux.hpe.com:5050

Mesosの管理画面
図1. Mesosの管理画面

 

同様に、Marathonの管理画面にアクセスできるかを確認します。8080番ポートです。

 

# firefox http://apollo4200gen9.jpn.linux.hpe.com:8080

Marathonの管理画面
図2. Marathonの管理画面


最後に、Chronosの管理画面にアクセスできるかを確認します。4400番ポートです。

 

# firefox http://apollo4200gen9.jpn.linux.hpe.com:4400

Chronosの管理画面
図3. Chronosの管理画面

ここで、うまく画面が出力されない場合は、名前解決が出来ていない可能性があります。Mesos環境にアクセスするクライアントとホストOSの/etc/hostsファイルを再度確認してください。また、MesosマスターとMesos スレーブのDockerコンテナー起動時に指定した「-e "MESOS_HOSTNAME= apollo4200gen9"」でホスト名を指定していますので、もし/etc/hostsファイルやDNSサーバーによる名前解決ができない場合は、Mesosの管理画面でジョブの出力結果(標準出力や標準エラー出力)を見ることができませんので、注意してください。以上で、Mesosマスター、Mesosスレーブ、Marathon、ChronosからなるMesos環境をDockerで構築することができました。

Marathonを使ったMesos環境へのアプリケーションの投入

構築したMesosの環境に、アプリケーションを投入してみます。まずは、Marathon、Chronosで正常に投入できるかを確認します。Webブラウザを開き、Marathonの画面の右上にある「New App」をクリックし、MesosスレーブのDockerコンテナー上で稼働させるアプリケーション(インスタンス)を作成します。今回は、日付を表示するdateコマンドを実行し、/rootディレクトリにログとして保存するインスタンスを作成します。「Optional Settings」の「Command」の欄に以下を入力します。

 

date >> /root/date0001.txt; sleep 10

 

MarathonのGUIでインスタンスを作成する様子
図4. MarathonのGUIでインスタンスを作成する様子

パラメータを入力したら、ウィンドウ下部にある「Create」を押すと、作成したインスタンスのコマンドがMesosスレーブのDockerコンテナー上で実行されます。Mesosの管理画面でも「Active Tasks」にタスクが現れ、「State」が「RUNNING」になります。

Marathonでmyjob0001の状態を確認
図5. Marathonでmyjob0001の状態を確認
myjob0001が実行されている様子をMesos管理画面で確認する
図6. myjob0001が実行されている様子をMesos管理画面で確認する

Mesosスレーブ上のDockerコンテナーにおいて、Marathonで入力したコマンドが実行されているかをホストOS上から確認します。

# docker exec -i -t slave0001 tail -f /root/date0001.log
Mon Sep 7 07:42:27 UTC 2015
Mon Sep 7 07:42:38 UTC 2015
...


また、Marathonの管理画面でインスタンスを破棄し、コマンドが実行されないかも確認してください。インスタンスの破棄は、Marathonの管理画面でインスタンス(今回はmyjob0001)を選択し、ポップアップしたウィンドウの右端の「Destroy App」をクリックします。インスタンスが無事破棄されると、Mesosの管理画面の「Active Tasks」の欄に表示されていたタスクも自動的に消えるはずです。

インスタンスの破棄
図7. インスタンスの破棄

Chronosを使ったMesos環境へのアプリケーションの投入

次に、Chronosでも確認します。Chronosは、Linuxにおけるcronのように、時刻を指定してジョブを実行することができます。Marathonの時と同様に、時刻を出力し、ログを/rootディレクトリに保管するインスタンスを作成します。Chronosの管理画面で、「New Job」をクリックします。画面右の「NAME」欄にジョブの名前を入力します。今回は、myjob0002にしました。次にその下の「COMMAND」欄に、MesosスレーブのDockerコンテナーで実行したいコマンドを入力します。今回は、以下を入力します。

date >> /root/date0002.log; sleep 10 


さらにその下の「OWNER」にジョブを投入するユーザーのメールアドレスを入力します。ジョブを実行する日付も入力することができますが、今回は、テストとして即座に実行するため、入力しません。

Chronosによるインスタンスの作成
図8. Chronosによるインスタンスの作成

メールアドレスを入力したら、画面上部の「Create」をクリックします。すると、ジョブが登録されます。この時点で、まだMesosスレーブのDockerコンテナー上ではジョブが実行されません。

Chronosでジョブを登録した状態
図9. Chronosでジョブを登録した状態

ジョブを即座に実行するため、管理画面右側の右三角のボタンをクリックします。

Chronosから強制的にジョブを実行
図10. Chronosから強制的にジョブを実行

これで、Mesosスレーブ上のDockerコンテナーで、インスタンスに登録した日付をログに出力するコマンドが実行されます。Mesosスレーブ上のDockerコンテナーで、コマンドが実行されているかをホストOSから確認します。

# docker exec -i -t slave0001 tail -f /root/date0002.log
Mon Sep 7 09:55:03 UTC 2015

 
あわせて、Mesosの管理画面でもジョブが実行されているかを確認します。

Chronos経由で投入したジョブの状態を確認している様子
図11. Chronos経由で投入したジョブの状態を確認している様子

ジョブの実行結果をWebブラウザで確認する

Mesosの管理画面では、ジョブの実行結果を標準出力と標準エラー出力で確認することができます。ジョブの実行結果の標準出力と標準エラー出力を確認するには、Mesosの管理画面に表示されている現在実行中あるいは終了したタスクの「Sandbox」をクリックします。ここで、Sandboxをクリックしてエラーになる場合は、MesosマスターとMesosスレーブのDockerコンテナーをdocker runで起動する際の変数「MESOS_HOSTNAME=」の設定と/etc/hostsあるいはDNSサーバーによる名前解決、または、MesosスレーブのDockerコンテナー起動時のポート番号(今回は5051番)が適切に設定されていない可能性があります。Sandboxをクリックすると、stdoutとstderrをクリックする画面になりますので、結果が出力されているかを確認してください。

ジョブの結果に関する標準出力(stdout)と標準エラー出力(stderr)を確認する
図12. ジョブの結果に関する標準出力(stdout)と標準エラー出力(stderr)を確認する

Mesosにおけるスレーブノードの計算資源や属性

今回は、物理サーバー1台とDockerコンテナーを使って勉強用のMesosクラスター環境を構築しましたが、実際には、MesosにおいてCPU、メモリ、ディスクなどの計算資源と属性をあらかじめMesosスレーブに登録しておき、その資源の利用状況に応じてジョブが配置するといった運用になります。計算資源は、CPU、メモリ、ディスク、ポート番号などです。また、属性は、ラック、地域、OSバージョンなどの文字列を指定することができます。具体的には、Mesosスレーブの/etc/mesos-slaveディレクトリに、計算資源のパラメータ用のresourcesディレクトリと、属性のパラメータ用のattributesディレクトリを作成し、その中に各パラメータを記述したファイルを保存します。

Mesosスレーブでの属性とリソースのパラメータを記述したファイルの例

 

# cd /etc/mesos-slave/attributes/
# ls -F
keys level os rack zone
# cat os
centos71
# cat rack
sales
# cat zone
tokyo
...
# cd /etc/mesos-slave/resources/
# ls -F
cpus disk mem ports
# cat cpus
4
# cat mem
16384
# cat disk
163840
# cat ports
[1-32768]


これらのパラメータを設定した場合は、スレーブノードのサービスを再起動する必要があります。以下の画面は、物理サーバー4台で稼働するCentOS 7.1上のMesosスレーブを直接インストールし、スペックを登録した様子です。CPU、メモリ、ディスクが登録したパラメータを反映して表示されています。

計算資源を設定済みのMesosスレーブ4台の様子
図13. 計算資源を設定済みのMesosスレーブ4台の様子


 

以上で、Mesosの概要、アプリケーションの投入法などを簡単に説明しました。Mesosは、YARNとならんで、資源管理のソフトウェアとして注目を浴びていますが、今後、Hadoop及びSparkなどのビッグデータ分野や科学技術計算を行うHPCなどの分野を巻き込んで、様々な分野の技術者コミュニティが交流し、発展していくことでしょう。是非みなさんも計算資源の有効利用について検討してみてください。次回、連載最終回は、注目のDockerの管理ソフトウェアであるKubernetesについて取り上げます。お楽しみに。

各種お問い合わせ

サイオスOSSよろず相談室(1)

問い合わせボタン

最新の情報
[第17回] Linux/OSS エバンジェリスト古賀政純の『オープンソース・Linux超入門』 Linuxサーバーのためのハードウェア設定 ~ ハードウェアに搭載されている電源管理・電力管理機能とLinuxの関係 ~ 2017年07月19日
[第16回] Linux/OSS エバンジェリスト古賀政純の『オープンソース・Linux超入門』 Linuxサーバーのためのハードウェア設定 ~ CPUの仮想化支援機能 ~ 2017年07月05日
[第15回] Linux/OSS エバンジェリスト古賀政純の『オープンソース・Linux超入門』 Linuxサーバーのためのハードウェア設定 ~ Hyper-Threading ~ 2017年06月21日
わかっておきたいセキュリティ: 第5回 VirusTotal at Home/Work「Malice」 2017年05月10日
わかっておきたいセキュリティ: 第4回 IRMA (Incident Response Malware Analysis) 2017年03月29日
わかっておきたいセキュリティ: 第3回 マルウェア解析サンドボックス「Cuckoo」との連携 その2 2017年02月22日
[第14回] Linux/OSS エバンジェリスト古賀政純の 『オープンソース・Linux超入門』 システム要件において検討すべき点 その4 2017年02月08日
[第13回] Linux/OSS エバンジェリスト古賀政純の 『オープンソース・Linux超入門』 システム要件において検討すべき点 その3 2017年02月01日
[第12回] Linux/OSS エバンジェリスト古賀政純の 『オープンソース・Linux超入門』 システム要件において検討すべき点 その2 2017年01月25日
[第11回] Linux/OSS エバンジェリスト古賀政純の『オープンソース・Linux超入門』 システム要件において検討すべき点 その1 2017年01月18日
Python人材育成の支援を目的としたPythonエンジニア育成推進協会の活動とは? 2016年12月21日
わかっておきたいセキュリティ: 第2回 マルウェア解析サンドボックス「Cuckoo」との連携 2016年12月14日
可知豊の『 わかっておきたい、オープンソースライセンス』: 第3回 オープンソースライセンスの使い方をわかっておきたい 2016年12月08日
可知豊の『 わかっておきたい、オープンソースライセンス』: 第2回 色々なオープンソースライセンスをわかっておきたい 2016年11月30日
可知豊の『 わかっておきたい、オープンソースライセンス』: 第1回 著作権とライセンスをわかっておきたい 2016年11月17日
わかっておきたいセキュリティ: 第1回 マルウェア解析サンドボックス「Cuckoo」 2016年11月02日
[第10回] Linux/OSS エヴァンジェリスト古賀政純の 『オープンソース・Linux超入門』 Linuxサーバーシステム導入前の検討~ RHELを知る ~ 2016年10月26日
[第9回] Linux/OSS エヴァンジェリスト古賀政純の 『オープンソース・Linux超入門』 Linuxサーバーシステム導入前の検討~ Ubuntu Serverを知る ~ 2016年10月19日
[第8回] Linux/OSS エヴァンジェリスト古賀政純の 『オープンソース・Linux超入門』  Linuxサーバーシステム導入前の検討~ SUSEを知る ~ 2016年10月12日
[第7回] Linux/OSS エヴァンジェリスト古賀政純の 『オープンソース・Linux超入門』~「初心者でもわかる、Linuxサーバーシステム活用者が知っておくべきポイント」(後編) 2016年08月09日
最新の情報 - もっと...