夢とガラクタの集積場

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

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

こんにちは。

では、Mesosの環境構築&確認を続けたいと思います。

1. mesos-masterの起動

Mesosをビルドしたディレクトリ配下にMesosがインストールされます。
かつ、シェルを見てみると以下のように「ビルドしたフルパス」が記述されているため、
一度ビルドした後は他の場所に移しにくくなっています。
げふ。

かつ、元のソースコードと同じディレクトリ配下にビルドされたファイルが展開されるため、
どれがどれ・・・というのもわかりにくいですね。
そのあたりは別途改良する必要がありそうです。

尚、起動を行うシェルだけでなく、そこから呼ばれる規模の大きなスクリプトについても
ビルドを行ったディレクトリがかなりの数べた書きされているため、ビルドした後に
まとめて書きかえるというのもかなりリスクが大きな修正になりそう。

そのため、Mesosのインストール方法については大いに改善が必要そうです。

ちなみに「/usr/local/src/mesos-0.13.0/」でビルドを行った場合のファイルを見てみます。
・・・ビルドを行ったタイミングのJVMのバージョンなども固定されてしまっていますね。
これはなかなか。

■/usr/local/src/mesos-0.13.0/bin/mesos-master.sh

. /usr/local/src/mesos-0.13.0/bin/mesos-master-flags.sh

exec /usr/local/src/mesos-0.13.0/src/mesos-master "${@}"

■/usr/local/src/mesos-0.13.0/src/mesos-master

relink_command="(cd /usr/local/src/mesos-0.13.0/src; { test -z \"\${LIBRARY_PATH+set}\" || unset LIBRARY_PATH || { LIBRARY_PATH=; export LIBRARY_PATH; }; }; { test -z \"\${COMPILER_PATH+set}\" || unset COMPILER_PATH || { COMPILER_PATH=; export COMPILER_PATH; }; }; { test -z \"\${GCC_EXEC_PREFIX+set}\" || unset GCC_EXEC_PREFIX || { GCC_EXEC_PREFIX=; export GCC_EXEC_PREFIX; }; }; { test -z \"\${LD_RUN_PATH+set}\" || unset LD_RUN_PATH || { LD_RUN_PATH=; export LD_RUN_PATH; }; }; { test -z \"\${LD_LIBRARY_PATH+set}\" || unset LD_LIBRARY_PATH || { LD_LIBRARY_PATH=; export LD_LIBRARY_PATH; }; }; PATH=/usr/lib64/qt-3.3/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin; export PATH; g++ -g -fno-strict-aliasing -g2 -O2 -o \$progdir/\$file master/mesos_master-main.o  ./.libs/libmesos.so -L/usr/lib/jvm/java-1.7.0-openjdk-1.7.0.25.x86_64/jre/lib/amd64/server -lpthread -lcurl -lssl -lcrypto -lz -lrt -lunwind -pthread -Wl,-rpath -Wl,/usr/local/src/mesos-0.13.0/src/.libs -Wl,-rpath -Wl,/usr/local/lib)"

ともあれ、実際の起動処理を行います。

# cd /usr/local/src/mesos-0.13.0/bin
# ./mesos-master.sh
I1008 06:30:13.229611 13125 main.cpp:114] Build: 2013-10-07 08:25:50 by root
I1008 06:30:13.230156 13125 main.cpp:115] Starting Mesos master
I1008 06:30:13.230264 13145 master.cpp:226] Master started on 192.168.100.241:5050
I1008 06:30:13.230306 13145 master.cpp:241] Master ID: 201310080630-4049905856-5050-13125
W1008 06:30:13.230372 13144 master.cpp:81] No whitelist given. Advertising offers for all slaves
I1008 06:30:13.231439 13145 master.cpp:530] Elected as master!
W1008 06:30:18.231318 13144 master.cpp:81] No whitelist given. Advertising offers for all slaves
W1008 06:30:23.232190 13144 master.cpp:81] No whitelist given. Advertising offers for all slaves
W1008 06:30:28.233189 13144 master.cpp:81] No whitelist given. Advertising offers for all slaves
W1008 06:30:33.234138 13144 master.cpp:81] No whitelist given. Advertising offers for all slaves

とりあえずこれで起動し、Slaveの接続を待ち受けている状態になっているようです。
尚、この段階でMesosのWebUIも起動し、ブラウザで「http://192.168.100.241:5050」にアクセスすると以下の画面が表示されるようになります。

Slaveと実行中のタスク、リソースが管理される画面のようですね。

2. mesos-slaveの起動

では、mesos-slaveを起動してみます。すると。。。。

