Apache Mesos ことはじめ

Apache Mesos
==============

[Apache Mesos](http://mesos.apache.org)について。[メイソースと発音するらしい](https://twitter.com/inut/status/525277584972455936)。作業メモでありどなたかにお見せすることを想定して書いていない。解説等を期待される向きは最後に貼りまくったReferencesを参照されたし。

MesosでDockerを動かしてみる
==============

なにはともあれdockerである。

### 環境

- MacOS 10.9.5
- Vagrant x VirtualBox x CentOS 6.5

### 手順

とりあえずテストとしてMesosphereをSingle Nodeで動かしてみる。[ここ](http://mesosphere.com/docs/getting-started/developer/single-node-install/)を参考

#### Mesos, Marathon, Chronosをインストールする

[ここ](https://mesosphere.com/2014/07/17/mesosphere-package-repositories/)を参考

UbuntuとDebian

```sh
# Setup
sudo apt-key adv --keyserver keyserver.ubuntu.com --recv E56151BF
DISTRO=$(lsb_release -is | tr '[:upper:]' '[:lower:]')
CODENAME=$(lsb_release -cs)

# Add the repository
echo "deb http://repos.mesosphere.io/${DISTRO} ${CODENAME} main" | \
  sudo tee /etc/apt/sources.list.d/mesosphere.list
sudo apt-get -y update

# Install packages
sudo apt-get -y install mesos marathon chronos
```

RedHatとCentOS

```sh
# Add the repository
sudo rpm -Uvh http://repos.mesosphere.io/el/6/noarch/RPMS/mesosphere-el-repo-6-2.noarch.rpm

# Install packages
sudo yum -y install mesos marathon chronos
```

#### ZooKeeperをインストールする

```sh
sudo rpm -Uvh http://archive.cloudera.com/cdh4/one-click-install/redhat/6/x86_64/cloudera-cdh-4-0.x86_64.rpm
sudo yum -y install zookeeper
sudo zookeeper-server-initialize --myid=1
# => Using myid of 1
```

Configurationはデフォルトのままでよい。default configurationについて詳しくは[ここ](http://mesosphere.com/docs/getting-started/developer/single-node-install/)を参照

#### もろもろを起動する

Zookeeper起動

```sh
# Ubuntu / Debian
sudo service zookeeper restart
# RedHat / CentOS
sudo zookeeper-server start
# => JMX enabled by default
#    Using config: /etc/zookeeper/conf/zoo.cfg
#    Starting zookeeper ... STARTED
```

mesos master/slave, marathonを起動

```sh
sudo service mesos-master start
sudo service mesos-slave start
sudo service marathon start
```

MesosとMarathonのコンソールにアクセスできることを確認する。5050番と8080番ポートで立ち上がっている(はず)

#### 起動しない

CentOS6.5でzookeeperが起動するところまでは順調に行くものの

```sh
sudo service mesos-master start
# => mesos-master: unrecognized service
sudo service mesos-slave start
# => mesos-slave: unrecognized service
sudo service marathon start
# => marathon: unrecognized service
```

えー。

```sh
ls /etc/init.d/mesos*
# => ls: cannot access /etc/init.d/mesos*: No such file or directory
```

えー。

```sh
which mesos-master
# => /usr/local/sbin/mesos-master
which mesos-slave
# => /usr/local/sbin/mesos-slave
which marathon
# => /usr/local/bin/marathon
```

おや？

```sh
mesos-master start
# => Segmentation fault
```

えー。

```sh
sudo /usr/local/sbin/mesos-master start
```

何も起きない、localhost:5050にアクセスしても何も出ない。  
ソース読まないとだめなの？

#### めんどくさい

困った。何が問題なのだろうと公式のドキュメントを探していたところ

[Virtual Machine Installation using Vagrant](http://mesosphere.com/docs/getting-started/developer/vm-install/)

あれ？

```sh
git clone https://github.com/mesosphere/playa-mesos.git
cd playa-mesos
vagrant up
```

………。

続・MesosでDockerを動かしてみる
==============

そもそもこういうインストール・マニアックスみたいなものを滅ぼすためのInfrastructure as Codeなのであってその最先鋒たるこの周辺で用意されていないはずがないのであり「まずインストールしてみる」みたいな発想から脱出しなければ生き残れないという思いを強くしつつ[Launching a Docker Container on Mesosphere](http://mesosphere.com/docs/tutorials/launch-docker-container-on-mesosphere/)をやってみます。

```sh
# 配布されているVagrantfileから立ち上げたものではパーミッション変更が必要ぽい
chmod u+w /etc/mesos-slave
sudo echo 'docker,mesos' > /etc/mesos-slave/containerizers
sudo echo '5mins' > /etc/mesos-slave/executor_registration_timeout
sudo service mesos-slave restart
```

~/mesos/Docker.jsonを作成

```Docker.json
{
  "container": {
    "type": "DOCKER",
    "docker": {
      "image": "libmesos/ubuntu"
    }
  },
  "id": "ubuntu",
  "instances": "1",
  "cpus": "0.5",
  "mem": "512",
  "uris": [],
  "cmd": "while sleep 10; do date -u +%T; done"
}
```

こいつをcurlで`http://localhost:8080/apps`にPOSTする

```sh
curl -X POST -H "Content-Type: application/json" http://localhost:8080/v2/apps -d@Docker.json
```

`http://localhost:5050/`ではMesosがタスクとリソースの状況を表示してくれていて、`http://localhost:8080/`でMarathonが動かしているコンテナをappとして管理してくれている。

#### しかし

動いていない。

MesosのComplete TasksにStatus:FAILEDのタスクが並びMarathonのAppもInstanceが0/1のまま変化しない。ということは…

```sh
# dockerが入ってないのでは？
which docker
# => /usr/local/bin/docker
# ってことはバージョンが古い？
docker --version
# => Docker version 0.9.1, build 3600720
```

"Docker version 1.0.0 or later needs to be installed on each slave node"とあります通り、アップデートが必要です。

```sh
sudo apt-get update && sudo apt-get install -y docker
```

途中でgrubをインストールするのにパーティションを指定しておくれと言われるのでVBOXのパーティションだけ指定する。インストールできたらcurlコマンドをリトライして…うまくいった！コンテナが動いている。あとはmaster-slaveそれぞれで導入すれば大丈夫そうだ。適当に計算機を集めてきてローカルプチAWSを作れそうだ。こいつのラッパーと実行サポートのCUIツールを書けばよさそう。

というわけでつづく。

References
==============

とりあえず検索して引っかかってきたものを並べて全部読んだ。本番構築の際にはもっとお世話になると思います。ありがとうございます。

- [Launching a Docker Container on Mesosphere](https://mesosphere.com/docs/tutorials/launch-docker-container-on-mesosphere/)
- [An introduction to Apache Mesos - Dailymotion](http://www.dailymotion.com/video/x1ebr8h_an-introduction-to-apache-mesos_tech) (20140303)
- [正月休みだし Mesos 触ってみた](http://blog.livedoor.jp/sonots/archives/35421955.html) (20140104)
- [Fluentd on Mesos + Docker + Marathon](http://tech.riywo.com/blog/2013/12/20/fluentd-on-mesos-plus-docker-plus-marathon/) (20131220)
- [EC2でMesosによるクラスタの自動デプロイを実現するElastic Mesos](http://www.infoq.com/jp/news/2014/01/elastic-mesos) (20140113)
  -  翻訳，原文は[
Elastic Mesos service automates Mesos cluster deployment in EC2](http://www.infoq.com/news/2013/12/elastic-mesos) (20131217)
- [[Spark][Mesos]SparkバッチをMesosの上で動作させる（その１](http://d.hatena.ne.jp/kimutansk/20131129/1385679660) (20131129)
- [[Mesos]Hadoop YARNとApache Mesosの違いって何？](http://d.hatena.ne.jp/kimutansk/20131104/1383496192) (20131104)
- [米Twitterなどでも利用されているクラスタマネージャ「Apache Mesos」、ApacheのTLPに昇格](http://sourceforge.jp/magazine/13/07/25/151500) (20130725)

Related Documents
==============

- Docker
  - [Docker コンテナで InfiniBand を動かす(性能も測定しました)](http://qiita.com/syoyo/items/bea48de8d7c6d8c73435) (20140203)
	- [Docker を理解する - Docker User Guide](http://qiita.com/zembutsu/items/337c04a7003f3a5c4211) (20140723)
	- [VM上のDockerコンテナに固定ipを割り振ってホスト側から接続出来るようにする](http://qiita.com/simota/items/06ad3400224e98d43fc5) (20140801)
- Apache Spark
  - [Apache Spark ドキュメント和訳 - Quick Start](http://qiita.com/mychaelstyle/items/46440cd27ef641892a58) (20140610)
- Resource Manager High Availability
  - [Resource Manager HA の概要と動かし方](http://qiita.com/oza_x86/items/714daf155fc12fe23bd0) (20131211)