S-JIS[2013-11-16/2014-12-21] 変更履歴

Asakusa Framework Importer/Exporter

Asakusa Frameworkのインポーター/エクスポーターについて。


概要

Asakusa Frameworkのインポーター/エクスポーターは、Asakusaアプリケーションの入出力データを表すもの。
具体的には、HDFSやAmzon S3あるいはローカルマシン上のファイルやRDBのテーブルとなる。

インポーターで指定されたファイル(あるいはテーブル)からデータを読み込んで処理し、エクスポーターで指定されたファイル(あるいはテーブル)に結果を出力する。

ジョブフローにおいてどのインポーター・エクスポーターを使うのかをFlow DSLで指定する。


インポーター記述の例

インポーターは、ImporterDescriptionインターフェースを実装したクラスで記述する。
ただ、実際は、DMDLにインポーター・エクスポーター生成用の属性を記述してインポーターの抽象クラスを自動生成し、それを使う方が多い。

例えばDirect I/OのCSVファイルを使う場合は以下のようにする。

dmdlファイル:

@directio.csv	←Direct I/OのCSVファイルのインポーター・エクスポーター抽象クラスを生成する指定
example = {
  value : INT;
};

そしてDMDLのコンパイルを行うと、以下の抽象クラスが生成される。
(「Abstract」+モデル名をキャメルケースに変換したもの+「CsvInputDescription」という抽象クラス)

AbstractExampleCsvInputDescription.java:

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;
	}
}

この抽象クラスを継承して、インポーターの具象クラスを作成する。

ExampleFromCsv.java:

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

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ファイルを使う場合は以下のようにする。

dmdlファイル:

@directio.csv	←Direct I/OのCSVファイルのインポーター・エクスポーター抽象クラスを生成する指定
example = {
  value : INT;
};

そしてDMDLのコンパイルを行うと、以下の抽象クラスが生成される。
(「Abstract」+モデル名をキャメルケースに変換したもの+「CsvOutputDescription」という抽象クラス)

AbstractExampleCsvOutputDescription.java:

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のベースパスとリソースパターンの使い分け

インポーターと異なり、エクスポーター共通の設定は無い。


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