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のベースパスとリソースパターンの使い分け
インポーターと異なり、エクスポーター共通の設定は無い。