首页 > 解决方案 > Apache Flink 本地设置,独立 JAR 与 start-cluster.sh 之间的实际区别

问题描述

所以这两种方法的代码都是一样的,大致如下:

StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
// prepare the topology...
env.execute();

场景是 Flink在单机本地运行。

独立 JAR

pom.xml(相关位):

<dependency>
    <groupId>org.apache.flink</groupId>
    <artifactId>flink-core</artifactId>
    <version>1.9.0</version>
</dependency>
<dependency>
    <groupId>org.apache.flink</groupId>
    <artifactId>flink-streaming-java_2.12</artifactId>
    <version>1.9.0</version>
</dependency>

运行:

java -cp target/My-0.0.0.jar MainClass

start-cluster.sh

pom.xml(相关位):

<dependency>
    <groupId>org.apache.flink</groupId>
    <artifactId>flink-core</artifactId>
    <version>1.9.0</version>
    <scope>provided</scope>
</dependency>
<dependency>
    <groupId>org.apache.flink</groupId>
    <artifactId>flink-streaming-java_2.12</artifactId>
    <version>1.9.0</version>
    <scope>provided</scope>
</dependency>

运行:

/path/to/flink-1.9.1/bin/flink run -c MainClass target/My-0.0.0.jar

文档页面指出:

LocalExecutionEnvironment 正在启动完整的 Flink 运行时,包括 JobManager 和 TaskManager。这些包括内存管理和在集群模式下执行的所有内部算法。

并让我认为两者之间没有实际差异,但我不能确定......

还有什么我需要考虑的吗?在性能方面会有什么不同吗?

标签: apache-flink

解决方案


正如您在文档中发现的那样,这两种模式几乎没有区别。

LocalExecutionEnvironment将创建一个迷你集群,其中包含本地运行的作业管理器、资源管理器和配置的任务管理器数量(local.number-taskmanager,默认为 1)。

如果你运行start-cluster.sh,它会产生同样的东西。任务管理器的数量取决于您的 conf/slaves(默认情况下仅包含 localhost)。

主要区别在于LocalExecutionEnvironment在同一个 JVM 中运行所有这些服务,因为它主要是作为您从 IDE 运行的调试工具。在集群模式下,您最终会得到两个不同的进程。在性能方面,我希望没有明显的差异,因为主要负载是在任务管理器上处理的。只有协调消息(作为远程过程调用)在同一个 JVM 进程中应该更快。

但是,请注意配置和最重要的类加载中的细微差别。由于本地模式将所有内容都放在一个进程中,因此您可能会看到比集群模式更多/其他类。因此,在投入生产之前,请确保在集群设置中对其进行测试。在本地模式下也没有 Web UI。


推荐阅读