3

クエリが何百万行も返す場合、JdbcIO がクエリを並列に実行する方法を知りたいです。https://issues.apache.org/jira/browse/BEAM-2803および関連するプル リクエストを参照しました。私はそれを完全に理解できませんでした。

ReadAll expandメソッドは を使用しParDoます。したがって、データを並行して読み取るために、データベースへの複数の接続を作成しますか? データソース内の DB に作成できる接続の数を制限すると、接続制限に固執しますか?

でこれがどのように処理されるかを理解するのを手伝ってもらえますJdbcIOか? 私は使っている2.2.0

アップデート :

.apply(
          ParDo.of(
              new ReadFn<>(
                  getDataSourceConfiguration(),
                  getQuery(),
                  getParameterSetter(),
                  getRowMapper())))

上記のコードは、ReadFn が ParDo に適用されることを示しています。ReadFn は並行して実行されると思います。私の仮定が正しければ、readAll()一度に限られた数の接続しか確立できない DB から読み取るメソッドをどのように使用すればよいでしょうか?

ありがとうバル

4

3 に答える 3

1

次のように、データソースを作成しました。

    ComboPooledDataSource cpds = new ComboPooledDataSource();
    cpds.setDriverClass("com.mysql.jdbc.Driver"); // loads the jdbc driver
    cpds.setJdbcUrl("jdbc:mysql://<IP>:3306/employees");
    cpds.setUser("root");
    cpds.setPassword("root");
    cpds.setMaxPoolSize(5);

現在、このドライバーを設定するためのより良い方法があります。データベース プールのサイズを 5 に設定しました。JdbcIO変換中に、このデータソースを使用して接続を作成しました。パイプラインで、設定しました

option.setMaxNumWorkers(5);
option.setAutoscalingAlgorithm(AutoscalingAlgorithmType.THROUGHPUT_BASED);

約 300 万件のレコードを返すクエリを使用しました。DB 接続を観察している間、プログラムの実行中に接続数が徐々に増加していました。特定のインスタンスで最大 5 つの接続を使用しました。JdbcIOこれは、データベースから大量のデータをロードするために trnsformation を実行しているときに、DB に作成される接続の数を制限する方法だと思います。

ComboPoolDataSource の Maven 依存関係

    <dependency>
        <groupId>c3p0</groupId>
        <artifactId>c3p0</artifactId>
        <version>0.9.1.2</version>
    </dependency>

**ここで何か見逃した場合は、お気軽に回答を修正してください.*

于 2018-01-04T10:20:01.553 に答える