highlight

2017年3月8日水曜日

Spark を Ubuntu 16.10 にインストールする

Spark をインストールする。

方針

  • ローカルモードで動かしてみて、Standalone master-slave 方式で動かす。その後 YARN で動かしてみる。
  • YARN で動かすので、Spark History サーバを動かさないと、WebUI での実行履歴が見られない(私が誤解しているかもしれないが)様なので、History サーバは動かす
  • Hive は以前のエントリでセットアップした Metastore サーバを使用する
  • とりあえず spark ユーザは作らず、hadoop ユーザを spark 管理ユーザも代行させる方針。専用ユーザを作ったほうが良さそうなら、改めて設定し直す。

ローカルモードで動かす

hive へのアクセスの仕方を設定するため、hive-site.xml を conf ディレクトリに置く。sudo は省略しているので、適宜補う必要あり。

cd /opt
tar xvzf ~/download/spark-2.1.0-bin-hadoop2.7.tgz
ln -sf spark-2.1.0-bin-hadoop2.7 spark
cd spark/conf
vi hive-site.xml
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
 <property>
  <name>hive.metastore.uris</name>
  <value>thrift://127.0.0.1:9083</value>
 </property>
</configuration>

環境変数 SPARK_HOME を設定する。私は /etc/profile.d に hadoop.sh というファイルを作り、そこで Hadoop 関連の環境変数を纏めて設定しているが、.bashrc で設定するのが好みであれば勿論それで。

この時点で spark-shell を実行してみると、以下のウォーニングメッセージが出力される。

WARN NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
WARN Utils: Your hostname, XXXX resolves to a loopback address: 127.0.1.1; using 10.0.0.X instead (on interface XXXXX)

一行目は hadoop の native ライブラリが見つからないという警告。Hadoop をインストールしたディレクトリに、Native のライブラリがある(私はこのエラーを見るまでそんな事は知らなかったが)ので、そのディレクトリを以下のように指定する。 二行目は多分 ubuntu 特有なのだろうか。/etc/hosts を見ると 127.0.1.1 でホスト名が設定されていて、それが使われている様なので、spark/conf ディレクトリにある spark-env.sh.template を spark-env.sh としてコピーし、以下のように環境変数を適当なところに追加する。

LD_LIBRARY_PATH=/opt/hadoop/lib/native:$LD_LIBRARY_PATH
SPARK_LOCAL_IP=127.0.0.1

この時点で、spark-shellを実行すれば、ローカルモードとして問題なく起動できた。開発環境として、小さなデータで実行確認するだけなら、ローカルモードの構築で十分だと思うが、開発や分析でそれなりに大きなデータを扱うのであれば、実際に分散処理させたい場合もあるだろう。

Standalone モードで動かす

Spark 付属の master-slave で動作する分散処理モード。自前で slave を管理したいときに使うんだろうか?ローカルモードと違って、ログ出力を行うためのディレクトリを用意してやる必要があるようだ。とりあえず、/opt/spark/logs にディレクトリを掘って、/var/log からもシンボリックリンクを貼ってあげよう。

cd /opt/spark
mkdir -m 775 logs
chown hadoop:hadoop logs
cd /var/log
ln -sf /opt/spark/logs spark

/opt/spark/sbin/start-master.sh

これで spark master は起動する。ここで、logs ディレクトリにログファイルが出来ていると思うので中身を見ると、

Master: Starting Spark master at spark://<ホスト名>:7077

という行がある筈。これを spark-shell の --master オプションに指定すればよい。注意すべき点としては、同じホストだからと言って、ループバックの localhost や 127.0.0.1 を指定すると、接続が拒否される。勿論、start-master のコマンドラインに、-h localhost を指定したら、localhost を指定しないと動かないと思う。試してないけど多分。

spark-shell --master spark://<ホスト名>:7077

