如何并行地从mysql读取数据到flink?

如何并行地从mysql读取数据到flink?,mysql,database,streaming,apache-flink,flink-streaming,Mysql,Database,Streaming,Apache Flink,Flink Streaming,如何将mysql中的数据并行读取到flink?我想构建一个sourceFunction,以便每隔一段时间从mysql中并行连续读取数据。我如何实现它?这个问题的答案包括两个方面: 并行读取MySQL(或任何其他JDBC源代码) 定期从MySQL(或任何其他JDBC源代码)读取 并行读取MySQL 为了并行读取MySQL,需要发送多个不同的查询。查询的组合方式必须确保其结果的并集与预期结果相等。例如,可以使用范围谓词在数值属性之间拆分查询: Q1: SELECT * FROM sourceT WH

如何将mysql中的数据并行读取到flink?我想构建一个sourceFunction,以便每隔一段时间从mysql中并行连续读取数据。我如何实现它?

这个问题的答案包括两个方面:

  • 并行读取MySQL(或任何其他JDBC源代码)
  • 定期从MySQL(或任何其他JDBC源代码)读取
  • 并行读取MySQL 为了并行读取MySQL,需要发送多个不同的查询。查询的组合方式必须确保其结果的并集与预期结果相等。例如,可以使用范围谓词在数值属性之间拆分查询:

    Q1: SELECT * FROM sourceT WHERE num < 10;
    Q2: SELECT * FROM sourceT WHERE num >= 10 AND num < 20;
    Q3: SELECT * FROM sourceT WHERE num >= 20;
    
    与以前一样,只有在表在
    rowtime
    属性上建立索引时,这种方法才有效。否则,您将执行一次完整的表扫描,并且随着插入的数据越来越多,查询将变得越来越慢

    以周期性间隔并行读取MySQL 为此,您“只需”将这两种方法结合起来,并为每个查询添加两个谓词。实际上,您要做的是将表划分为分离的部分,并随着时间的推移并行地读取它们


    然而,正如我之前指出的,确切的分区取决于您的数据和用例。此外,您需要创建适当的索引以避免全表扫描。另外请注意,使用上述方法,您将不会看到在读取行后修改的行的任何更新。

    Thx非常感谢您的回答!另外,我想问一下,我如何分割查询并将不同的查询分发给flink中的不同源工作人员?非常感谢!您可以使用并行子任务的数量和当前子任务的id来计算每个并行实例的分区。这将为您提供分区的数量以及每个子任务负责哪个分区。此信息可在
    RuntimeContext
    上获得,可由
    RichFunction
    请求。谢谢先生!另外,我想问一下如何设置sourceFunction的并行性?当我设置“StreamExecutionEnvironment.setParallelism(N)”时,源代码的并行性是否也会为N?只有将其实现为
    ParallelSourceFunction
    。如果扩展
    SourceFunction
    接口,它的并行度将始终为1。
    Q at T1: SELECT * FROM sourceT WHERE rowtime < T1;
    Q at T2: SELECT * FROM sourceT WHERE rowtime < T2;