Asakusa on M3BPのWindGateのメモ。
|
|
M3BPでも、WindGate(WindGate JDBC)を使ってRDBのテーブルにアクセスすることが出来る。
また、M3BP用のWindGate JDBC ダイレクト・モードでRDBにアクセスすることも出来る。
通常(M3BP以外)のDirect I/Oではローカルファイルにアクセスできない(Direct
I/Oは分散環境(主にHDFS)上のファイルを対象にしている)ので、ローカルファイルを読み書きしようと思ったらWindGateを使う必要があるが、
(M3BPは単一マシン上で動く為)M3BPではDirect I/Oでローカルファイルにアクセスできるので、WindGateを使う必要は無い。
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ダイレクトモードを有効にする必要がある。
// 全プロファイルで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だが、この値はちょっと少なめらしい。
実際にDBアクセスする際には、JDBCドライバーのライブラリー(jarファイル)が必要となる。[2017-06-03]
これは、実行環境のASAKUSA_HOME/m3bp/lib/の下に置く。
(通常のWindGate JDBCではASAKUSA_HOME/windgate/plugin/の下に置くが、M3BPのWindGate JDBCダイレクトモードでは そこのファイルは使われない)
M3BPのWindGate JDBCダイレクトモードでは、logback.xmlの設定を追加することで、実行されるSQL文をログ出力できる。[2017-06-03]
〜
<!-- Asakusa DAG Toolset classes -->
<logger name="com.asakusafw.dag" level="INFO"/>
<logger name="com.asakusafw.dag.runtime.jdbc" level="DEBUG"/>
〜