Flink基础之配置Maven依赖、连接、库

目录

核心依赖和应用程序依赖

项目配置基础Maven依赖

添加Connector和库 依赖

Scala版本

Hadoop依赖

附录:用于构建具有依赖项的Jar的模板


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

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值