S-JIS[2016-12-10/2017-06-10] 変更履歴

Asakusa on M3BP WindGate

Asakusa on M3BPのWindGateのメモ。


概要

RDBアクセス

M3BPでも、WindGateWindGate JDBC)を使ってRDBのテーブルにアクセスすることが出来る。
また、M3BP用のWindGate JDBC ダイレクト・モードでRDBにアクセスすることも出来る。

ローカルファイルアクセス

通常(M3BP以外)のDirect I/Oではローカルファイルにアクセスできない(Direct I/Oは分散環境(主にHDFS)上のファイルを対象にしている)ので、ローカルファイルを読み書きしようと思ったらWindGateを使う必要があるが、
(M3BPは単一マシン上で動く為)M3BPではDirect I/Oでローカルファイルにアクセスできるので、WindGateを使う必要は無い。


WindGate JDBC ダイレクト・モード

AsakusaFW 0.9.0で、M3BP上でWindGate JDBCダイレクト・モードが使えるようになった。(試験的機能)

WindGateはAsakusaFW(Asakusa on M3BP)本体とは別コンポーネントなので、実際の実行時には、WindGateの入力処理が動き終わってから本体のバッチ処理が実行され、それが終わってからWindGateの出力処理が動く。
つまり、複数のテーブルを読み込む場合、全テーブルを読み終わってからバッチ処理本体が開始になる。

WindGate JDBCダイレクトモードを有効にすると、WindGateの処理もバッチ処理本体の一部として実行されるようになる。
すなわち、テーブルからデータを読んだら、そのデータを使ってバッチ処理本体が実行される。全テーブルを読み終わるまで待つことが無くなるので、全体として実行時間が早くなる(ことが期待される)。

また、通常のWindGate JDBCは一時ファイルのクリーンナップにhadoopコマンドを使用するので、M3BP環境であってもHadoop(Hadoopクライアント)をインストールする必要があるが、
WindGate JDBCダイレクトモードではHadoopは不要。[2017-06-03]


この機能を使うには、build.gradleでWindGate JDBCダイレクトモードを有効にする必要がある。

build.gradle:

// 全プロファイルでWindGate JDBCダイレクトモードを有効にする例
asakusafw {
    m3bp {
        option 'windgate.jdbc.direct', '*'
    }
}
// 特定プロファイルでWindGate JDBCダイレクトモードを有効にする例
asakusafw {
    m3bp {
        option 'windgate.jdbc.direct', 'asakusa1, asakusa2'
    }
}
// 特定のバッチだけWindGate JDBCダイレクトモードを有効にする例[2017-06-10]
asakusafw {
    m3bp {
        option 'Hoge1Batch:windgate.jdbc.direct', '*'
        option 'Hoge2Batch:windgate.jdbc.direct', '*'
    }
}

M3BPのコンパイラープロパティー(オプション)の記述方法


プロファイルの記述方法

通常のWindGate JDBCではWindGateプロファイル(ASAKUSA_HOME/windgate/profile/プロファイル名.properties)に設定を記述するが、M3BPのWindGate JDBCダイレクトモードでは、そのプロファイルは使われない。[2017-06-03]

ASAKUSA_HOME/m3bp/conf/m3bp.propertiesに、プロファイルと同等の設定を記述する。

com.asakusafw.dag.jdbc.プロファイル名.driver=org.postgresql.Driver
com.asakusafw.dag.jdbc.プロファイル名.url=jdbc:postgresql://localhost:5432/asakusa
com.asakusafw.dag.jdbc.プロファイル名.properties.user=asakusa
com.asakusafw.dag.jdbc.プロファイル名.properties.password=asakusa

# 最大同時接続数(デフォルトは1)
com.asakusafw.dag.jdbc.プロファイル名.connection.max=16

# 一度に処理する最大レコード数(デフォルトは1024)
com.asakusafw.dag.jdbc.プロファイル名.input.records=10240
com.asakusafw.dag.jdbc.プロファイル名.output.records=10240

# 出力の最大並列実行数(デフォルトは1)
com.asakusafw.dag.jdbc.プロファイル名.output.threads=16

# Oracleのダイレクト・パス・インサートを使う場合
com.asakusafw.dag.jdbc.プロファイル名.optimizations=ORACLE_DIRPATH

connection.maxで1より大きい値を指定しないと、並列でDBアクセスされない。
DBから同時に読み込むテーブル数を考慮して決定する。
また、DBへの書き込みで同時にアクセスするスレッド数も考慮する。

output.threadsはテーブルへの書き込みに使用する最大スレッド数(M3BPのスレッド数以下の値)を指定する。
(読み込みと違って、)ひとつのテーブルに複数のスレッドから並列で書き込む(INSERTする)ことがありうる。

input.recordsとouput.recordsのデフォルト値は1024だが、この値はちょっと少なめらしい。


JDBCドライバーの配置

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


SQLログの出力

M3BPのWindGate JDBCダイレクトモードでは、logback.xmlの設定を追加することで、実行されるSQL文をログ出力できる。[2017-06-03]

ASAKUSA_HOME/m3bp/conf/logback.xml:

〜
  <!-- Asakusa DAG Toolset classes -->
  <logger name="com.asakusafw.dag" level="INFO"/>
  <logger name="com.asakusafw.dag.runtime.jdbc" level="DEBUG"/>

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