# cd /usr/local/src/mesos-0.13.0/bin
# ./mesos-slave.sh --master=192.168.100.241:5050
Failed to load unknown flag 'native_library'
Usage: lt-mesos-slave [...]

Supported options:
  --attributes=VALUE                         Attributes of machine
  --[no-]cgroups_enable_cfs                  Cgroups feature flag to enable hard limits on CPU resources
                                             via the CFS bandwidth limiting subfeature.
                                             (default: false)
  --cgroups_hierarchy=VALUE                  The path to the cgroups hierarchy root
                                             (default: /cgroup)
  --cgroups_root=VALUE                       Name of the root cgroup
                                             (default: mesos)
  --cgroups_subsystems=VALUE                 List of subsystems to enable (e.g., 'cpu,freezer')
                                             (default: cpu,memory,freezer)
  --[no-]checkpoint                          Whether to checkpoint slave and frameworks information
                                             to disk. This enables a restarted slave to recover
                                             status updates and reconnect with (--recover=reconnect) or
                                             kill (--recover=kill) old executors (default: false)
  --disk_watch_interval=VALUE                Periodic time interval (e.g., 10secs, 2mins, etc)
                                             to check the disk usage (default: 1mins)
  --executor_registration_timeout=VALUE      Amount of time to wait for an executor
                                             to register with the slave before considering it hung and
                                             shutting it down (e.g., 60secs, 3mins, etc) (default: 1mins)
  --executor_shutdown_grace_period=VALUE     Amount of time to wait for an executor
                                             to shut down (e.g., 60secs, 3mins, etc) (default: 5secs)
  --frameworks_home=VALUE                    Directory prepended to relative executor URIs (default: )
  --gc_delay=VALUE                           Maximum amount of time to wait before cleaning up
                                             executor directories (e.g., 3days, 2weeks, etc).
                                             Note that this delay may be shorter depending on
                                             the available disk usage. (default: 1weeks)
  --hadoop_home=VALUE                        Where to find Hadoop installed (for
                                             fetching framework executors from HDFS)
                                             (no default, look for HADOOP_HOME in
                                             environment or find hadoop on PATH) (default: )
  --[no-]help                                Prints this help message (default: false)
  --ip=VALUE                                 IP address to listen on
  --isolation=VALUE                          Isolation mechanism, may be one of: process, cgroups (default: process)
  --launcher_dir=VALUE                       Location of Mesos binaries (default: /usr/local/libexec/mesos)
  --log_dir=VALUE                            Location to put log files (no default, nothing
                                             is written to disk unless specified;
                                             does not affect logging to stderr)
  --logbufsecs=VALUE                         How many seconds to buffer log messages for (default: 0)
  --master=VALUE                             May be one of:
                                               zk://host1:port1,host2:port2,.../path
                                               zk://username:password@host1:port1,host2:port2,.../path
                                               file://path/to/file (where file contains one of the above)
  --port=VALUE                               Port to listen on (default: 5051)
  --[no-]quiet                               Disable logging to stderr (default: false)
  --recover=VALUE                            Whether to recover status updates and reconnect with old executors.
                                             Valid values for 'recover' are
                                             reconnect: Reconnect with any old live executors.
                                             cleanup  : Kill any old live executors and exit.
                                                        Use this option when doing an incompatible slave
                                                        or executor upgrade!).
                                             NOTE: If checkpointed slave doesn't exist, no recovery is performed
                                                   and the slave registers with the master as a new slave. (default: reconnect)
  --resource_monitoring_interval=VALUE       Periodic time interval for monitoring executor
                                             resource usage (e.g., 10secs, 1min, etc) (default: 5secs)
  --resources=VALUE                          Total consumable resources per slave
  --[no-]strict                              If strict=true, any and all recovery errors are considered fatal.
                                             If strict=false, any expected errors (e.g., slave cannot recover
                                             information about an executor, because the slave died right before
                                             the executor registered.) during recovery are ignored and as much
                                             state as possible is recovered.
                                             (default: false)
  --[no-]switch_user                         Whether to run tasks as the user who
                                             submitted them rather than the user running
                                             the slave (requires setuid permission) (default: true)
  --work_dir=VALUE                           Where to place framework work directories
                                             (default: /tmp/mesos)

・・・・と、見事に起動しません。「Failed to load unknown flag 'native_library'」がエラーメッセージのため、そこから追ってみます。
すると・・・mesosのMLが引っかかりました。
http://mail-archives.apache.org/mod_mbox/mesos-dev/201309.mbox/thread?2
このアーカイブから「Failed to load unknown flag 'native_library'」という投稿を起点とするスレッドを追っていくと情報がありました。

