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

时间:2017-09-27 10:06:38

标签: mysql database streaming apache-flink flink-streaming

如何从mysql并行读取数据?我想构建一个sourceFunction,以便从mysql并行地每隔一段时间连续读取数据。我怎样才能实现它?

1 个答案:

答案 0 :(得分:1)

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

  1. 并行读取MySQL(或任何其他JDBC源代码)
  2. 定期读取MySQL(或任何其他JDBC源代码)
  3. 并行读取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;
    

    还有其他方法可以对查询进行分区。但是为了实际获得某些东西,DBMS必须能够比查询整个表的单个查询更有效地处理多个查询。通常,您希望确保对您分区的属性(上例中的num)编制索引。但是,在单个数据库实例上拍摄多个查询会导致开销。因此,找到提供最佳性能的并行性并非易事。

    定期从MySQL中读取

    这类似于并行读取。同样,您需要对查询进行分区。但是现在你想根据描述记录时间的属性来做这件事。因此,在每个间隔中,您要询问自上一个间隔以来插入的行。同样,这将通过时间属性的范围谓词来完成。

    Q at T1: SELECT * FROM sourceT WHERE rowtime < T1;
    Q at T2: SELECT * FROM sourceT WHERE rowtime < T2;
    

    和以前一样,只有在rowtime属性上对表进行索引时,这才有效。否则,您将进行全表扫描,并且随着插入更多数据,查询将变得越来越慢。

    以定期间隔并行读取MySQL

    为此你&#34;只是&#34;必须结合两种方法并为每个查询添加两个谓词。你基本上做的是将表分成分离部分并随着时间的推移并行读取它们。

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