Asakusa FrameworkをScalaで記述してみるAfwHS α版の使用(インストール)方法。
AfwHSを試す手順について。
afwhs-runtime.jar | (151kB) | 生成・実行する為のライブラリー。 | [/2011-09-16] |
afwhs-driver.jar | (10.0kB) | モデルのラッパーを生成する為のドライバー。 | [/2011-09-04] |
現状では、AsakusaFW 0.2.1・Scala 2.9.1で試している。[/2011-09-03]
ASAKUSA_HOME/ext/libにafwhs-runtime.jarを格納する。
これはAsakusaFWのプログラム(ジョブフローのテスト等)の実行時に使われる。
HADOOP_HOME/libにScalaのライブラリー(scala-library.jar)を格納する。
これはAsakusaFW上すなわちHadoop上で、Scalaで作った関数を実行することになるので必要。
まず、AsakusaFWの空プロジェクト(Eclipseのプロジェクト)を作る。
このプロジェクト内にAsakusaFWのプログラムを記述する。(Scalaプロジェクトから自動生成されるソースを格納することになる)
次に、同じワークスペース上にScalaのプロジェクト(Eclipseのプロジェクト)を作る。
このプロジェクト内にAfwHS用のプログラムを記述する。
このプロジェクトで使用するライブラリー・プロジェクトをビルドパスに追加しておく。
種類 | 追加するもの | 説明 |
---|---|---|
プロジェクト | AsakusaFWプロジェクト | AsakusaFWプロジェクト上に生成するモデルクラスをそのまま使用する為。 |
ライブラリー | afwhs-runtime.jar | AfwHSのライブラリー。 |
asakusa-runtime-0.2.1.jar asakusa-thundergate-vocabulary-0.2.1.jar asakusa-dsl-vocabulary-0.2.1.jar |
AsakusaFWのライブラリー。 モデルクラスはAsakusaFWのインターフェースやらアノテーションやらを実装している為。 |
|
hadoop-core-0.20.2-cdh3u0.jar | Hadoopのコアライブラリー。 モデルクラスはWritableを実装している為。 |
<classpathentry kind="var" path="M2_REPO/com/asakusafw/asakusa-runtime/0.2.1/asakusa-runtime-0.2.1.jar" sourcepath="M2_REPO/com/asakusafw/asakusa-runtime/0.2.1/asakusa-runtime-0.2.1-sources.jar"/> <classpathentry kind="var" path="M2_REPO/com/asakusafw/asakusa-thundergate-vocabulary/0.2.1/asakusa-thundergate-vocabulary-0.2.1.jar" sourcepath="M2_REPO/com/asakusafw/asakusa-thundergate-vocabulary/0.2.1/asakusa-thundergate-vocabulary-0.2.1-sources.jar"/> <classpathentry kind="var" path="M2_REPO/com/asakusafw/asakusa-dsl-vocabulary/0.2.1/asakusa-dsl-vocabulary-0.2.1.jar" sourcepath="M2_REPO/com/asakusafw/asakusa-dsl-vocabulary/0.2.1/asakusa-dsl-vocabulary-0.2.1-sources.jar"/> <classpathentry kind="var" path="M2_REPO/org/apache/hadoop/hadoop-core/0.20.2-cdh3u0/hadoop-core-0.20.2-cdh3u0.jar" sourcepath="M2_REPO/org/apache/hadoop/hadoop-core/0.20.2-cdh3u0/hadoop-core-0.20.2-cdh3u0-sources.jar"/>
続いて、AsakusaFWプロジェクトの設定を行う。
種類 | 追加するもの | 説明 |
---|---|---|
ライブラリー | afwhs-runtime.jar | AfwHSのライブラリー。自動生成されたクラスが参照する為。 |
scala-library.jar | Scalaのライブラリー。(SCALA_HOME/libの下にある) |
追加するもの | 説明 |
---|---|
<java classname="com.asakusafw.dmdl.java.Main" classpath="${compile_classpath}" fork="true" failonerror="true">
〜
<arg value="-plugin" />
<arg value="C:\〜\afwhs-driver.jar" />
<jvmarg value="-Dafwhs.model.wrapper.dir=C:\workspace\Scalaプロジェクト\src\〜\modelgen\dmdl\model" />
</java>
|
DMDL生成のプラグインにafwhs-driver.jarを追加する。 これでScala用ラッパークラスが生成される。 生成場所はVM引数で指定する。 |
最初は普通にDMDLを定義し、モデルクラス生成を行う。
> mvn generate-resources
すると、Scala用ラッパークラスのソースファイルも自動的に生成される。
(システムプロパティーafwhs.model.wrapper.dirで指定された場所に作られる。なお、ディレクトリーは先に作っておく必要がある)
これらのモデルクラス・ラッパークラスを使用してAfwHSのプログラムを作成する。
→コーディング例
出来上がったら、AsakusaFWのソース生成を行う。
val gen = new Generator("C:/workspace", "afwhs-wordcount", "sample.wordcount", "WordCount") val r = run(gen.newSource()) gen.out(r) gen.prepareGenerate() //生成準備 gen.generateOperator() gen.generateImporter() gen.generateExporter() gen.generateFlow() gen.generateFlowTest()
引数名 | 例 | 説明 |
---|---|---|
workspace | C:/workspace | 生成先(AsakusaFWプロジェクト)のワークスペースの場所。 |
project | afwhs-wordcount | 生成先(AsakusaFWプロジェクト)のプロジェクト名(ディレクトリー名)。 |
basePackage | sample.wordcount | 生成先(AsakusaFWプロジェクト)のパッケージ名。 |
baseName | WordCount | 生成するクラス・ファイルに付けられる主たる名前。 (例えば生成されるジョブフローのクラス名は「WordCountJob」になる) |
メソッド | 説明 | 更新日 |
---|---|---|
newSource | 入力データを表すSourceオブジェクトを生成する。 引数で入力の変数名やファイルのパスを指定できる。 |
2011-09-03 |
out | 出力データを表すSourceオブジェクトを受け取る。 | |
prepareGenerate |
生成の為の初期化を行う。 Sourceの変数名の決定など。 |
2011-09-03 |
generateOperator | OperatorクラスのJavaソースファイルを生成する。 デフォルトではファイルが存在したら上書きする。 |
2011-08-31 |
generateImporter | FileImporterクラスのJavaソースファイルを生成する。 デフォルトではファイルが存在したら何もしない。 |
2011-08-31 |
generateExporter | FileExporterクラスのJavaソースファイルを生成する。 デフォルトではファイルが存在したら何もしない。 |
2011-08-31 |
generateFlow | JobFlowクラスのJavaソースファイルを生成する。 デフォルトではファイルが存在したら上書きする。 |
2011-08-31 |
generateFlowTest | JobFlowクラスのテスト用Javaソースファイルを生成する。 デフォルトではファイルが存在したら何もしない。 |
2011-08-31 |
コンパイルするまでは上記で充分だが、実行するためには、Scalaプロジェクトをjarファイル化してASAKUSA_HOME/ext/libに格納する必要がある。
実際の実行では、Scalaプロジェクトで作ったScalaの関数オブジェクトがそのまま呼ばれる為。
なお、この「Scalaの関数を呼ぶ」部分でリフレクションを使ってインスタンス生成しているので少々怪しい(爆)
(TODO:JavaプログラムからScalaの関数を呼ぶ正式なやり方があるか?)