worker を起動するには、start-master.sh 同様 sbin ディレクトリにある start-slave.sh を使う。このコマンドは $SPARK_HOME/work をワークディレクトリとして使う(-d オプションで指定することも出来る)ので、予めディレクトリを作って、chown, chmod しておくか、SPARK_HOME を hadoop に chown しておこう。

start-slave.sh spark://<ホスト名>:7077

因みにこの時点で 8080 番ポートにブラウザでアクセスすると、spark の状態が閲覧できる。

YARN にクラスタ管理を任せるモード

上のように spark master を動かしていたら、sbin ディレクトリにある stop-all.sh でプロセスを停止させる。動かしてても問題ないかもしれないが未確認。spark-env.sh に HADOOP_CONF_DIR か YARN_CONF_DIR を設定しておく必要がある。

vi /opt/spark/conf/spark-env.sh
HADOOP_CONF_DIR=/etc/hadoop
あとこのまま起動すると、YARN が ERROR client.TransportClient: Failed to send RPC xxxxxxxxxxxxxx to /xxx.xxx.xxx.xx:NNNNN: java.nio.channels.ClosedChannelException java.nio.channels.ClosedChannelException という様なエラーを出力するので、以下のような設定を /etc/hadoop/yarn-site.xml に設定して yarn daemon を再起動する。

 <property>
  <name>yarn.nodemanager.pmem-check-enabled</name>
  <value>false</value>
 </property>
 <property>
  <name>yarn.nodemanager.vmem-check-enabled</name>
  <value>false</value>
 </property>

この解決策は Stackoverflow で見つけたのだが、Yarn のバグレポートに挙がっている様なので、もしかすると将来のバージョンでは解消されるのかもしれない。さて、これで YARN で動くようにはなったが、このままだと WebUI にはアクセス出来ないので、履歴サーバを動かす。spark/conf ディレクトリの spark-defaults.conf.template 元に、以下の項目を設定した spark-defaults.conf ファイルを作り、hdfs に hadoop ユーザ、グループに書き込み権限がある /share/spark/log ディレクトリを作る。

spark.master  yarn
spark.eventLog.enabled  true
spark.eventLog.dir  hdfs://localhost:9000/share/spark/log
spark.serializer  org.apache.spark.serializer.KryoSerializer
spark.history.fs.logDirectory  hdfs://localhost:9000/share/spark/log
sudo su - hadoop
hdfs dfs -mkdir /share
hdfs dfs -mkdir /share/spark
hdfs dfs -mkdir /share/spark/log
hdfs dfs -chmod -R 775 /share
hdfs dfs -chown -R :hadoop /share

設定が終わったら、sbin/start-history-server.sh を実行して動作確認。SparkPi を動かして見る。

spark-submit --class org.apache.spark.examples.SparkPi --master yarn --deploy-mode client examples/jars/spark-examples_2.11-2.1.0.jar

web ブラウザで、http://localhost:18080/ にアクセスしたら Spark の WebUI が観られる。ここまで来たら、systemd の service ファイルを用意したら終わり。

[Unit]
Description=Spark History Service
After=yarn.service
Requires=yarn.service

[Service]
ExecStart=/opt/spark/sbin/start-history-server.sh
ExecStop=/opt/spark/sbin/stop-history-server.sh
RemainAfterExit=yes
WorkingDirectory=/opt/spark
User=hadoop
Group=hadoop

[Install]
WantedBy=multi-user.target

これを /opt/spark/conf/spark-history.service に作ったとして、

cd /etc/systemd/system
ln -sf /opt/spark/conf/spark-history.service
systemctl enable spark-history.service

これで Spark history server は自動起動できる。

余談。Spark には、beeline コマンドが bin ディレクトリに入ってるが、実体の jar は古めの hive なので、新しい Hive パッケージを自前でインストールしていて、そちらの方が使われていないようなら、spark/bin にある方を chmod 644 beeline しておいたほうが良いかもしれない。

0 件のコメント:

コメントを投稿

スパムフィルタが機能しないようなので、コメント不可にしました。

注: コメントを投稿できるのは、このブログのメンバーだけです。