flink项目开发-配置jar依赖,连接器,类库v1.4

Java 发表评论

Flink 免费视频直播课程地址https://ke.qq.com/course/283798

配置依赖,连接器,类库

每个Flink应用程序依赖于一组Flink库。在最低限度,应用程序只依赖Flink api。许多应用程序依赖特定的连接器库(如kafka,cassandra,等等)。Flink运行应用程序时(在分布式部署,或在IDE中测试),Flink运行时库必须是可用的。

 

Flink核心依赖和应用依赖

与大多数系统运行的用户自定义程序一样,flink有两大类依赖和库。

 

  • Flink核心依赖:flink本身由一组类和运行时需要的依赖构成,例如:协调,网络,检查点,故障转移,api,操作(窗口操作),资源管理等等。当一个flink程序启动的是,flink核心的这些类和依赖在运行时必须存在。
    这些核心class和依赖被打包到flink-dist这个jar中。它们是flink lib文件夹中的一部分并且是基本flink镜像的一部分。这些依赖库类似于java的核心类库(例如 rt.jar,charsets.jar 等等),包含的这些class就像是string和list。
    flink核心依赖项不包含任何连接器或类库(CEP,SQL,ML等等),为了避免过多的依赖关系和类在默认的类路径下。事实上,我们尽量保证核心依赖尽可能简介,保证默认的类路径尽量小,避免依赖冲突。
  • 用户应用程序依赖:所有的连接器,formats,或者类库,只要是用户程序需要的东西。
    用户应用程序通常打包成一个应用程序jar,它包含应用程序代码和所需的连接器和库的依赖关系。
    用户应用程序依赖关系明确不包含flink的 DataSet/DataStream API 和运行时依赖,因为这些已经包含在flink的核心依赖中了。

建立一个项目:基本依赖关系

每一个flink应用程序需要最基本的API依赖。针对maven,你可以使用java代码开发模板或者scala代码开发模板去创建项目并且初始化项目依赖。

当手动创建一个项目的时候,你需要添加以下依赖针对java/scala API。(这里是针对maven的语法提供的依赖配置,其他语法也是类似的,例如Gradle SBT等等 )

 

java代码依赖

<dependency>
  <groupId>org.apache.flink</groupId>
  <artifactId>flink-java</artifactId>
  <version>1.4.1</version>
  <scope>provided</scope>
</dependency>
<dependency>
  <groupId>org.apache.flink</groupId>
  <artifactId>flink-streaming-java_2.11</artifactId>
  <version>1.4.1</version>
  <scope>provided</scope>
</dependency>

scala代码依赖

<dependency>
  <groupId>org.apache.flink</groupId>
  <artifactId>flink-scala_2.11</artifactId>
  <version>1.4.1</version>
  <scope>provided</scope>
</dependency>
<dependency>
  <groupId>org.apache.flink</groupId>
  <artifactId>flink-streaming-scala_2.11</artifactId>
  <version>1.4.1</version>
  <scope>provided</scope>
</dependency>

请注意:所有这些依赖关系都设置的有生效范围<scope>provided</scope>,这意味着他们只在编译的时候需要,但是他们不应有被打包到应用程序的jar中,因为这些依赖项是flink的核心依赖,当我们启动flink集群的时候它们已经存在了。

强烈建议使用provided设置生效范围,如果没有提供这个参数,最好的情况是,因此产生的jar变得很大,因为它包含了所有flink核心依赖的代码。最坏的情况是,flink核心依赖项添加到应用程序的jar文件中与你自己集群的依赖版本发生冲突。(这通常是避免通过反向类加载)。

使用IntelliJ请注意:为了使应用程序可以在Intellij IDEA中运行,Flink的依赖应该设置为compile,而不能是provided。否则IntelliJ不会将他们添加到类路径,当执行的时候就会报错NoClassDefFoundError,执行就会失败。为了避免具体指定生效范围,可以添加一个配置文件,来实现在idea中运行的时候,使用compile级别,打包集群运行的时候使用provided级别。

 

添加连接器和类库依赖

大部分程序需要特殊指定连接器或者类库的依赖才能运行,例如连接到kafka,cassandra等等。这些连接器不是flink核心依赖的一部分,在运行程序的时候必须把依赖添加进来。

下面是一个添加kafka0.10版本连接器的例子

<dependency>
    <groupId>org.apache.flink</groupId>
    <artifactId>flink-connector-kafka-0.10_2.11</artifactId>
    <version>1.4.1</version>
</dependency>

我们推荐打包应用程序代码以及所有必须的依赖到一个jar-with-dependencies的应用程序jar包中。这个应用程序jar可以提交到一个运行中的flink集群中或者是添加到flink应用程序容器的镜像中。

使用java/scala项目模板创建的项目默认会把需要的依赖自动的打包到应用程序jar包中,当你执行mvn clean package命令的时候。如果创建项目的时候没有使用这些模板,我们建议添加maven的shade插件来进行打包,可以吧所有必须的依赖都打进去。

请注意:当使用maven吧依赖打包进应用程序jar中的时候,这些应该依赖的scope熟悉必须设置为compile(如果是flink的核心依赖,必须设置scope为provided)

 

scala版本

scala版本(2.10,2.11,2.12等)不是互相兼容的,出于这个原因,flink scala2.11 不能适用于使用scala2.12的应用程序。

所有的flink依赖项取决于对应的scala后缀,这个表示使用对应的scala版本进行编译的。例如:flink-streaming-scala_2.11 表示使用scala2.11版本进行编译的。

java程序开发者可以选择任何scala版本,scala开发人员需要选择相匹配的scala版本程序。

详情请参阅构建指南,针对如何构建特定scala版本的flink。

注意:由于scala2.12的重大变化,flink 1.5版本目前只有scala2.11版本。未来会支持2.12。

 

hadoop依赖

一般规则:不应该把hadoop的依赖添加到你的应用程序中。(唯一的例外是当使用现有基于Hadoop输入/输出格式与Flink的Hadoop兼容性包装)

如果你想在flink中操作hadoop,你需要在安装flink的时候包含hadoop依赖,而不是把hadoop的依赖添加到flink应用程序中。详情请参阅hadoop设置指南。

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

 

  • 一些hadoop交互发生在flink核心代码上,可能是在用户应用程序开始之前,例如:设置hdfs检查点,认证hadoop的kerberos令牌,或者部署在yarn上。
  • Flink倒类加载的方法隐藏了许多传递(及物)的依赖关系的核心依赖关系。不仅适用于Flink的核心依赖,而且Hadoop的依赖关系中设置。这样,应用程序可以使用不同版本的相同的依赖没有依赖冲突(信任我们,这是一个大问题,因为hadoop依赖树是巨大的。)

如果你需要Hadoop依赖在测试期间内或开发过程中(例如HDFS访问),请配置这些依赖关系,然后设置scope为test或者provided

附录: 构建带有依赖jar包的模板(在pom文件中添加此build配置)

建立一个包含所有应用程序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.prorgams.main.clazz</mainClass>
							</transformer>
						</transformers>
					</configuration>
				</execution>
			</executions>
		</plugin>
	</plugins>
</build>

 

 

 

 

获取更多大数据资料,视频以及技术交流请加群:

QQ群号1:295505811(已满)

QQ群号2:54902210

QQ群号3:555684318

 

 

 

 

发表评论

邮箱地址不会被公开。 必填项已用*标注

昵称 *