case-kの備忘録

日々の備忘録です。データ分析とか基盤系に興味あります。

Dataflow JDBC テンプレート検証(Java)

Python版を調べてみたがクエリの上書きができなかったり、余計な通信が発生していたりと現時点で本番運用できる状態ではなかった。Java版が使えるか検証してみる。Java版はテンプレートが用意されていたので、PostgresとSQL Serverでそれぞれ検証してみた。結論としてはテンプレートをそのまま使うことはできないけど、クエリの上書きや無駄に実行環境からコネクション張る等Apache Beam Pythonで問題だった動きはしませんでした。本番運用でも使えそうです。
www.case-k.jp
www.case-k.jp
www.case-k.jp


テンプレートでサポートしてるのはBigQueryへの追加のみで全量置換はできていない。全量置換する場合自前で作る必要がある。パフォーマンス等調査は必要だがクエリの上書きやSQL Serverもサポートしていたので自前で用意すれば実務には使えそう。

        .apply(
            "Write to BigQuery",
            BigQueryIO.writeTableRows()
                .withoutValidation()
                .withCreateDisposition(BigQueryIO.Write.CreateDisposition.CREATE_NEVER)
                .withWriteDisposition(BigQueryIO.Write.WriteDisposition.WRITE_APPEND)
                .withCustomGcsTempLocation(options.getBigQueryLoadingTemporaryDirectory())
                .to(options.getOutputTable()));

github.com

並列実行する場合JOBの同時実行数が懸念。プロジェクトごとに25。上限をあげてもオーガナイゼーションレベルで125が最大となっている。相談すれば増やせはするかも。
増やせないなら数百テーブルを高速かつ、並列実行でやる場合GKEのAutopilotで対応した方がコスト、パフォーマンス面で良さそうに思える。

- Each Google Cloud project can run at most 25 concurrent Dataflow jobs.
- If you opt-in to organization level quotas, each organization can run at most 125 concurrent Dataflow jobs. 

Note: If you would like to run more than 25 concurrent Dataflow jobs for your project or more than 125 concurrent Dataflow jobs for your organization, contact Google Cloud Support and we will increase the limit to a value that better suits your needs.
cloud.google.com


設定のパラメータ

  • Postgres
# required parameters
template: Jdbc to BigQuery
jdbc connection URL string:jdbc:postgresql://<private ip address>:5432/beam
jdbc driver class name:org.postgresql.Driver
jdbc source sql query:<query>
BigQuery output table : <project>:<dataset>.<table>
gcs paths for Jdbc drivers: gs://<gcs-bucket>/postgresql-42.2.18.jre7.jar
Temporary directory for BigQuery loading process:gs: gs://<gcs-bucket>//tmp/


# option parameters
Jdbc connection username: <user-name>
Jdbc connection password: <password>
subnetwork:  <subnetwork>
# required parameters
jdbc connection URL string:jdbc:sqlserver://<private-ip>:1433;database=beam;
jdbc driver class name:com.microsoft.sqlserver.jdbc.SQLServerDriver
jdbc source sql query:<query>
BigQuery output table : <project>:<dataset>.<table>
gcs paths for Jdbc drivers: gs://<gcs-bucket>/mssql-jdbc-8.4.1.jre8.jar
Temporary directory for BigQuery loading process:gs: gs://<gcs-bucket>//tmp/


# option parameters
Jdbc connection username: <user-name>
Jdbc connection password: <password>
subnetwork:  <subnetwork>