S-JIS[2011-08-28/2011-09-16] 変更履歴

AfwHS使用方法

Asakusa FrameworkScalaで記述してみるAfwHS α版の使用(インストール)方法。


使い方

AfwHSを試す手順について。

  1. 全体の前準備
    1. ASAKUSA_HOME/ext/libにafwhs-runtime.jarを格納する。
    2. HADOOP_HOME/libにScalaのライブラリー(scala-library.jar)を格納する。
  2. プロジェクトの前準備
    1. AsakusaFWの空プロジェクト(Eclipseのプロジェクト)を作る。
    2. Scalaのプロジェクト(Eclipseのプロジェクト)を作る。
    3. Scalaプロジェクトのビルドパス(依存プロジェクト)にAsakusaFWプロジェクトを追加する。
    4. Scalaプロジェクトのビルドパスにafwhs-runtime.jarとAsakusaFWのライブラリーを追加する。
    5. AsakusaFWプロジェクトのビルドパスにafwhs-runtime.jarとScalaのライブラリー(scala-library.jar)を追加する。
    6. AsakusaFWプロジェクトのasakusa-build.xmlにafwhs-driver.jarを追加する。
  3. 開発(コーディング・ソース生成・実行)
    1. AsakusaFWプロジェクトでデータモデル定義(dmdlファイル)を作成する。
    2. AsakusaFWプロジェクトでモデルクラス生成を行う。
    3. Scalaプロジェクトでプログラムを記述する。
    4. Scalaプロジェクトのプログラムを実行して動作を確認する。
    5. Scalaプロジェクトのプログラムを実行してAsakusaFWプロジェクト内にソースを生成する。
    6. Scalaプロジェクトのjarファイルを作ってASAKUSA_HOME/ext/libに格納する。
    7. AsakusaFWで実行する。
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の下にある)
src/main/scripts/asakusa-build.xmlの設定
追加するもの 説明
<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()
Generatorの引数
引数名 説明
workspace C:/workspace 生成先(AsakusaFWプロジェクト)のワークスペースの場所。
project afwhs-wordcount 生成先(AsakusaFWプロジェクト)のプロジェクト名(ディレクトリー名)。
basePackage sample.wordcount 生成先(AsakusaFWプロジェクト)のパッケージ名。
baseName WordCount 生成するクラス・ファイルに付けられる主たる名前。
(例えば生成されるジョブフローのクラス名は「WordCountJob」になる)
Generatorのメソッド
メソッド 説明 更新日
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の関数を呼ぶ正式なやり方があるか?)


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