Apache Sparkでスタンドアローンクラスタを構築してscalaを用いて巨大テキスト処理をする

Apache SparkとはHadoopに変わる分散コンピューティングのミドルウエアです。

Hadoopに比べ、ディスクIOを抑えることができ、メモリ内で収まるデータ量の計算なら高速化できるようです。

詳しくはApache Spark で分散処理入門 – Qiitaがわかりやすかったです。

今回はsparkを使った2つサーバーがぶら下がっている分散処理クラスタを構築してscalaを用いてwikipediaの全データを処理してみたいと思います。

今回はこのような構成の上にクラスタを構築します。

masterとslave、両方に同一のユーザー名でログインできるようにしておいてください。

また、masterとslave両方にJDKをインストールしておいてください。

masterにsparkをインストールする

まずはmaster(192.168.1.8)から設定していきます。

masterにsshでログインしたあと、apache sparkをインストールします。

sparkは公式サイトからダウンロードできます。

sparkは実行可能バイナリとして配布されるのでビルドやインストールの必要はありません。

ただ、slaveとインストール先を統一させなければいけないのでルートに近い/opt以下に配置します。

masterの設定をする

masterのsparkの設定ファイルを書き、masterPCを指定します。

続いてslavePCを指定する設定を書きます。

masterからslaveに公開鍵認証sshできるようにする

パスワード認証でも行けるかも?

sparkではmasterからslaveにsshでログインをして指示をします。

とりあえずやりやすいようにslaveのauthorized_keysにmasterのid_rsa.pubを書き込んでmasterからslaveにsshできるようにします。

パスワードなしでmasterからslaveにsshできるようになったらOK。秘密鍵のパスフレーズを聞かれるかもしれないがここらへんをみて省略できるようにしてもいいかもしれないです。

Slaveにsparkをインストールする

つづいてslaveでの作業でになります。

slave上のmasterと全く同じパスにsparkをインストールします。

MasterでSparkの起動

ここまでできたらSparkを起動できます。MasterにログインしてSparkを起動しましょう。

start-master.shを起動すると、http://{master host}:8080でWebUIを表示できるようになります。

さらにMasterからSlaveを起動します。

start-slaves.shを起動したあと、WebUIを見るとクラスタを構成するコンピュータが表示されるはずです。

ScalaでWikipediaを処理するプログラムを書く

Sparkのプログラムはscalaやpython、Rなどでかけます。とりあえずscalaを利用します。

wikipediaのデータをmaster PCにダウンロードしておきましょう。

 

基本的には開発PCでscalaのプログラムを書き、spark-submitコマンドを利用してクラスタにジョブを投げます。

spark-submitコマンドを使うために開発PCにもsparkをインストールします。

scalaプログラムについてはIntellij IDEAで作ることができます。

Intellijにscalaプラグインを入れ、sbtプロジェクトを作ります。

sbtプロジェクトのprojectフォルダ内にplugins.sbtファイルを作り、中身を以下のようにします。

Sparkは単体のjarにコンパイルするのですが上記の設定によっていろいろなリソースもすべて1つのjarになり、sparkで扱いやすくなるそうです。

さらに、プロジェクトのルートディレクトリにbuild.sbtファイルを作り、中身を以下のようにします。

scalaのプログラムを書きます。今回はmain.scala.ConvetLtGtというクラス名にしました。

できたら、build.sbtがあるフォルダでsbtコマンドを実行します。sbtコマンドがない場合はインストールしましょう。

sbt packageでコンパイルできます。

これでtargetディレクトリにjarファイルができます。

あとはこのようなコマンドでsparkにジョブを投げることができます。

このようなスクリプトを用意しておけばコンパイルと実行を同時にできます。

 

実行中のアプリケーションはWeb UIで確認できます。

 

sparkでクラスタ構築した結果、1台のマシンで7分かかる処理が2秒でおわりました。

参考