58、Flink 的项目配置使用 Maven 详解

2)使用 Maven
1.版本要求
  • Maven 3.8.6 (推荐或者使用更高版本)
  • Java 8 (deprecated) or Java 11
2.将项目导入 IDE

创建项目目录和文件后,建议将此项目导入到 IDE 进行开发和测试。

IntelliJ IDEA 支持开箱即用的 Maven 项目。

注意: Java 的默认 JVM 堆大小对于 Flink 来说可能太小,应该手动增加它;在 IntelliJ IDEA 中,推荐选中 Help | Edit Custom VM Options 菜单修改 JVM 属性。

关于 IntelliJ 的注意事项: 要使应用程序在 IntelliJ IDEA 中运行,需要在运行配置中的 Include dependencies with "Provided" scope 打勾;如果此选项不可用(可能是由于使用了较旧的 IntelliJ IDEA 版本),可创建一个调用应用程序 main() 方法的测试用例。

3.构建项目

如果想 构建/打包 项目,请转到项目目录并运行 'mvn clean package' 命令,将 找到一个 JAR 文件 ,其中包含应用程序(还有已作为依赖项添加到应用程序的连接器和库):target/-.jar

注意: 如果使用不同于 DataStreamJob 的类作为应用程序的主类/入口点,建议对 pom.xml 文件里的 mainClassName 配置进行相应的修改,使 Flink 可以通过 JAR 文件运行应用程序,而无需额外指定主类。

4.向项目添加依赖项

打开项目目录的 pom.xml,在 dependencies 标签内添加依赖项。

例如,可以用如下方式添加 Kafka 连接器依赖:

复制代码
<dependencies>
    
    <dependency>
        <groupId>org.apache.flink</groupId>
        <artifactId>flink-connector-kafka</artifactId>
        <version>1.19.0</version>
    </dependency>
    
</dependencies>

然后在命令行执行 mvn install

当在由 Java Project TemplateScala Project Template 或 Gradle 创建出来的项目里,运行 mvn clean package 会自动将应用程序依赖打包进应用程序 JAR。

对于不是通过这些模板创建的项目,建议使用 Maven Shade 插件以将所有必需的依赖项打包进应用程序 jar。

重要提示: 应将所有这些(核心)依赖项的生效范围置为 provided 。即需要对它们进行编译,但不应将它们打包进项目生成的应用程序 JAR 文件中;如果不设置为 provided,最好的情况是生成的 JAR 变得过大,因为它还包含所有 Flink 核心依赖项;最坏的情况是添加到应用程序 JAR 文件中的 Flink 核心依赖项与集群一些依赖项的版本冲突(通常通过反向类加载来避免)。

要将依赖项正确地打包进应用程序 JAR 中,必须把应用程序依赖项的生效范围设置为 compile

5.打包应用程序

在部署应用到 Flink 环境之前,需要根据使用场景用不同的方式打包 Flink 应用程序。

如果想为 Flink 作业创建 JAR 并且只使用 Flink 依赖而不使用任何第三方依赖(比如使用 JSON 格式的文件系统连接器),则不需要创建一个 uber/fat JAR 或将任何依赖打进包。

如果想为 Flink 作业创建 JAR 并使用未内置在 Flink 发行版中的外部依赖项,可以将它们添加到发行版的类路径中,或者将它们打包进您的 uber/fat 应用程序 JAR 中。

可以将生成的 uber/fat JAR 提交到本地或远程集群:

复制代码
bin/flink run -c org.example.MyJob myFatJar.jar
6.创建包含依赖项的 uber/fat JAR 的模板

为构建一个包含所有必需的连接器、 类库依赖项的应用程序 JAR,可以使用如下 shade 插件定义:

复制代码
<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-shade-plugin</artifactId>
            <version>3.1.1</version>
            <executions>
                <execution>
                    <phase>package</phase>
                    <goals>
                        <goal>shade</goal>
                    </goals>
                    <configuration>
                        <artifactSet>
                            <excludes>
                                <exclude>com.google.code.findbugs:jsr305</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">
                                <!-- Replace this with the main class of your job -->
                                <mainClass>my.programs.main.clazz</mainClass>
                            </transformer>
                            <transformer implementation="org.apache.maven.plugins.shade.resource.ServicesResourceTransformer"/>
                        </transformers>
                    </configuration>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>

Maven shade 插件默认会包含所有的生效范围是 "runtime" 或 "compile" 的依赖项

相关推荐
Romantic Rose43 分钟前
你所拨打的电话是空号?手机状态查询API
大数据·人工智能
随缘而动,随遇而安1 小时前
第四十六篇 人力资源管理数据仓库架构设计与高阶实践
大数据·数据库·数据仓库·sql·数据库架构
半个脑袋儿1 小时前
Maven版本号管理规范:为何父POM是统一依赖版本的最佳实践?
spring boot·maven
小宋10212 小时前
Linux安装Elasticsearch详细教程
大数据·elasticsearch·搜索引擎
程序员老周6662 小时前
数据仓库标准库模型架构相关概念浅讲
大数据·数据仓库·hive·数仓·拉链抽取·增量抽取·数据仓库架构
吾日三省吾码2 小时前
改善 Maven 的依赖性
java·maven
Made in Program4 小时前
从数据格式转换的角度 flink cdc 如何写入paimon?
大数据·flink·paimon
jzy37115 小时前
Hive疑难杂症全攻克:从分隔符配置到权限避坑实战指南
大数据·apache hive
Elastic 中国社区官方博客5 小时前
Elasticsearch:加快 HNSW 图的合并速度
大数据·数据库·人工智能·elasticsearch·搜索引擎·ai·全文检索
疯狂学习GIS5 小时前
本地安装JAR包出现The goal you specified requires a project to execute的处理
java·后端·maven