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

时间:2017-12-27 09:55:40

标签: google-cloud-dataflow apache-beam apache-beam-io

我想知道,如果我的查询返回数百万行,JdbcIO将如何并行执行查询。 我已经提到了https://issues.apache.org/jira/browse/BEAM-2803和相关的拉取请求。我无法理解它。

ReadAll expand方法使用ParDo。因此,它是否会创建与数据库的多个连接以并行读取数据?如果我限制可以创建到数据源中的数据库的连接数,它是否会坚持连接限制?

任何人都可以帮助我了解这将如何处理JdbcIO?我正在使用2.2.0

更新:

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

上面的代码显示ReadFn应用了ParDo。我认为,ReadFn将并行运行。如果我的假设是正确的,我如何使用readAll()方法从DB中读取,我一次只能建立有限数量的连接?

由于 巴鲁

3 个答案:

答案 0 :(得分:1)

我创建了一个Datasource,如下所示。

    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万条记录。在观察数据库连接时,程序运行时连接数逐渐增加。它在某些实例上最多使用5个连接。 我认为,这是我们在运行JdbcIO转换以从数据库加载批量数据时限制创建到数据库的连接数的方式。

ComboPoolDataSource的Maven依赖

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

**如果我在这里错过了什么,请随时更正答案。*

答案 1 :(得分:0)

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

这对于少量查询不起作用,因为它将并行性限制为查询数量。但如果你有很多,那么它会更快地预成型。大多数ReadAll调用都是这种情况。

在代码中,它看起来像是在setup函数中为每个worker创建了一个连接。这可能包括多个查询,具体取决于工作人员数量和查询数量。

查询限制在哪里设置?无论有没有ReadAll,它的行为应该相似。

有关更多信息,请参阅jira:https://issues.apache.org/jira/browse/BEAM-2706

我对jdbcIO不是很熟悉,但似乎他们实现了jira中建议的版本。 PCollection可以是任何东西,然后是回调来修改查询,具体取决于PCollection中的元素。这允许PCollection中的每个项目代表一个查询,但比每个元素都有一个新查询更灵活。

答案 2 :(得分:0)

我有类似的任务 我从数据库中获得了记录数,并将其分为1000条记录 然后我将readAll应用于范围的PCollection 这里是description的解决方案。 并感谢Balu reg。数据源配置。