Apache MesosをAzureに導入

Apache Mesosを試してみたくなり、Ubuntu 14.04にApache Mesos 1.0.0を導入してみました。

なお導入作業はMicrosoft Azure上で行っていますが、Ubuntu 14.04であれば他の環境でも再現可能かと思います。

Azure Virtual Machineの作成

サイズはStandard DS2 v2で作成。

Azureでは仮想マシンの作成方法に、「仮想マシン(クラシック)」と「Virtual machines」があります。

単純に仮想マシンを構築するだけの場合は、両者には違いがそれ程無いように見えますが、管理をしようと思うとかなり異なってきます。

今回はリソースマネージャによる管理を行う事にしました。

インストール作業

ウェブサイトにあるGetting Startedを素直に実行するだけですが0.28.2をビルドしている時にcgroupとlinux-toolsが不足していたような気がしたので、それらも追加インストールしておきます。

パッケージのインストール

sudo apt-get update
sudo apt-get install -y tar wget git
sudo apt-get install -y openjdk-7-jdk
sudo apt-get install -y autoconf libtool
sudo apt-get install -y build-essential
sudo apt-get install -y python-dev libcurl4-nss-dev
sudo apt-get install -y libsasl2-dev libsasl2-modules maven libapr1-dev libsvn-dev

sudo apt-get install -y libcgroup-dev cgroup-bin
sudo apt-get install -y linux-tools-common linux-tools-generic linux-tools-`uname -r`

ソースを取得して展開

cd /home/azureuser
wget http://www.apache.org/dist/mesos/1.0.0/mesos-1.0.0.tar.gz
tar -zvxf mesos-1.0.0.tar.gz

ビルドとテスト

cd mesos-1.0.0
mkdir build
cd build
../configure
make
make check

ビルド後のチェックが通っていれば完成しています。

動作テスト

# master
./bin/mesos-master.sh --ip=127.0.0.1 --work_dir=/var/lib/mesos
# agent
./bin/mesos-agent.sh --master=127.0.0.1:5050 --work_dir=/var/lib/mesos
# frameworkのテスト実行
./src/examples/python/test-framework 127.0.0.1:5050

インストール

make install

インストールをしなくても、前述した動作テストと同じ事をすればひとまず使用する事は出来ますが、インストールする事でmesosコマンドによる管理が行える様になります。

ビルド前のconfigure時にprefixを指定しなかった場合は、以下の場所にmesosが展開されます。

  • /usr/local/lib … mesosライブラリ
  • /usr/local/lib/mesos/modules … mesosが使用するライブラリ
  • /var/local/etc/mesos … mesosの設定スクリプト
  • /usr/local/sbin … mesosの実行スクリプト
  • /usr/local/share/mesos … WebUI用のファイル等

インストール後の設定

インストールしただけでは、まだ必要な設定がされていない為、環境にあわせて設定を行います。

まず/usr/local/libをライブラリ検索パスに追加します。

# 一時的に追加する場合
sudo /sbin/ldconfig /usr/local/lib

# 恒久的に追加する場合は/etc/ld.so.conf.d/libc.conf等に/usr/local/libを追加
sudo /sbin/ldconfig
mesos-master用の設定
  1. /usr/local/etc/mesos にあるmesos-master-env.sh.templateをコピーし、mesos-master-env.shを作成します。
  2. mesos-master-env.shを開き、必要な設定値を追記します。
# This file contains environment variables that are passed to mesos-master.
# To get a description of all options run mesos-master --help; any option
# supported as a command-line option is also supported as an environment
# variable.

# Some options you're likely to want to set:
# export MESOS_log_dir=/var/log/mesos

export MESOS_ip=0.0.0.0
export MESOS_work_dir=/var/lib/mesos
mesos-agent用の設定
  1. /usr/local/etc/mesos にあるmesos-agent-env.sh.templateをコピーし、mesos-agent-env.shを作成します。
  2. mesos-agent-env.shを開き、必要な設定値を追記します。
# This file contains environment variables that are passed to mesos-agent.
# To get a description of all options run mesos-agent --help; any option
# supported as a command-line option is also supported as an environment
# variable.

# You must at least set MESOS_master.

# The mesos master URL to contact. Should be host:port for
# non-ZooKeeper based masters, otherwise a zk:// or file:// URL.
#export MESOS_master=unknown-machine:5050
export MESOS_master=127.0.0.1:5050
export MESOS_work_dir=/var/lib/mesos

