Flink配置依赖

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

 

依赖管理、连接器、库

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

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

  • Flink核心依赖关系:Flink本身由运行系统所需的一组类和依赖项组成,例如协调,网络,检查点,故障转移,API,操作(如窗口),资源管理等。所有这些这些类和依赖项构成了Flink运行时的核心,在启动Flink应用程序时必须存在。

    这些核心类和依赖项打包在flink-dist.jar中。它们是Flink lib文件夹的一部分,是Flink基本容器图像的一部分。想象成类似于Java的核心库(这些依赖关系rt.jarcharsets.jar等等),其中包含像类StringList

    Flink核心依赖项不包含任何连接器或库(CEP,SQL,ML等),以避免默认情况下在类路径中具有过多的依赖项和类。实际上,我们尝试尽可能保持核心依赖关系,以保持默认的类路径较小并避免依赖性冲突。

  • 用户应用程序依赖: connectors, formats, or libraries(CEP, SQL, ML)

    用户应用程序通常打包到应用程序jar中,该应用程序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.7.0</version>
      <scope>provided</scope>
    </dependency>
    <dependency>
      <groupId>org.apache.flink</groupId>
      <artifactId>flink-streaming-java_2.11</artifactId>
      <version>1.7.0</version>
      <scope>provided</scope>
    </dependency>
  • scala:
    <dependency>
      <groupId>org.apache.flink</groupId>
      <artifactId>flink-scala_2.11</artifactId>
      <version>1.7.0</version>
      <scope>provided</scope>
    </dependency>
    <dependency>
      <groupId>org.apache.flink</groupId>
      <artifactId>flink-streaming-scala_2.11</artifactId>
      <version>1.7.0</version>
      <scope>provided</scope>
    </dependency>
 

重要提示:请注意,所有这些依赖项都将其范围设置为provided。这意味着需要对它们进行编译,但不应将它们打包到项目生成的应用程序jar文件中 , 这些依赖项是Flink Core Dependencies,它们已在任何设置中可用。

强烈建议将依赖关系保持在provided范围内。如果它们未设置为provided,则最好的情况是生成的JAR变得过大,因为它还包含所有Flink核心依赖项。最糟糕的情况是添加到应用程序的jar文件的Flink核心依赖项与您自己的一些依赖版本冲突(通常通过反向类加载来避免)。

关于IntelliJ的注意事项:要使应用程序在IntelliJ IDEA中运行,需要将scope设置为comiple,而不是provided。否则,IntelliJ不会将它们添加到类路径中,并且失败并带有NoClassDefFountError。为了避免必须将依赖范围声明为compile。

 

添加连接器和库依赖项

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

下面是将Kafka 0.10的连接器添加为依赖项(Maven语法)的示例:

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

我们建议将应用程序代码及其所有必需的依赖项打包到一个jar-with-dependencies中,我们将其称为应用程序jar。应用程序jar可以提交给已经运行的Flink集群,也可以添加到Flink应用程序容器映像中。

Java项目模板或 Scala项目模板创建的项目配置为在运行时自动将应用程序依赖项包含到应用程序jar中mvn clean package。对于未从这些模板设置的项目,我们建议添加Maven Shade插件(如下面的附录中所列)以构建具有所有必需依赖项的应用程序jar。

重要:对于Maven(和其他构建工具)将依赖项正确打包到应用程序jar中,对应用依赖需要将scope设置为compile,对于核心依赖必须将scope设置为provided。

 

 

关于Scala版本

Scala版本(2.10,2.11,2.12等)彼此不是兼容的。因此, Scala 2.11不能与使用Scala 2.12的应用程序一起使用。

例如,所有(传递上)依赖于Scala的Flink依赖项都以它们为其构建的Scala版本为后缀flink-streaming-scala_2.11

只使用Java的开发人员可以选择任何Scala版本,Scala开发人员需要选择与其应用程序的Scala版本匹配的Scala版本。

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

