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を動作させて確認してみます。