内容としては、以下でした。
・MESOS_NATIVE_LIBRARYという使用されていないフラグを読み込んでエラーとなっている。
 そのため、使用する際にはMESOS_NATIVE_LIBRARYをunsetして使用してほしい。
・mesos-0.14ではこの問題は解消している。
・MESOS_NATIVE_LIBRARYをunsetするとは環境変数から削除するということ
 (起動スクリプトの中で設定している項目を削除する必要がありそう)

尚、この問題は以下のチケットを見るとmesos-0.13でのみ発生するようです。
https://issues.apache.org/jira/browse/MESOS-587

ちなみに、現状0.14は正式リリースはされておらず、Gitを見てみるとTag「0.14.0-rc5」が2時間前の日本時間2013/10/08 05:00位に
切られている・・・という状況。
そのため、0.14を使うのではなくMESOS_NATIVE_LIBRARYを解除する方向で起動できないか試してみます。

まず、MESOS_NATIVE_LIBRARYを使用しているのは以下のファイル。
実質的には「mesos-slave-flags.sh」のexport文をコメントアウトすれば良さそうです。

# cd /usr/local/src/mesos-0.13.0/bin
# grep MESOS_NATIVE_LIBRARY *
mesos-slave-flags.sh:  MESOS_NATIVE_LIBRARY=/usr/local/src/mesos-0.13.0/src/.libs/libmesos-0.13.0.dylib
mesos-slave-flags.sh:  MESOS_NATIVE_LIBRARY=/usr/local/src/mesos-0.13.0/src/.libs/libmesos-0.13.0.so
mesos-slave-flags.sh:export MESOS_NATIVE_LIBRARY
mesos-slave-flags.sh.in:  MESOS_NATIVE_LIBRARY=@abs_top_builddir@/src/.libs/libmesos-@VERSION@.dylib
mesos-slave-flags.sh.in:  MESOS_NATIVE_LIBRARY=@abs_top_builddir@/src/.libs/libmesos-@VERSION@.so
mesos-slave-flags.sh.in:export MESOS_NATIVE_LIBRARY

で、コメントアウトして起動してみると・・・うまく起動します。

# ./mesos-slave.sh --master=192.168.100.241:5050
I1008 07:05:42.516165 13323 main.cpp:119] Creating "process" isolator
I1008 07:05:42.517652 13323 main.cpp:127] Build: 2013-10-07 08:25:50 by root
I1008 07:05:42.517668 13323 main.cpp:128] Starting Mesos slave
I1008 07:05:42.517879 13339 slave.cpp:112] Slave started on 1)@192.168.100.241:5051
I1008 07:05:42.519093 13339 slave.cpp:201] Slave resources: cpus=2; mem=6848; ports=[31000-32000]; disk=39372
I1008 07:05:42.520046 13341 process_isolator.cpp:319] Recovering isolator
I1008 07:05:42.520061 13339 slave.cpp:525] New master detected at master@192.168.100.241:5050
I1008 07:05:42.521939 13339 slave.cpp:540] Postponing registration until recovery is complete
I1008 07:05:42.521946 13341 status_update_manager.cpp:155] New master detected at master@192.168.100.241:5050
I1008 07:05:42.521960 13339 slave.cpp:386] Finished recovery
I1008 07:05:42.524337 13341 slave.cpp:585] Registered with master master@192.168.100.241:5050; given slave ID 201310080630-4049905856-5050-13125-0
I1008 07:06:42.520709 13341 slave.cpp:2501] Current usage 6.64%. Max allowed age: 5.835523331138496days

3台のSlaveを起動すると、WebUI上にも3台分のリソースが表示されるようになっていました。

Disk値が38GBと微妙なことになっていますが、
これは「/」の残容量か、またはmesosをインストールしたマウントの残容量のどちらか。。。のように見えます。

尚、現状の段階で起動しているプロセスは以下のようにmaster1個、slave1個のみ。
何か動かした段階でないとプロセスはこれだけしか存在しないというようですね。

# ps -elf | grep mesos
0 S root     13125 13046  0  80   0 - 121830 futex_ 06:30 pts/0   00:00:01 /usr/local/src/mesos-0.13.0/src/.libs/lt-mesos-master
0 S root     13323 13155  0  80   0 - 121822 futex_ 07:05 pts/1   00:00:00 /usr/local/src/mesos-0.13.0/src/.libs/lt-mesos-slave --master=192.168.100.241:5050

ともあれ、Mesos自体は動作するようになったので今回はここまで。
次回はサンプルのFrameworkを動作させて確認してみます。