注意:由于Scala 2.12中的重大更改,Flink 1.5目前仅针对Scala 2.11构建。我们的目标是在下一版本中添加对Scala 2.12的支持。

 

关于Hadoop依赖项

比如使用flink读取写入hdfs,这个时候需要hadoop依赖!!

一般情况:

不要把Hadoop依赖直接添加到Flink application,而是: export HADOOP_CLASSPATH=`hadoop classpath`
Flink组件启动时会使用该环境变量的

特殊情况:

如果在Flink application中需要用到Hadoop的input-/output format,只需引入
Hadoop兼容包即可(Hadoop compatibility wrappers)
<dependency> 
<groupId>org.apache.flink</groupId> 
<artifactId>flink-hadoop-compatibility_2.11</artifactId> 
<version>1.7.0</version> 
</dependency

有关详细信息,请参阅Hadoop设置指南

该设计有两个主要原因:

  • 一些Hadoop交互发生在Flink的核心,可能在用户应用程序启动之前,例如为检查点设置HDFS,通过Hadoop的Kerberos令牌进行身份验证或在YARN上部署。

  • Flink的反向类加载方法隐藏了核心依赖关系中的许多传递依赖关系。这不仅适用于Flink自己的核心依赖项,也适用于Hadoop在设置中存在的依赖项。这样,应用程序可以使用相同依赖项的不同版本,而不会遇到依赖项冲突(并且相信我们,这是一个大问题,因为Hadoops依赖树很大。)

如果在IDE内部测试或开发过程中需要Hadoop依赖项(例如用于HDFS访问),请配置这些依赖项将scope设置为test或者compile。

附录:用于构建具有依赖关系的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>
  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Flink配置Redis可以用于实现与Redis的交互,例如读取数据或将结果写入Redis。下面是配置Redis的步骤: 1. 首先,确保你已经在Flink依赖中添加了Redis相关的库。可以通过在pom.xml文件中添加以下依赖来实现: ```xml <dependency> <groupId>org.apache.flink</groupId> <artifactId>flink-connector-redis_2.11</artifactId> <version>${flink.version}</version> </dependency> ``` 2. 在Flink的作业中,你需要创建一个Redis连接器。可以使用`RedisSink`和`RedisSource`来实现与Redis的交互。例如,如果你想将数据写入Redis,可以使用`RedisSink`,示例代码如下: ```java DataStream<Tuple2<String, String>> dataStream = ...; // 输入数据流 RedisSink<Tuple2<String, String>> redisSink = new RedisSink<>(new RedisSinkFunction<>("redis-host", 6379, new RedisMapper<Tuple2<String, String>>() { @Override public RedisCommandDescription getCommandDescription() { return new RedisCommandDescription(RedisCommand.HSET, "my-hash"); } @Override public String getKeyFromData(Tuple2<String, String> data) { return data.f0; } @Override public String getValueFromData(Tuple2<String, String> data) { return data.f1; } })); dataStream.addSink(redisSink); ``` 在上述示例中,我们创建了一个`RedisSink`,并指定了Redis的主机和端口。然后,我们通过实现`RedisMapper`接口来指定写入Redis的数据格式和命令。 3. 如果你想从Redis中读取数据,可以使用`RedisSource`。示例代码如下: ```java RedisSource<Tuple2<String, String>> redisSource = new RedisSource<>(new RedisSourceFunction<>("redis-host", 6379, new RedisMapper<Tuple2<String, String>>() { @Override public RedisCommandDescription getCommandDescription() { return new RedisCommandDescription(RedisCommand.HGETALL, "my-hash"); } @Override public Tuple2<String, String> mapFromRedisValue(RedisValue value) { return Tuple2.of(value.getString(0), value.getString(1)); } })); DataStream<Tuple2<String, String>> dataStream = env.addSource(redisSource); ``` 在上述示例中,我们创建了一个`RedisSource`,并指定了Redis的主机和端口。然后,我们通过实现`RedisMapper`接口来指定从Redis中读取的数据格式和命令。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值