S-JIS[2015-04-23/2017-06-03] 変更履歴

Asakusa Framework WindGate JDBC

Asakusa FrameworkWindGate JDBCのメモ。


概要

WindGate JDBCは、AsakusaFWでRDBと連携するコンポーネント。

  WindGate   (AsakusaFW)
Hadoop
  WindGate  
RDB
テーブル
転送・変換 HDFS
SequenceFile
バッチ処理 HDFS
SequenceFile
転送・変換 RDB
テーブル

WindGate自体はその転送(と変換)を行うだけだが、DMDL上に“WindGateを使用する”という印を付けることにより、WindGateを使用する為のクラスが自動生成される。
その生成されたクラスをジョブフローのImporter/Exporterとして記述することでWindGateと連動する。

WindGateを片側だけ使うことも出来る。
すなわち、テーブルから読み込んで(Direct I/Oで)HDFS上にファイルを出力したり、(Direct I/Oで)HDFSからファイルを読み込んでテーブルに出力したり、といった使い方が出来る。


Importer/Exporterクラスの作成方法

WindGate JDBC用のImporter/Exporterクラスを作成する場合、DMDL属性を利用するのが便利。

データモデル定義(dmdlファイル)に@windgate.jdbcの属性を付けておくと、DMDLのコンパイル時にImporter/Exporterの雛形クラスが生成される。
このクラスを継承して具体的なImporter/Exporterクラスを作成する。

  1. データモデルに@windgate.jdbc.table属性を付ける。
    プロパティーに@windgate.jdbc.column属性を付ける。
    "サンプル"
    @windgate.jdbc.table(name = "EXAMPLE")
    example = {
    
        "カラム"
        @windgate.jdbc.column(name = "VALUE")
        value : TEXT;
    };
    Direct I/O CSVの場合、@directio.csv.field属性を付けなくても入出力対象になるが、WindGate JDBCでは@windgate.jdbc.column属性を付けないプロパティーは入出力対象にならない。
  2. DMDLをコンパイルする。
    すると、データモデル毎にImporter/Exporterクラスの雛形が生成される。
    exampleというデータモデルの場合、AbstractExampleJdbcImporterDescription・AbstractExampleJdbcExporterDescriptionというクラス名。
  3. 生成された雛形を継承し、具象クラスを作成する。
    Importerの例 Exporterの例
    public class ExampleFromTable extends AbstractExampleJdbcImporterDescription {

        @Override
        public String getProfileName() {
            return "asakusa";
        }

        @Override
        public DataSize getDataSize() {
            return DataSize.TINY;
        }
    }
    public class ExampleToTable extends AbstractExampleJdbcExporterDescription {

        @Override
        public String getProfileName() {
            return "asakusa";
        }
    }

プロファイル名には、使用する設定ファイルを指定する。
プロファイル名が「asakusa」のとき、「ASAKUSA_HOME/windgate/profile/asakusa.properties」が使われる。

WindGate JDBC用プロファイルの例


JdbcImporterのメソッド

メソッド名 内容
String getTableName() テーブル名。
デフォルトは、@windgate.jdbc.tableで指定した名前。
@Override
public String getTableName() {
  return "EXAMPLE";
}
List<String> getColumnNames() SELECTで読み込むカラム一覧。
デフォルトでは、@windgate.jdbc.columnが付けられたものだけになる。
@Override
public List<String> getColumnNames() {
  return Arrays.asList("COL1", "COL2");
}
String getCondition() 読み込む際のSELECT文のWHERE条件。
デフォルトは条件無し。
@Override
public String getCondition() {
  return "COL1 = 123";
}
Collection<? extends JdbcAttribute> getOptions()
(AsakusaFW 0.9.0以降)
インポート処理のオプションを指定する。[2016-12-10] AsakusaFW 0.9.0時点では、指定できるオプションは無い。

JdbcExporterのメソッド

メソッド名 内容
String getTableName() テーブル名。
デフォルトは、@windgate.jdbc.tableで指定した名前。
@Override
public String getTableName() {
  return "EXAMPLE";
}
List<String> getColumnNames() INSERTするカラム一覧。
デフォルトでは、@windgate.jdbc.columnが付けられたものだけになる。
@Override
public List<String> getColumnNames() {
  return Arrays.asList("COL1", "COL2");
}
String getCustomTruncate()
(AsakusaFW 0.7.3以降)
INSERT前にテーブルを削除する為のSQL文。
デフォルトでは、TRUNCATE TABLEで全データが削除される。
${}バッチ引数を指定できる。
@Override
public String getCustomTruncate() {
  return "DELETE FROM " + getTableName() + " WHERE CREATE_DATE=to_date(${date}, 'YYYYMMDD')";
}
Collection<? extends JdbcAttribute> getOptions()
(AsakusaFW 0.9.0以降)
エクスポート処理のオプションを指定する。[2016-12-10] @Override
public Collection<Option> getOptions() {
  return Arrays.asList(Option.ORACLE_DIRPATH);
}

JDBCドライバーの配置

実際にWindGate JDBCでDBアクセスする際には、JDBCドライバーのライブラリー(jarファイル)が必要となる。[2017-06-03]
これは、実行環境のASAKUSA_HOME/windgate/plugin/の下に置く。

WindGate JDBCを使っているImporter/Exporterを持つジョブフローをJobFlowTesterでテストする場合、テスト環境にDBが必要となる。
この場合、テスト環境のASAKUSA_HOME/windgate/plugin/の下に置く。
ShafuAsakusa Frameworkのインストールを実行するとテスト環境が作られるので、そこに置く)

M3BPのWindGate JDBCダイレクトモードの場合は、ASAKUSA_HOME/m3bp/lib/に置く。


Oracleダイレクト・パス・インサート

AsakusaFW 0.9.0で、Oracle11gのダイレクト・パス・インサートを使ってテーブルにデータを入れる機能が新設された。[2016-12-10]

ExporterクラスのgetOptionsメソッドでORACLE_DIRPATHを返すと、使用されるINSERT文にAPPEND_VALUESヒントが追加される。

public class ExampleToTable extends AbstractExampleJdbcExporterDescription {

	@Override
public String getProfileName() {
return "asakusa";
}
〜 @Override public Collection<Option> getOptions() { return Arrays.asList(Option.ORACLE_DIRPATH); } }

なお、OptionはJdbcExporterDescription内で定義されている列挙型である。


この機能を使う為には、使用するプロファイルにORACLE_DIRPATHを指定する必要がある。

ASAKUSA_HOME/windgate/profile/asakusa.properties:

〜
resource.jdbc.optimizations = ORACLE_DIRPATH
〜

M3BPのWindGate JDBCダイレクトモードの場合は、以下のように書く。[2017-06-03]

ASAKUSA_HOME/m3bp/conf/m3bp.properties:

〜
com.asakusafw.dag.jdbc.asakusa.optimizations=ORACLE_DIRPATH
〜

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