目录
使用Flink所需要的基础maven依赖包,还有一些数据来源的驱动,如Kafka Connector,还有保证Flink应用程序运行的Flink运行库。
核心依赖和应用程序依赖
- Flink Core Dependencies
Flink本身包含一组运行系统所需的类和依赖项,例如coordination, networking, checkpoints, failover, APIs, operations (such as windowing), resource management等。所有这些类和依赖项的集合构成了Flink的runtim的核心。启动Flink应用程序时必须存在。
这些核心类和依赖项打包在flink-dist
jar中。它们是Flink的lib文件夹的一部分,也是基本Flink容器图像的一部分。将这些依赖性视为与Java核心库(rt.jar
, charsets.jar
)类似,它包含字符串和列表之类的类。
Flink核心依赖项不包含任何连接器或库(CEP, SQL, ML),以便在默认情况下避免类路径中有过多的依赖项和类。事实上,我们尽量保持核心依赖性的最小化,以保持默认的类路径的较小并避免依赖性冲突。
- User Application Dependencies
用户应用程序通常打包到应用程序jar中,其中包含应用程序代码、所需的连接器和库依赖项。
其中不包括Flink DataSet / DataStream APIs and runtime dependencies,因为他们在Flink核心依赖中都有。
项目配置基础Maven依赖
新建项目后,需要手动添加以下Maven依赖(Java和Scala)
Java
<dependency>
<groupId>org.apache.flink</groupId>
<artifactId>flink-java</artifactId>
<version>1.8.0</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.apache.flink</groupId>
<artifactId>flink-streaming-java_2.11</artifactId>
<version>1.8.0</version>
<scope>provided</scope>
</dependency>
Scala
<dependency>
<groupId>org.apache.flink</groupId>
<artifactId>flink-scala_2.11</artifactId>
<version>1.8.0</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.apache.flink</groupId>
<artifactId>flink-streaming-scala_2.11</artifactId>
<version>1.8.0</version>
<scope>provided</scope>
</dependency>
提示:所有这些依赖项的作用域都已设置为provided。这意味着需要对它们进行编译,但不应将它们打包到项目生成的应用程序JAR文件中——这些依赖项是Flink核心依赖项,在任何设置中都已经可用。
强烈建议将依赖关系保持在<scope>provided</scope>范围内。如果没有将它们设置为required,那么最好的情况是生成的JAR变得非常大,因为它还包含所有Flink核心依赖项。最坏的情况是添加到应用程序jar文件中的Flink核心依赖项与您自己的一些依赖项版本冲突(通常通过反向类加载来避免)。
IntelliJ注意:要使应用程序在IntelliJ IDEA中运行,需要在scope compile中声明Flink依赖项<scope>compile</scope>,而不是<scope>provided</scope>。否则IntelliJ将不会将它们添加到类路径中,而idea中执行将会失败,并带有NoClassDefFountError。为了避免编译依赖范围(不推荐,见上图),上述有关Java - Scala项目模板使用技巧:他们添加一个配置文件,选择性地激活当应用程序运行在IntelliJ,才促进了依赖编译范围,而不影响包装的JAR文件。
添加Connector和库 依赖
大多数的应用程序需要一些特殊的Connector依赖和库依赖才能运行,例如:Kafka Connector等,这些并不是Flink自带的核心依赖,所以需要另外添加。
下面是Kafka0.10版本的Maven依赖样例:
<dependency>
<groupId>org.apache.flink</groupId>
<artifactId>flink-connector-kafka-0.10_2.11</artifactId>
<version>1.8.0</version>
</dependency>
建议将应用程序代码及其所有必需的依赖项打包成一个jar-with-dependencies,即jar包。可以提交给已经运行的Flink集群,或者添加到Flink应用程序容器映像中。
从Java项目模板或Scala项目模板创建的项目被配置为在运行mvn clean包时自动将应用程序依赖项包含到应用程序jar中。对于没有从这些模板中设置的项目,建议添加Maven Shade插件(如下面的附录所示)来构建包含所有必需依赖项的应用程序jar。
提示:为了让Maven(和其他构建工具)正确地将依赖项打包到应用程序JAR中,必须指定这些应用程序依赖项为<scope>compile</scope>(与核心依赖项不同,核心依赖项必须是<scope>provided</scope>)。
Scala版本
Scala版本(2.10、2.11、2.12等)彼此之间不是二进制兼容的。因此,Scala 2.11的Flink不能用于使用Scala 2.12的应用程序。
所有依赖于scala的flink依赖项(可传递地)都加上了为其构建的scala版本的后缀,例如flink-streaming-scala_2.11。
Java开发者可以选择任意Scala版本,Scala开发者必须选择与程序匹配的版本。
注意:由于scala 2.12中的重大突破性变化,Flink 1.5目前只为scala 2.11构建。
Hadoop依赖
一般情况下不需要直接将Hadoop的依赖添加到项目中去。
如果想基于Hadoop使用Flink,你需要一个包含Hadoop依赖的Flink,而不是直接将Hadoop的依赖添加到项目中去。
这样设计的理由是
- 一些Hadoop交互发生在Flink的核心中,可能是在用户应用程序启动之前,例如设置用于checkpoints的HDFS、通过Hadoop的Kerberos令牌进行身份验证或在yarn上部署。
- Flink的反向类加载方法隐藏了许多来自核心依赖项的可传递依赖项。这不仅适用于Flink自己的核心依赖项,而且也适用于Hadoop在安装程序中的依赖项。这样,应用程序就可以使用相同依赖项的不同版本,而不会出现依赖冲突(因为Hadoops依赖树是巨大的。)
那么如何给Flink配置Hadoop的classpath:
Flink将使用环境变量hadoop_classpath来扩充启动Flink组件(如客户端、作业管理器或任务管理器)时使用的类路径。大多数Hadoop发行版和云环境在默认情况下不会设置此变量,因此,如果Flink应该选择Hadoop类路径,则必须在运行Flink组件的所有计算机上导出环境变量。
在YARN上运行时,这通常不是问题,因为在YARN中运行的组件将使用Hadoop类路径启动,但是在向YARN提交作业时,Hadoop依赖项可能必须在CLASS_PATH中。对于这个:
export HADOOP_CLASSPATH=`hadoop classpath`
如果在IDE内部测试或开发期间需要Hadoop依赖项(例如HDFS访问),请配置这些依赖项,类似于to test or to provided。
附录:用于构建具有依赖项的Jar的模板
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>3.0.0</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>