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がインストールされている前提。
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' } }
開発環境には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)を抑制すればいい。
$ ./gradlew assemble -x compileBatchapp -x attachBatchapps_prod
Spark用バッチを作る対象クラスを指定することも出来る。
build.gradleにspark.inclue
やspark.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
で設定する)
$ cd $ASAKUSA_HOME $ yaess/bin/yaess-batch.sh example.summarizeSales -A date=2011-04-01
$ 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版バッチが動く