Blog


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秒でおわりました。

参考




Spark IDEの設定(Intellij)




cakephpでtodoアプリを作る

cakephp todoapp tutorial

 

参考

 

CakePHPでBakeしてみる

 

install

 

create new app

 

run develop server

 

create sqlite3 db

create db

 

create user table

 

create task table

 

edit condigure db

config/app.phpを編集

DS=DirectorySeparator

 

create model controller template

 

パスワードのハッシュ化

参考

 

 

ユーザー認証なしで実行できるアクションメソッドを指定

UsersControllerのuseの部分に追記

 

UsersControllerクラスに追加

 

ログイン処理の実装

AppControllerのinitializeメソッドでloadComponentする

 

UsersControllerクラスにメソッドを追加

これらのメソッドにpostすることでログインやログアウトができる

 

ログインしてるかどうかはuserメソッドで判定する。以下をindexアクションメソッドに追加

 

ログインフォームはこんな感じでつくる

 

ログアウトフォーム

 

ログインしているかどうかを表示

 

タスクリストの実装

TasksControllerのuse部分に以下を記述

 

class内にメソッドとして以下記述

 

addメソッドでは、現在ログイン中のユーザーのタスクとして登録できるようにする

 

indexメソッドではログイン中のユーザーIDのタスクのみ表示する

 

view、edit、deleteメソッドではタスクを登録したユーザー以外のタスクの操作を禁止する

 




cakephp

新規プロジェクトの作成

 

開発サーバーの起動

 

本番サーバーには

 

 

静的コンテンツ

webrootディレクトリ以下に置こう

http://localhost:8765/css/base.css




php-install

php

なんとかしろ

 

composer

公式のインストールスクリプトを実行するかapt-getを利用

 

 

extension

とりあえずcake-phpを使うのに必要なモジュールをいれる