Symfoware

Symfowareについての考察blog

Apache Sparkのクラスタ構築手順(Spark Standalone Mode使用)

Apache Sparkをいじってみてます。

Apache Spark を Debian 7(wheezy)にインストール
Apache Spark をPythonで操作する(pyspark)
Apache Spark spark-shell起動時のログの警告に対処する(log4j.properties)
Apache Spark の Web UI


本来、分散処理フレームワークなので、クラスタ構成を構築してみます。



Spark Standalone Mode



クラスタの構築は

・EC2
・Mesos(バージョン0.9からは未対応?)
・YARN(今後の主流?)

など複数の選択肢から選べるようですが、今回は一番構築がお手軽そうな
「Spark Standalone Mode」を選択しました。

Spark Standalone Mode
こちらを参考に構築していきます。

※結構はまったので、手順が漏れているかもしれません。





環境



Debian 7のサーバーを2台仮想で用意しました。

masterサーバー(192.168.1.3)
slaveサーバー(192.168.1.5)

ドキュメントを見てみると、各々のサーバーにSparkをインストールする必要はないようです。

masterサーバー(192.168.1.3)に以下の手順でSparkをインストールしました。
Apache Spark を Debian 7(wheezy)にインストール

インストールディレクトリは「/opt/spark-0.8.1-incubating」になります。








masterサーバー(192.168.1.3)の設定



まず、Sparkをインストールしたmasterサーバーでの作業手順から。


Sparkのインストールディレクトリに移動して、「./make-distribution.sh」を実行します。


master# ./make-distribution.sh




これで、/opt/spark-0.8.1-incubatingの「dist」に実行に必要な資産を集めた
ディレクトリが作成されます。

今後、この「/opt/spark-0.8.1-incubating/dist」で作業を行います。



・spark-env.shの作成

/opt/spark-0.8.1-incubating/dist/conf/spark-env.sh.templateをコピーして、
/opt/spark-0.8.1-incubating/dist/conf/spark-env.shを作成します。


master# cd /opt/spark-0.8.1-incubating/dist
master# cp conf/spark-env.sh.template conf/spark-env.sh




内容を編集


master# vi conf/spark-env.sh




最低限必要なのは、SPARK_MASTER_IPの指定です。
masterとなるサーバー、今回は192.168.1.3のIPアドレスを指定します。


#!/usr/bin/env bash

# This file contains environment variables required to run Spark. Copy it as
# spark-env.sh and edit that to configure Spark for your site.
#
# The following variables can be set in this file:
# - SPARK_LOCAL_IP, to set the IP address Spark binds to on this node
# - MESOS_NATIVE_LIBRARY, to point to your libmesos.so if you use Mesos
# - SPARK_JAVA_OPTS, to set node-specific JVM options for Spark. Note that
# we recommend setting app-wide options in the application's driver program.
#     Examples of node-specific options : -Dspark.local.dir, GC options
#     Examples of app-wide options : -Dspark.serializer
#
# If using the standalone deploy mode, you can also set variables for it here:
# - SPARK_MASTER_IP, to bind the master to a different IP address or hostname
# - SPARK_MASTER_PORT / SPARK_MASTER_WEBUI_PORT, to use non-default ports
# - SPARK_WORKER_CORES, to set the number of cores to use on this machine
# - SPARK_WORKER_MEMORY, to set how much memory to use (e.g. 1000m, 2g)
# - SPARK_WORKER_PORT / SPARK_WORKER_WEBUI_PORT
# - SPARK_WORKER_INSTANCES, to set the number of worker processes per node

SPARK_MASTER_IP=192.168.1.3






・slavesの作成

/opt/spark-0.8.1-incubating/conf/slavesファイルを、
/opt/spark-0.8.1-incubating/dist/conf/slavesにコピーします。


master# cp /opt/spark-0.8.1-incubating/conf/slaves /opt/spark-0.8.1-incubating/dist/conf/slaves




内容を編集


master# vi /opt/spark-0.8.1-incubating/dist/conf/slaves




ファイルには最初「localhost」とだけ記載されていると思います。
slaveとなる192.168.1.5を追記します。


# A Spark Worker will be started on each of the machines listed below.
localhost
192.168.1.5






・password-less ssh接続の設定

masterサーバーからslaveに起動命令を実行するとき、sshコマンドが使用されます。

※後から知りました。slaveサーバーで個別にコマンドを実行するなら、この作業は不要。

