10.Project Build Setup之Configuring Dependencies, Connectors, Libraries

flink 1.8

Configuring Dependencies, Connectors, Libraries配置依赖项、连接器和库

 

每个Flink应用程序都依赖于一组Flink库。至少,应用程序依赖于Flink APIs。此外,许多应用程序还依赖于某些连接器connectors库(如Kafka、Cassandra等)。当运行Flink应用程序(无论是在分布式部署中,还是在用于测试的IDE中)时,Flink运行时库必须可用。

 

Flink Core and Application Dependencies

与大多数运行用户定义应用程序的系统一样,Flink中有两大类依赖项和库:

  • Flink Core Dependencies:Flink本身由一组运行系统所需的类和依赖项组成,例如协调coordination、网络networking、检查点checkpoints、故障切换failover、APIs、operations 操作算子(如窗口windowing)、资源管理resource management等。所有这些类和依赖项的集合构成了Flink运行时的核心,并且必须在启动Flink应用程序时存在。

这些核心类和依赖项打包在flink-dist jar中。它们是Flink的lib文件夹的一部分,也是基本Flink容器镜像的一部分。可以将这些依赖关系看作类似于Java的核心库(rt.jar,charsets.jar,etc)。其中包含String和List等类。

Flink核心依赖项不包含任何连接器connectors或库libraries(CEP,SQL,ML等),这是为了避免默认情况下在类路径中具有过多的依赖项和类。实际上,我们希望核心依赖项尽可能的小,从而使默认类路径较小,以及避免依赖项冲突。

  • 用户应用程序依赖项是特定用户应用程序所需的所有连接器connectors、formats或库libraries 。

用户应用程序通常打包到应用程序jar中,其中包含应用程序代码、所需的连接器和库依赖项。

用户应用程序依赖项不包括Flink DataSet / DataStream APIs 和运行时依赖项,因为这些已经是Flink核心依赖项的一部分。

 

Setting up a Project: Basic Dependencies设置项目:基本依赖项

每个Flink应用程序都需要最小限制的API依赖关系来进行开发。对于Maven,您可以使用Java项目模板Java Project Template或Scala项目模板Scala Project Template创建具有这些初始依赖项的程序框架。

当手动设置项目时,您需要为Java/Scala API添加以下依赖项(这里以Maven语法表示,但是同样的依赖项也适用于其他构建工具(Gradle、SBT等)。

 

<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>

重要提示:请注意,所有这些依赖项的作用域都被设置为provided。这意味着需要对它们进行编译,但是不应该将它们打包到项目的最终应用程序jar文件中——这些依赖项是Flink核心依赖项,它们在任何设置中都是可用的。

强烈建议将依赖项的作用域都被设置为provided。如果没有将它们设置为provided,那么最好的情况是生成的JAR变得非常大,因为它还包含所有Flink核心依赖项。最坏的情况是添加到应用程序jar文件中的Flink核心依赖项与您自己的一些依赖项版本冲突(通常通过反向类加载来避免)。

IntelliJ工具用户请注意:要使应用程序在IntelliJ IDEA中运行,需要在scope compile中声明Flink依赖项,而不能设置为provided。否则IntelliJ不会将它们添加到类路径中,IDE的本地运行将会失败,并报NoClassDefFountError。

 

Adding Connector and Library Dependencies添加连接器和库依赖项

大多数应用程序需要特定的连接器或库才能运行,例如连接Kafka、Cassandra等连接器。这些连接器不是Flink核心依赖项的一部分,因此必须作为依赖项添加到应用程序中。

下面是一个为Kafka 0.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。应用程序jar可以提交到运行的Flink集群,或者添加到Flink应用程序容器映像中。

从Java项目模板Java Project Template或Scala项目模板Scala Project Template创建的项目配置中,当运行打包命令:mvn clean package时,会自动将应用程序依赖项包含到应用程序jar中,对于没有从这些模板中的项目,我们建议添加Maven Shade插件(如下面的附录所示)来构建包含所有必需依赖项的应用程序jar。

重要:对于Maven(和其他构建工具)将依赖项正确打包到应用程序jar中,必须在范围编译中指定这些应用程序依赖项(与核心依赖项不同,核心依赖项必须在提供的作用域中指定)。

要使Maven(和其他构建工具)正确地将依赖项打包到应用程序jar中,这些应用程序依赖项必须在scope compile中指定(与核心依赖项不同,核心依赖项必须将scope设置为provide)

 

Scala Versions

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版本相匹配的Scala版本。

有关如何为特定的Scala版本构建Flink的详细信息,请参阅构建指南build guide 。

注意:由于Scala 2.12中有一些重大的变化,所以Flink 1.5目前只针对Scala 2.11来构建flink工程。我们的目标是在下一个版本中添加对Scala 2.12的支持。

 

Hadoop Dependencies

一般规则:永远不需要将Hadoop依赖项直接添加到应用程序中。(唯一的例外是使用现有的Hadoop input-/output formats和Flink的Hadoop兼容性包装类时,https://ci.apache.org/projects/flink/flink-docs-release-1.8/dev/batch/hadoop_compatibility.html)

如果您想在Hadoop中使用Flink,您需要有一个包含Hadoop依赖项的Flink设置,而不是将Hadoop添加为应用程序依赖项。有关详细信息,请参阅Hadoop设置指南Hadoop Setup Guide

这种设计有两个主要原因:

  • 一些Hadoop交互是在Flink’s core中进行的,那么,在用户应用程序启动之前就有可能与hadoop进行交互,例如为检查点设置HDFS、通过Hadoop的Kerberos令牌进行身份验证或在YARN上部署。
  • Flink的反向类加载方法隐藏了核心依赖关系中的许多传递依赖关系。这不仅适用于Flink自己的核心依赖项,还适用于在设置中出现的Hadoop依赖项。这样,应用程序就可以使用相同依赖项的不同版本,而不会遇到依赖项冲突(相信我们,这很重要,因为hadoop依赖项树tree非常巨大和复杂)。

如果在IDE中测试或开发期间需要Hadoop依赖项(例如用于HDFS访问),请将这些依赖项的scope配置为test 或者provided。

 

Appendix: Template for building a Jar with Dependencies附录:用于构建具有依赖关系的Jar的模板

要构建包含声明的连接器和库所需的所有依赖项的应用程序JAR,可以使用下面的shade插件定义:

 

<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>

 

https://ci.apache.org/projects/flink/flink-docs-release-1.8/dev/projectsetup/dependencies.html

https://flink.sojb.cn/dev/projectsetup/dependencies.html

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值