S-JIS[2015-07-08] 変更履歴

Asakusa on Spark開発者向けプレビュー版

Asakusa on Sparkの開発者向けプレビュー版のメモ。(→正式版


概要

2015/7/8に、Asakusa Frameworkの実行環境としてApache Sparkを使う機能(開発者向けプレビュー版)が公開された。
プレビュー版なのでバグがあるかもしれないし、今後仕様が変わるかもしれないけど。

正式版の使用方法


開発環境の構築

Asakusa on SparkのAsakusaアプリケーションは、AsakusaFW 0.7.3(Asakusa on Sparkプレビュー版公開時点の最新)を使って開発を行う。
build.gradleにAsakusa on Sparkの設定を追加することで、Spark用の機能が使えるようになる。

以下、EclipseにShafuがインストールされている前提。

  1. Shafuの設定で、Gradleのバージョンを2.2.1にしておく。
  2. 新規プロジェクトを作る場合は、Shafuを使ってAsakusaFW 0.7.3のプロジェクトを作成(テンプレートアーカイブやサンプルアーカイブをダウンロード )する。
    従来のプロジェクトをSpark用に変更する場合は、AsakusaFW 0.7.3にマイグレーションしておく。
  3. build.gradleを書き換える。
    buildscript {
        repositories {
            maven { url 'http://asakusafw.s3.amazonaws.com/maven/releases' }
        }
        dependencies {
    // Gradleプラグインを書き換える
    //      classpath group: 'com.asakusafw', name: 'asakusa-gradle-plugins', version: '0.7.3'
            classpath group: 'com.asakusafw.spark', name: 'asakusa-spark-gradle', version: '0.1.0'
        }
    }
    apply plugin: 'asakusafw'
    apply plugin: 'asakusafw-organizer'
    apply plugin: 'eclipse'
    apply plugin: 'asakusafw-spark' //追加
    // YARNで動かす場合、Hadoopのバージョンを2系に変更する
    asakusafw {
        asakusafwVersion '0.7.3-hadoop2'
    
        modelgen {
            modelgenSourcePackage 'com.example.modelgen'
        }
        compiler {
            compiledSourcePackage 'com.example.batchapp'
        }
    }
    
    //ついでに単体テストでスモールジョブ実行エンジンを使う設定も入れておく
    dependencies {
        compile group: 'com.asakusafw.sdk', name: 'asakusa-sdk-core', version: asakusafw.asakusafwVersion
        compile group: 'com.asakusafw.sdk', name: 'asakusa-sdk-directio', version: asakusafw.asakusafwVersion
        compile group: 'com.asakusafw.sdk', name: 'asakusa-sdk-windgate', version: asakusafw.asakusafwVersion
        testRuntime group: 'com.asakusafw.sdk', name: 'asakusa-sdk-test-emulation', version: asakusafw.asakusafwVersion
    
        provided (group: 'org.apache.hadoop', name: 'hadoop-client', version: '1.2.1') {
            exclude module: 'junit'
            exclude module: 'mockito-all'
            exclude module: 'slf4j-log4j12'
        }
    }
  4. Shafuを使ってEclipseプロジェクトの再構成を行う。

コンパイル方法

開発環境にはSparkやScalaをインストールしておく必要は無い。
(Scalaのソースを生成するわけではないので、scalac等のコンパイラーは必要ない。コンパイルすると、バイトコードをclassファイルに直接出力しているらしい?!)

Gradleを使ってSpark用のコンパイルを行う。
(ただし、デプロイメントアーカイブを作れば自動的にSpark用のコンパイルも行われるので、普通はこの作業は不要)

$ ./gradlew sparkCompileBatchapps

$ ls build/spark-batchapps/		←出来上がったバッチの確認
spark.example.summarizeSales

コンパイルされたバッチディレクトリー名(バッチ名)は、Batch DSLで付けた名前に接頭辞「spark.」が付いたものになる。
(Batch DSL上の名前が「example.summarizeSales」の場合、「spark.example.summarizeSales」となる)


接頭辞を変えたい場合は、build.gradleにspark.batchIdPrefixの設定を追加する。(規約プロパティ拡張を参照)

asakusafw {
    asakusafwVersion '0.7.3-hadoop2'

    modelgen {
        modelgenSourcePackage 'com.example.modelgen'
    }
    compiler {
        compiledSourcePackage 'com.example.batchapp'
    }
    spark {
        batchIdPrefix 'spark.'
    }
}

生成されたバッチディレクトリー中には以下のようにYAESSで実行するためのjarファイルや設定ファイルが入っている。

   spark.example.summarizeSales
   ├─etc
   │  │  build.log
   │  │  yaess-script.properties
   │  │
   │  └─inspection
   │          dsl.json
   │          task.json
   │
   └─lib
           jobflow-byCategory.jar

従来のHadoop用のバッチディレクトリーの場合、opt/dsl-analysisというディレクトリーも作られ、その中にGraphviz用のdotファイルが生成されていた。(→ジョブフローの可視化
Spark版の場合、Graphviz用のファイルは生成されないが、dsl.jsonやtask.jsonがその情報を持っている。(ので、それを上手く解析すればフローを生成できるらしい^^;)
また、jobflow-byCategory.jarの中にMETA-INF/asakusa-spark/plan.jsonというファイルもある。


デプロイメントアーカイブの生成

Gradleのassemble(あるいはShafuの「Asakusaデプロイメントアーカイブを生成」)を実行すると、Spark用のバッチコンパイルも自動的に行われる。
つまり、生成されるデプロイメントアーカイブには、Hadoop用のバッチとSpark用のバッチが両方とも含まれる状態になる。

$ ./gradlew assemble

$ ls build/*.tar.gz		←生成されたアーカイブファイルの確認
build/asakusafw-0.7.3-hadoop2.tar.gz

どちらかのバッチしか作らなくていい場合は、assembleの依存タスクであるコンパイルタスク(compileBatchappかsparkCompileBatchapps)を抑制すればいい。

Sparkバッチのみ生成(Hadoopバッチの生成を抑制)する例

$ ./gradlew assemble -x compileBatchapp -x attachBatchapps_prod

Spark用バッチを作る対象クラスを指定することも出来る。
build.gradleにspark.incluespark.excludeを設定する。(規約プロパティ拡張を参照)

asakusafw {
    asakusafwVersion '0.7.3-hadoop2'

    modelgen {
        modelgenSourcePackage 'com.example.modelgen'
    }
    compiler {
        compiledSourcePackage 'com.example.batchapp'
    }
    spark {
        include 'com.example.batch.SummarizeBatch'
    }
}

バッチの実行方法

デプロイメントアーカイブを運用環境のクライアントマシン上で解凍すると、YAESSを使ってHadoopバッチあるいはSparkバッチを実行できる。
example.summarizeSalesというバッチの場合、batchappsディレクトリーの下に「example.summarizeSales」と「spark.example.summarizeSales」という2種類のディレクトリーがある。YAESSからはこのディレクトリー名を指定する)

Sparkバッチを実行するためには、バッチを実行するクライアントマシン上にSparkがインストールされている必要がある。
→Asakusa on Spark ユーザガイドのSparkのセットアップ

Sparkの実行モード(Sparkスタンドアローンとかyarn-clusterとかyarn-clientとか)は、Sparkのデフォルト設定が使われる。
($SPARK_HOME/conf/spark-defaults.conf等のspark.masterで設定する)

バッチをHadoopで実行する場合(従来通りのバッチ)

$ cd $ASAKUSA_HOME
$ yaess/bin/yaess-batch.sh example.summarizeSales -A date=2011-04-01

バッチをSparkで実行する場合

$ cd $ASAKUSA_HOME
$ yaess/bin/yaess-batch.sh spark.example.summarizeSales -A date=2011-04-01

なお、$ASAKUSA_HOME/spark/conf/spark.propertiesにタスク分割数(com.asakusafw.spark.parallelism)等をきちんと設定してやらないとパフォーマンスが出ない。
Asakusa on Sparkの最適化設定


ちなみに、batchappsの下のSpark用バッチのディレクトリー名を改名し、その変更した名前をYAESSの引数に渡して実行することも出来る。
(ただし、コンパイル時点で設定ファイル内にSpark版のバッチ名が書かれているようなので、ログとかに出るバッチ名は変わらないかも)

$ cd $ASAKUSA_HOME/batchapps
$ rm -rf example.summarizeSales
$ mv spark.example.summarizeSales example.summarizeSales
$ cd $ASAKUSA_HOME
$ yaess/bin/yaess-batch.sh example.summarizeSales -A date=2011-04-01	←Spark版バッチが動く

Asakusa on Sparkへ戻る / AsakusaFW目次へ戻る / 技術メモへ戻る
メールの送信先:ひしだま