# Other options you're likely to want to set:
# export MESOS_log_dir=/var/log/mesos
# export MESOS_work_dir=/var/run/mesos
# export MESOS_isolation=cgroups

起動方法

起動は以下の様に行います。

# masterを起動する場合
mesos daemon.sh mesos-master

# agentを起動する場合
mesos daemon.sh masos-agent

幾つかのコマンドについてはpythonで実装されているので、PYTHONPATHにmesos関係のモジュールが配置されている場所を追加する必要があります。

Azure Resource Explorerを使用した複製

ビルドしたmesosはmasterとagentの両方ですので、起動するスクリプトでどちらにもなれます。

mesosは一台の環境内にmaster(agentを監視するサーバー)とagentを構成する事も出来ますので、mesos自体のテストをする事が出来るのですが、ここでは複数台の構成を行います。

 

複数台構成するには、個々にVirtual Machinesを立ち上げて前述したビルドを行えば良いのですが、Azure Resource Explorerを使用する事で容易に複製が可能です。

複製作業

注意:以下の作業を行うと対象のVMは起動させる事が出来なくなります。

  1. 対象のVMを停止させる。
  2. Azure Resource Explorerを開き、先程作成したVirtual Machineを探す。
  3. Azure Resource Explorerのモードを”Read/Write”に変更する。
  4. generalizeをクリック。
  5. captureに必要な項目(vhdPrefix, destinationContainerName, overwriteVhds)を記入。
  6. captureをクリック。
capture時に以下の様な項目を入力した場合、
{
    "vhdPrefix": "mesosimage",
    "destinationContainerName": "mesosvhds",
    "overwriteVhds": "true"
}
リソースマネージャ内のBLOBにvhdsと展開時に使用可能なテンプレートが出力されます。
http://{{storage account}}.blob.core.windows.net/system/Microsoft.Compute/Images/mesosvhds/mesosimage-{{元のvhds名}}

.

複製完了後に以下の手順でVirtual Machineを展開します。

  1. AzurePortalを開き、新規を選択。
  2. テンプレートのデプロイを選択。
  3. capture時に生成されたテンプレート内容を編集画面にペースト。
  4. vhd項目のuriを修正(この部分は個々のVMで異なる名称を設定する必要があります)。
  5. 保存。

保存を押すと、テンプレート内にあるparametersの記入が促されます。

テンプレートの作成前に、ネットワークインターフェスを作成しておく事をお勧めします。

可用性セットについてもここで指定が可能です。

自分の場合はリソースグループ内にはこのような構成を事前にしておきました。

  • 可用性セット
    • availability-masters
    • avaliability-agents
  • 仮想ネットワーク
    • network-mesos
    •  ネットワークセキュリティグループ
      • net-sec-master
      • net-sec-agent
    •  ネットワークインターフェース
      • netif-master01(10.0.0.8)
      • netif-master02(10.0.0.9)
      • netif-agent01
      • netif-agent02
  •  パブリックIPアドレス
    • addr-public-master
    • addr-public-master01
  • ロードバランサ
    • lb-public
    • バックエンドアドレスプール
      • lb-public-master
  • ストレージアカウント
    • storagemesos

Apache Sparkの導入

Apache sparkをmesos上で動かすにはオフィシャルからバイナリをダウンロードしてくるのが最も容易です。クラスタのリソース管理はmesosが行うため、Sparkを使うだけであればHadoopもYARNも不要です。

  • Apache SparkをオフィシャルサイトのDownloadページから取得する。(ダウンロードしてくるものがわからなければ、Pre-build for Hadoop 2.7 and latorを取得)
  • すべてのクラスタからアクセスできる場所にプログラムを配置。(httpやhdfs、Amazon s3といった共有ストレージに配置をしますが、自分はローカルのウェブサーバーにファイルを配置しました。)
  • 任意の場所にSparkを展開。

Apache Sparkを対話モードで起動

export SPARK_EXECUTOR_URI=http://127.0.0.1/spark-2.0.0-bin-hadoop2.7.tgz
export MESOS_NATIVE_JAVA_LIBRARY=/usr/local/lib/libmesos.so

cd {{spark-2.0.0 install dir}}

# spark shell(scala)
./bin/spark-shell --master=mesos://{{mesos-master address}}:5050

# spark shell(python)
./bin/pyspark --master=mesos://{{mesos-master address}}:5050

動作テスト

val hFile = sc.textFile("/var/www/html/index.html")
val filter = hFile.filter(_.contains("href"))
println(filter.count)

.