Google cloud dataflow 使用Apache Beam从数据库读取批量数据

Google cloud dataflow 使用Apache Beam从数据库读取批量数据,google-cloud-dataflow,apache-beam,apache-beam-io,Google Cloud Dataflow,Apache Beam,Apache Beam Io,我想知道,如果我的查询返回数百万行,JdbcIO将如何并行执行查询。 我已参考了和相关的拉取请求。我不能完全理解它 ReadAllexpand方法使用ParDo。因此,它会创建到数据库的多个连接来并行读取数据吗?如果我限制可以创建到数据源中DB的连接数,它会遵守连接限制吗 有人能帮我了解一下在JdbcIO中如何处理这个问题吗?我正在使用2.2.0 更新: .apply( ParDo.of( new ReadFn<>(

我想知道,如果我的查询返回数百万行,JdbcIO将如何并行执行查询。 我已参考了和相关的拉取请求。我不能完全理解它

ReadAll
expand
方法使用
ParDo
。因此,它会创建到数据库的多个连接来并行读取数据吗?如果我限制可以创建到数据源中DB的连接数,它会遵守连接限制吗

有人能帮我了解一下在
JdbcIO
中如何处理这个问题吗?我正在使用
2.2.0

更新:

.apply(
          ParDo.of(
              new ReadFn<>(
                  getDataSourceConfiguration(),
                  getQuery(),
                  getParameterSetter(),
                  getRowMapper())))
。应用(
帕多(
新ReadFn(
getDataSourceConfiguration(),
getQuery(),
getParameterSetter(),
getRowMapper()))
上面的代码显示ReadFn与ParDo一起应用。我认为ReadFn将并行运行。如果我的假设是正确的,我将如何使用
readAll()
方法从一个一次只能建立有限数量连接的数据库中读取数据

谢谢
Balu

ReadAll方法处理多个查询的情况。可以将查询存储为字符串的PCollection,其中每个字符串都是查询。然后,在读取时,每个项目在单个ParDo中作为单独的查询进行处理

这对少量查询不起作用,因为它将并行性限制在查询的数量上。但是,如果你有很多,那么它将执行得更快。大多数ReadAll调用都是这样

从代码上看,似乎在设置函数中为每个工作者建立了连接。这可能包括几个查询,具体取决于工作人员的数量和查询的数量

查询限制设置在哪里?无论是否使用ReadAll,它的行为都应该类似

有关更多信息,请参见jira:


我对jdbcIO不是很熟悉,但他们似乎实现了jira中建议的版本。其中,PCollection可以是任何内容,然后是回调,以根据PCollection中的元素修改查询。这允许PCollection中的每个项表示一个查询,但比将新查询作为每个元素要灵活一些。

我创建了一个数据源,如下所示

    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);
我使用的查询将返回大约300万条记录。在观察数据库连接时,程序运行时连接的数量逐渐增加。在某些情况下,它最多使用5个连接。 我认为,这就是我们在运行
JdbcIO
trnsformation从数据库加载大量数据时如何限制创建到数据库的连接数的方法

ComboPoolDataSource的Maven依赖项

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

c3p0
c3p0
0.9.1.2
**如果我遗漏了什么,请随时更正答案。*

我也有类似的任务 我从数据库中获得了记录数,并将其划分为1000条记录的范围 然后我将readAll应用于范围的PCollection 这是一个解决方案。
谢谢你,巴鲁。数据源配置

劳拉,谢谢你的评论。但是,我的问题特定于一个单一查询将从数据库加载数百万行的情况。我没有看到任何并行读取此类数据的实现。我们如何在这里实现并行性?这似乎是可行的。我发现DBCP2数据源不可序列化,Hikari CP数据源也不可序列化,因此c3p0是一个不错的选择。谢谢
    <dependency>
        <groupId>c3p0</groupId>
        <artifactId>c3p0</artifactId>
        <version>0.9.1.2</version>
    </dependency>