Project Configuration | Apache Flink
每个 Flink 应用程序都依赖于一组 Flink 库。 至少,应用程序依赖于 Flink API。 许多应用程序还依赖于某些连接器库(如 Kafka、Cassandra 等)。 在运行 Flink 应用程序时(无论是在分布式部署中,还是在 IDE 中进行测试),Flink 运行时库也必须可用。
Flink 核心和应用程序依赖
与大多数运行用户定义应用程序的系统一样,Flink 中有两大类依赖项和库:
Flink 核心依赖
Flink 核心依赖:Flink 本身由一组运行系统所需的类和依赖组成,例如协调、网络、检查点、故障转移、API、操作(如窗口化)、资源管理等。这些类和依赖项构成了 Flink 运行时的核心,并且在 Flink 应用程序启动时必须存在。
这些核心类和依赖被打包在 flink-dist jar 中。它们是 Flink 的 lib 文件夹的一部分,也是基本 Flink 容器镜像的一部分。将这些依赖视为类似于 Java 的核心库(rt.jar、charsets.jar 等),其中包含 String 和 List 等类。
Flink Core Dependencies 不包含任何连接器或库(CEP、SQL、ML 等),以避免默认情况下类路径中有过多的依赖项和类。事实上,我们试图保持核心依赖尽可能小,以保持默认的类路径小并避免依赖冲突。
用户应用程序依赖项
用户应用程序依赖项是特定用户应用程序需要的所有连接器、格式或库。
用户应用程序通常被打包到一个应用程序 jar 中,其中包含应用程序代码以及所需的连接器和库依赖项。
用户应用依赖明确不包括 Flink DataStream API 和运行时依赖,因为这些已经是 Flink 的核心依赖的一部分。
设置项目:基本依赖关系
每个 Flink 应用程序都需要作为最低限度的 API 依赖项来进行开发。
手动设置项目时,您需要为 Java/Scala API 添加以下依赖项(此处以 Maven 语法呈现,但相同的依赖项也适用于其他构建工具(Gradle、SBT 等)。
<dependency>
<groupId>org.apache.flink</groupId>
<artifactId>flink-streaming-java</artifactId>
<version>1.15-SNAPSHOT</version>
<scope>provided</scope>
</dependency>
重要提示:请注意,所有这些依赖项的范围都设置为提供。这意味着需要对它们进行编译,但不应将它们打包到项目生成的应用程序 jar 文件中——这些依赖项是 Flink Core Dependencies,它们已经在任何设置中可用。
强烈建议将依赖项保留在provided的范围内。如果没有设置为provided,最好的情况是生成的JAR会变得过大,因为它还包含了所有Flink核心依赖。最糟糕的情况是,添加到应用程序 jar 文件中的 Flink 核心依赖项与您自己的一些依赖项版本发生冲突(通常通过反向类加载来避免)。
关于 IntelliJ 的注意事项:要使应用程序在 IntelliJ IDEA 中运行,必须在运行配置中勾选包含具有“提供”范围的依赖项框。如果此选项不可用(可能是由于使用较旧的 IntelliJ IDEA 版本),那么一个简单的解决方法是创建一个调用应用程序 main() 方法的测试。
添加连接器和库依赖
大多数应用程序需要特定的连接器或库来运行,例如连接到 Kafka、Cassandra 等的连接器。这些连接器不是 Flink 核心依赖项的一部分,必须作为依赖项添加到应用程序中。
以下是将 Kafka 的连接器添加为依赖项(Maven 语法)的示例:
<dependency>
<groupId>org.apache.flink</groupId>
<artifactId>flink-connector-kafka</artifactId>
<version>1.15-SNAPSHOT</version>
</dependency>
我们建议将应用程序代码及其所有必需的依赖项打包到一个带有依赖项的 jar 中,我们将其称为应用程序 jar。 应用 jar 可以提交到已经运行的 Flink 集群,或者添加到 Flink 应用容器镜像。
从 Java 项目模板或 Scala 项目模板创建的项目被配置为在运行 mvn clean package 时自动将应用程序依赖项包含到应用程序 jar 中。 对于不是从这些模板设置的项目,我们建议添加 Maven Shade 插件(如下面的附录中所列)来构建具有所有必需依赖项的应用程序 jar。
重要提示:为了让 Maven(和其他构建工具)正确地将依赖项打包到应用程序 jar 中,这些应用程序依赖项必须在 scope compile 中指定(与核心依赖项必须指定为provided范围不同)。
Scala 版本
我用不上
Hadoop 依赖配置
一般规则:永远不需要将 Hadoop 依赖项直接添加到您的应用程序中。 (唯一的例外是将现有的 Hadoop 输入/输出格式与 Flink 的 Hadoop 兼容性包装器一起使用时)
如果您想将 Flink 与 Hadoop 一起使用,您需要有一个包含 Hadoop 依赖项的 Flink 设置,而不是将 Hadoop 添加为应用程序依赖项。 Flink 会使用 HADOOP_CLASSPATH 环境变量指定的 Hadoop 依赖,可以通过以下方式设置:
export HADOOP_CLASSPATH=`hadoop classpath`
这种设计有两个主要原因:
一些 Hadoop 交互发生在 Flink 的核心中,可能在用户应用程序启动之前,例如为检查点设置 HDFS、通过 Hadoop 的 Kerberos 令牌进行身份验证或在 YARN 上部署。
Flink 的反向类加载方法对核心依赖项隐藏了许多传递依赖项。 这不仅适用于 Flink 自己的核心依赖项,也适用于设置中存在的 Hadoop 依赖项。 这样,应用程序就可以使用相同依赖项的不同版本,而不会遇到依赖项冲突(相信我们,这很重要,因为 Hadoop 的依赖项树很大。)
如果您在 IDE 内部进行测试或开发期间需要 Hadoop 依赖项(例如用于 HDFS 访问),请配置这些依赖项类似于要test或provided的依赖项范围。
Maven快速建立项目
要求
唯一的要求是 Maven 3.0.4(或更高版本)和 Java 8.x 安装。
创建项目
使用以下命令之一创建项目:
mvn archetype:generate \
-DarchetypeGroupId=org.apache.flink \
-DarchetypeArtifactId=flink-quickstart-java \
-DarchetypeVersion=1.15-SNAPSHOT
或
$ curl https://flink.apache.org/q/quickstart-SNAPSHOT.sh | bash -s 1.15-SNAPSHOT
对于 Maven 3.0 或更高版本,不再可以通过命令行指定存储库 (-DarchetypeCatalog)。 关于这个变化的详细信息,请参考Maven官方文档 如果您想使用快照存储库,您需要在您的settings.xml中添加一个存储库条目。 例如:
<settings>
<!-- 配置国内镜像-->
<mirrors>
<mirror>
<id>alimaven</id>
<name>aliyun maven</name>
<url>http://maven.aliyun.com/nexus/content/groups/public/</url>
<mirrorOf>central</mirrorOf>
</mirror>
</mirrors>
<activeProfiles>
<activeProfile>apache</activeProfile>
</activeProfiles>
<profiles>
<profile>
<id>apache</id>
<repositories>
<repository>
<id>apache-snapshots</id>
<url>https://repository.apache.org/content/repositories/snapshots/</url>
</repository>
</repositories>
</profile>
</profiles>
</settings>
我们建议您将此项目导入您的 IDE 以进行开发和测试。 IntelliJ IDEA 支持开箱即用的 Maven 项目。
请注意:Java 的默认 JVM 堆大小对于 Flink 来说可能太小了。 您必须手动增加它。 在 IntelliJ IDEA 中,推荐的更改 JVM 选项的方法来自 Help | 编辑自定义 VM 选项菜单。 有关详细信息,请参阅此文章。
编译项目
如果要构建/打包项目,请转到项目目录并运行“mvn clean package”命令。 您将找到一个 JAR 文件,其中包含您的应用程序,以及您可能已作为依赖项添加到应用程序的连接器和库:target/<artifact-id>-<version>.jar。
注意:如果您使用不同于 DataStreamJob 的类作为应用程序的主类/入口点,我们建议您相应地更改 pom.xml 文件中的 mainClass 设置。 这样,Flink 可以从 JAR 文件运行应用程序,而无需额外指定主类。
附录:用于构建具有依赖项的 Jar 的模板
要构建包含声明的连接器和库所需的所有依赖项的应用程序 JAR,您可以使用以下 shade 插件定义:
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>3.1.1</version>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
<configuration>
<artifactSet>
<excludes>
<exclude>com.google.code.findbugs:jsr305</exclude>
<exclude>org.slf4j:*</exclude>
<exclude>log4j:*</exclude>
</excludes>
</artifactSet>
<filters>
<filter>
<!-- Do not copy the signatures in the META-INF folder.
Otherwise, this might cause SecurityExceptions when using the JAR. -->
<artifact>*:*</artifact>
<excludes>
<exclude>META-INF/*.SF</exclude>
<exclude>META-INF/*.DSA</exclude>
<exclude>META-INF/*.RSA</exclude>
</excludes>
</filter>
</filters>
<transformers>
<transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
<mainClass>my.programs.main.clazz</mainClass>
</transformer>
</transformers>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>