Mysql apachebeam中从有界源周期性执行管道的方法

Mysql apachebeam中从有界源周期性执行管道的方法,mysql,google-cloud-dataflow,apache-beam,Mysql,Google Cloud Dataflow,Apache Beam,我有一个从MySQl服务器获取数据并使用DataFlow Runner插入数据存储的管道。 它可以作为执行一次的批处理作业正常工作。问题是,我希望以近乎实时的方式将新数据从MySQL服务器获取到数据存储中,但JdbcIO将有界数据作为源(因为它是查询的结果),因此我的管道只执行一次 我是否必须每30秒执行一次管道并重新提交一个数据流作业? 或者有没有一种方法可以让管道自动重做,而不必提交其他作业 它与主题类似,但我找不到CountingInput类。我以为GenerateSequence类可能会

我有一个从MySQl服务器获取数据并使用DataFlow Runner插入数据存储的管道。 它可以作为执行一次的批处理作业正常工作。问题是,我希望以近乎实时的方式将新数据从MySQL服务器获取到数据存储中,但JdbcIO将有界数据作为源(因为它是查询的结果),因此我的管道只执行一次

我是否必须每30秒执行一次管道并重新提交一个数据流作业? 或者有没有一种方法可以让管道自动重做,而不必提交其他作业

它与主题类似,但我找不到CountingInput类。我以为GenerateSequence类可能会改变,但我真的不知道如何使用它

欢迎任何帮助

我是否必须每30秒执行一次管道并重新提交一个数据流作业

对。对于有界数据源,不可能从MySQL连续读取数据流作业。使用
JdbcIO
类时,每次都必须部署一个新作业

或者有没有一种方法可以让管道自动重做,而不必提交其他作业


一个更好的方法是让任何向MySQL插入记录的系统也将消息发布到发布/订阅主题。由于Pub/Sub是一个无限的数据源,数据流可以不断地从中提取消息。

这是可能的,有几种方法可以实现。这取决于数据库的结构,以及它是否能够有效地查找自上次同步以来出现的新元素。例如,您的元素是否有插入时间戳?您能负担得起MySQL中另一个包含已保存到数据存储的最后一个时间戳的表吗

  • 实际上,您可以使用
    GenerateSequence.from(0).withRate(1,Duration.standardSeconds(1))
    来生成一个
    PCollection
    ,每秒向其中发送一个元素。您可以使用
    ParDo
    (或更复杂的转换链)在
    PCollection
    上进行必要的定期同步。您可能会发现
    JdbcIO.readAll()
    非常方便,因为它需要
    PCollection
    查询参数,因此每次出现
    PCollection
    中的新元素时都会触发它

  • 如果MySql中的数据量没有那么大(最多是几十万条记录),您可以使用
    Watch.growthOf()
    转换不断轮询整个数据库(使用常规JDBCAPI)并发出新元素


也就是说,Andrew建议的(向Pubsub额外发送记录)也是一种非常有效的方法。

谢谢,这正是我需要的。不过,我还是很难解决这个问题。您能否更具体地说明如何触发
JdbcIO.readAll()
?获取从GenerateSequence获得的PCollection,并应用JdbcIO.readAll().withQuery(…).withParameterSetter((elem,stmt)->{})。。。去吧。