Application Mode 下的 Flink 查询提交

Flink query submission in Application Mode

我对 Flink 比较陌生,正在检查以下是否是在不发送 JAR 的情况下提交 Flink 作业的好方法。注意:这对我来说在本地有效,我正在 AWS EMR 上试用它。但是想知道这里有没有我遗漏或者应该注意的地方:

在 main 方法中,我设置了必要的数据源,然后轮询远程 HTTP 端点以获取作业(查询)- 如下所示:

public static void main(String[] args) throws Exception {
   //Create env
   //Define sources
   //Define source tables
   Job myJob;
   while ((myJob = getNextJob(..call endpoint..)) != null) {
      //Get the query
      Table resultTable = tableEnv.sqlQuery(myJob.getQuery());
      DataStream<Row> resultStream = tableEnv.toDataStream(resultTable);
      SinkFunction<Row> printSink = new MyHTTPSinkFunction(remoteJobId);
      resultStream.addSink(printSink);
      JobClient jobRef = env.executeAsync(); 
      //Send ack to remote endpoint
   }
}

当然还有使用侦听器和所有边缘条件检查(例如作业失败等)的额外跟踪。

JAR 放在 Flink 集群的 lib 文件夹下,然后我使用 instructions here 在应用程序模式下启动它。

有了这个,我能够非常快速地提交作业并以非常低的延迟返回结果(目前用于批处理作业,但我们也可以在流模式下使用这种方法)。我假设如果 JobManager 崩溃,备份 JobManager 将继续轮询和提交作业。通过 JobID,我也可以跟踪工作。

这似乎是一种合理的方法吗?任何反馈将不胜感激。

不幸的是,应用程序模式目前仅支持 运行 高可用性设置中的单个作业。这主要是由于 main() 方法在 Dispatcher(JobManager 进程的一部分)中执行。

有关详细信息,请参阅 https://nightlies.apache.org/flink/flink-docs-release-1.14/docs/deployment/overview/#application-mode

会话集群最适合(它现在实际上是唯一的选择)运行 在高可用性设置中单个 Flink 集群上的多个作业。