Asakusa Frameworkのインポーター/エクスポーターについて。
|
|
Asakusa Frameworkのインポーター/エクスポーターは、Asakusaアプリケーションの入出力データを表すもの。
具体的には、HDFSやAmzon S3あるいはローカルマシン上のファイルやRDBのテーブルとなる。
インポーターで指定されたファイル(あるいはテーブル)からデータを読み込んで処理し、エクスポーターで指定されたファイル(あるいはテーブル)に結果を出力する。
ジョブフローにおいてどのインポーター・エクスポーターを使うのかをFlow DSLで指定する。

インポーターは、ImporterDescriptionインターフェースを実装したクラスで記述する。
ただ、実際は、DMDLにインポーター・エクスポーター生成用の属性を記述してインポーターの抽象クラスを自動生成し、それを使う方が多い。
例えばDirect I/OのCSVファイルを使う場合は以下のようにする。
@directio.csv ←Direct I/OのCSVファイルのインポーター・エクスポーター抽象クラスを生成する指定
example = {
value : INT;
};
そしてDMDLのコンパイルを行うと、以下の抽象クラスが生成される。
(「Abstract」+モデル名をキャメルケースに変換したもの+「CsvInputDescription」という抽象クラス)
package com.example.modelgen.dmdl.csv;
import com.asakusafw.vocabulary.directio.DirectFileInputDescription;
import com.example.modelgen.dmdl.model.Example;
/**
* An abstract implementation of {@link Example} importer description using Direct I/O CSV.
*/
public abstract class AbstractExampleCsvInputDescription extends DirectFileInputDescription {
@Override public Class<? extends Example> getModelType() {
return Example.class;
}
@Override public Class<ExampleCsvFormat> getFormat() {
return ExampleCsvFormat.class;
}
}
この抽象クラスを継承して、インポーターの具象クラスを作成する。
package com.example.jobflow;
import com.example.modelgen.dmdl.csv.AbstractExampleCsvInputDescription;
public class ExampleFromCsv extends AbstractExampleCsvInputDescription {
@Override
public String getBasePath() {
return "input";
}
@Override
public String getResourcePattern() {
return "documents-*.csv";
}
@Override
public DataSize getDataSize() {
return DataSize.LARGE;
}
}
getBasePath()とgetResourcePattern()はDirect I/O特有の設定。入力ファイルのディレクトリーとファイル名を示している。
→Direct I/Oのベースパスとリソースパターンの使い分け
getDataSize()はインポーターで共通の設定。
入力データのおおよそのサイズを示す。
TINYを指定すると、結合を行うときにHadoopの分散キャッシュを使ってファイルをスレーブノードに配布し、メモリー上にハッシュ表を作る最適化が行われることがある。
Reduce処理が不要になるのでステージ(MapReduceジョブ)数が減るが、ハッシュ表の分のメモリーが必要になる。
SMALLという指定もあるが、現在は特に最適化は行われない。
参考: Asakusa DSLユーザーガイドのhashJoinForTiny・hashJoinForSamllオプション
isOptionalメソッドは、Direct I/OのDirectFileInputDescriptionにAsakusaFW 0.6.1で追加されたメソッド。[2014-12-21]
このメソッドでtrueを返すようにすると、入力ファイルが無くてもエラーにならない。
デフォルトはfalseを返すので、入力ファイルが無かった場合は実行時エラーになる。(AsakusaFW 0.6.0以前と同じ挙動)
public class SalesDetailFromCsv extends AbstractSalesDetailCsvInputDescription {
〜
@Override
public boolean isOptional() {
return true;
}
}
エクスポーターは、ExporterDescriptionインターフェースを実装したクラスで記述する。
ただ、実際は、DMDLにインポーター・エクスポーター生成用の属性を記述してエクスポーターの抽象クラスを自動生成し、それを使う方が多い。
例えばDirect I/OのCSVファイルを使う場合は以下のようにする。
@directio.csv ←Direct I/OのCSVファイルのインポーター・エクスポーター抽象クラスを生成する指定
example = {
value : INT;
};
そしてDMDLのコンパイルを行うと、以下の抽象クラスが生成される。
(「Abstract」+モデル名をキャメルケースに変換したもの+「CsvOutputDescription」という抽象クラス)
package com.example.modelgen.dmdl.csv;
import com.asakusafw.vocabulary.directio.DirectFileOutputDescription;
import com.example.modelgen.dmdl.model.Example;
/**
* An abstract implementation of {@link Example} exporter description using Direct I/O CSV.
*/
public abstract class AbstractExampleCsvOutputDescription extends DirectFileOutputDescription {
@Override public Class<? extends Example> getModelType() {
return Example.class;
}
@Override public Class<ExampleCsvFormat> getFormat() {
return ExampleCsvFormat.class;
}
}
この抽象クラスを継承して、インポーターの具象クラスを作成する。
package com.example.jobflow;
import com.example.modelgen.dmdl.csv.AbstractExampleCsvOutputDescription;
public class ExampleToCsv extends AbstractExampleCsvOutputDescription {
@Override
public String getBasePath() {
return "output";
}
@Override
public String getResourcePattern() {
return "documents-{category}.csv";
}
}
getBasePath()とgetResourcePattern()はDirect I/O特有の設定。出力ファイルのディレクトリーとファイル名を示している。
→Direct I/Oのベースパスとリソースパターンの使い分け
インポーターと異なり、エクスポーター共通の設定は無い。