bashからsshコマンドを実行した時パスワード入力で止まらないようにするため、
上記slavesファイルに記載したサーバーにはパスワード無しでsshログインできるようにしておきます。
対象には、localhostも含みます。


password-less ssh接続は別途調べておきました。
ssh接続時パスワードを入力しない、password-less ssh接続の設定方法

ssh-keygenとssh-copy-idを使用して、パスワード無しでslaveの
localhost
192.168.1.5
に接続できるようにしておきます。


これで、一旦masterサーバーでの作業は終了です。







slaveサーバー(192.168.1.5)の設定



これからは、slaveサーバー(192.168.1.5)の設定を行います。

slaveには、まずJavaのインストールを行います。


slave# apt-get -y install openjdk-7-jdk




次に、masterサーバーで「./make-distribution.sh」を実行して作成した
「dist」フォルダをmasterと全く同じディレクトリ構成
「/opt/spark-0.8.1-incubating/dist」にコピーします。

じゃないと、masterからssh経由でのslave起動に失敗します。


最初、自動でmasterに作成したdistフォルダがコピーされるんだろと思っていたのですが、
どうもそういう訳では無いようです。
※ここはなにか勘違いしているかも。


slave側(192.168.1.5)の手順はこれだけです。
master側(192.168.1.3)に戻って起動を試してみます。







masterサーバー(192.168.1.3)でSparkの起動



masterサーバーに戻って来ました。
「/opt/spark-0.8.1-incubating/dist」に移動します。


master# cd /opt/spark-0.8.1-incubating/dist




「bin/start-master.sh」で起動。


master# bin/start-master.sh




これでマスターが起動しました。
ブラウザでhttp://(masterサーバーのIP):8080/を表示すると、こんな画面が表示されます。

262_01.png



続いて「bin/start-slaves.sh」でslaveの起動です。


master# bin/start-slaves.sh


slaveが起動した後、ブラウザをリロードしてみます。
ちゃんと2つのノードが認識されました。

262_02.png







pysparkから接続



pythonのシェルでこのクラスタに接続してみます。

Apache Spark をPythonで操作する(pyspark)
通常の場合は、「./pyspark」を実行するだけでしたが、
クラスタに接続する場合は、
「MASTER=spark://masterサーバーIP:7077 ./pyspark」
となります。


master# cd /opt/spark-0.8.1-incubating/dist
master# MASTER=spark://192.168.1.3:7077 ./pyspark




シェルが起動したら、ブラウザを再度リロードしてみます。
「Running Applications」に「PySparkShell」が追加されていると思います。

262_03.png

262_04.png

クラスタの一部を間借りしてるというか、なんか気持ちいいです。







解析対象のテキストファイルの扱い



共有ストレージでなく、ローカルHDDに保存しているテキストファイルも解析可能です。
ただし、同じパスにファイルが存在している必要があります。

動作確認のため、各々のサーバーに/tmp/test.txtを作成しました。

あえて内容は異なるものにしています。

master側

A master
B master
C master



slave側

A slave
B slave
C slave




PySparkShellで、「A」が登場する行を数えてみました。


  1. Using Python version 2.7.3 (default, Jan 2 2013 13:56:14)
  2. Spark context avaiable as sc.
  3. >>> logData = sc.textFile('/tmp/test.txt')
  4. >>> lines = logData.filter(lambda s: 'A' in s)
  5. >>> num = lines.count()
  6. >>> print(num)
  7. 1




違うファイルだから「2」って表示されるかな?と思っていましたが、やはり1となります。


slaveの/tmp/test.txtをちょっと編集。

C slave
B slave
A slave



AとCの位置を入れ替えてみました。
同じソースを実行すると、


  1. >>> logData = sc.textFile('/tmp/test.txt')
  2. >>> lines = logData.filter(lambda s: 'A' in s)
  3. >>> num = lines.count()
  4. >>> print(num)
  5. 0



今度は0になりました。


まあ、解析対象のファイルはHadoopか共有ストレージに置いとけってことですね。




関連記事

テーマ:サーバ - ジャンル:コンピュータ

  1. 2013/12/31(火) 17:09:25|
  2. Scala
  3. | トラックバック:0
  4. | コメント:0
  5. | 編集
<<Apache Hadoop 2.2.0 を Debian 7にインストールする | ホーム | ssh接続時パスワードを入力しない、password-less ssh接続の設定方法>>

コメント

コメントの投稿


管理者にだけ表示を許可する

トラックバック

トラックバック URL
https://symfoware.blog.fc2.com/tb.php/1195-ddf91de6
この記事にトラックバックする(FC2ブログユーザー)