Apache flink RichParallelSourceFunction中的水印

Apache flink RichParallelSourceFunction中的水印,apache-flink,flink-streaming,flink-sql,Apache Flink,Flink Streaming,Flink Sql,我正在实现一个SourceFunction,它从数据库中读取数据。 如果作业停止或崩溃,即保存点和检查点,且数据只处理一次,则作业应该能够恢复 到目前为止,我所拥有的: @SerialVersionUID(1L) class JDBCSource(private val waitTimeMs: Long) extends RichParallelSourceFunction[Event] with StoppableFunction with LazyLogging{ @transi

我正在实现一个SourceFunction,它从数据库中读取数据。 如果作业停止或崩溃,即保存点和检查点,且数据只处理一次,则作业应该能够恢复

到目前为止,我所拥有的:

@SerialVersionUID(1L)
class JDBCSource(private val waitTimeMs: Long) extends 
RichParallelSourceFunction[Event] with StoppableFunction with LazyLogging{

    @transient var client: PostGreClient = _
    @volatile var isRunning: Boolean = true
    val DEFAULT_WAIT_TIME_MS = 1000

    def this(clientConfig: Serializable) =
        this(clientConfig, DEFAULT_WAIT_TIME_MS)

    override def stop(): Unit = {
        this.isRunning = false
    }

    override def open(parameters: Configuration): Unit = {
        super.open(parameters)
        client = new JDBCClient
    }

    override def run(ctx: SourceFunction.SourceContext[Event]): Unit = {

        while (isRunning){
           val statement = client.getConnection.createStatement()
           val resultSet = statement.executeQuery("SELECT name, timestamp FROM MYTABLE")

            while (resultSet.next()) {
                val event: String = resultSet.getString("name")
                val timestamp: Long = resultSet.getLong("timestamp")

                ctx.collectWithTimestamp(new Event(name, timestamp), timestamp)

            }
        }
    }

    override def cancel(): Unit = {
        isRunning = false
    }
}
如何确保只获取数据库中尚未处理的行? 我假设ctx变量将包含一些关于当前水印的信息,以便我可以将查询更改为如下内容:

select name, timestamp from myTable where timestamp > ctx.getCurrentWaterMark
但是对我来说没有任何相关的方法。如果您有任何解决此问题的想法,我们将不胜感激。

您必须实施,以便自己管理检查点。接口的文档非常全面,但是如果你需要一个例子,我建议你看一看


本质上,您的函数必须实现CheckpointedFunctionsnapshotState以使用Flink的托管状态存储所需的状态,然后在执行还原时,它将在CheckpointedFunctioninitializeState中读取相同的状态。

这非常有帮助。非常感谢你: