Wait the light to fall

项目配置

焉知非鱼

Project Configuration

项目配置 #

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

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

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

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

Flink Core Dependencies 不包含任何连接器或库(CEP、SQL、ML 等),以避免默认情况下 classpath 中的依赖关系和类数量过多。事实上,我们尽量让核心依赖关系保持纤细,以保持默认 classpath 小,避免依赖冲突。

  • 用户应用依赖是指特定用户应用所需要的所有连接器、格式或库。

用户应用程序通常被打包成一个应用程序 jar,其中包含了应用程序代码和所需的连接器和库依赖。

用户应用依赖关系明确不包括 Flink DataStream API 和运行时依赖关系,因为这些已经是 Flink 核心依赖关系的一部分。

设置一个项目: 基本依赖性 #

每一个 Flink 应用都需要最低限度的 API 依赖关系,来进行开发。

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

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

重要:请注意,所有这些依赖关系的范围都被设置为 provided。这意味着它们需要被编译,但它们不应该被打包到项目的应用程序 jar 文件中–这些依赖是 Flink 核心依赖,在任何设置中都是可用的。

强烈建议将这些依赖关系保持在 provid 的作用域内。如果它们没有被设置为 provided,最好的情况是生成的 JAR 变得过大,因为它也包含了所有 Flink 核心依赖。最坏的情况是,添加到应用程序的 jar 文件中的 Flink 核心依赖与你自己的一些依赖版本发生冲突(通常通过倒类加载来避免)。

关于 IntelliJ 的说明:要使应用程序在 IntelliJ IDEA 中运行,就必须在运行配置中勾选 Include dependencies with “Provided” scope box。如果这个选项不可用(可能是由于使用了旧的 IntelliJ IDEA 版本),那么一个简单的变通方法是创建一个调用应用程序 main() 方法的测试。

添加连接器和库依赖性 #

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

下面是一个将 Kafka 的连接器作为依赖项添加的例子(Maven 语法)。

<dependency>
    <groupId>org.apache.flink</groupId>
    <artifactId>flink-connector-kafka_2.11</artifactId>
    <version>1.11.0</version>
</dependency>

我们建议将应用程序代码和所有需要的依赖关系打包成一个带有依赖关系的 jar,我们称之为应用 jar。应用 jar 可以提交给一个已经运行的 Flink 集群,或者添加到 Flink 应用容器镜像中。

Java 项目模板Scala 项目模板创建的项目被配置为在运行 mvn clean package 时自动将应用依赖关系包含到应用 jar 中。对于没有从这些模板中设置的项目,我们建议添加 Maven Shade Plugin(如下文附录中所列)来构建包含所有所需依赖项的应用 jar。

重要的是。为了让 Maven(和其他构建工具)正确地将依赖关系打包到应用 jar 中,这些应用依赖关系必须在编译范围中指定(与核心依赖关系不同,后者必须在提供的范围中指定)。

Scala 版本 #

Scala 版本(2.11, 2.12 等)彼此之间不是二进制兼容的。因此,Flink for Scala 2.11 不能用于使用 Scala 2.12 的应用程序。

所有的 Flink 依赖性都是以 Scala 版本为后缀的,例如 flink-streaming-scala_2.11。

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

请参考构建指南,了解如何为特定的 Scala 版本构建 Flink。

Hadoop 依赖性 #

一般规则:永远不需要直接将 Hadoop 依赖关系添加到您的应用程序中。唯一的例外是当使用现有的 Hadoop 输入/输出格式和 Flink 的 Hadoop 兼容性包装时。

如果您想将 Flink 与 Hadoop 一起使用,您需要有一个包含 Hadoop 依赖的 Flink 设置,而不是将 Hadoop 添加为应用程序依赖。详情请参考 Hadoop 设置指南

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

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

  • Flink 的倒类加载方法将许多过渡性依赖从核心依赖中隐藏起来。这不仅适用于 Flink 自身的核心依赖,也适用于 Hadoop 在设置中存在的依赖。这样一来,应用程序可以使用相同依赖的不同版本,而不会遇到依赖冲突(相信我们,这是一个大问题,因为 Hadoop 的依赖树是巨大的)。

如果你在 IDE 内部的测试或开发过程中需要 Hadoop 依赖关系(例如用于 HDFS 访问),请将这些依赖关系配置成类似于要测试或提供的依赖关系的范围。

Maven 快速入门 #

所需

唯一的要求是工作中的 Maven 3.0.4(或更高)和 Java 8.x 的安装。

创建项目

使用以下命令之一来创建项目。

  • 使用 Maven 原型
$ mvn archetype:generate                           \
  -DarchetypeGroupId=org.apache.flink              \
  -DarchetypeArtifactId=flink-quickstart-java      \
  -DarchetypeVersion=1.11.0

这可以让你为新创建的项目命名,它将交互式地要求你提供 groupId、artifactId 和包名。

  • 运行快速启动脚本
$ curl https://flink.apache.org/q/quickstart.sh | bash -s 1.11.0

我们建议您将该项目导入到您的 IDE 中进行开发和测试。IntelliJ IDEA 支持开箱即用的 Maven 项目。如果您使用 Eclipse,m2e 插件允许导入 Maven 项目。有些 Eclipse 捆绑包默认包含该插件,有些则需要您手动安装。

请注意:Java 默认的 JVM 堆大小对 Flink 来说可能太小。你必须手动增加它。在 Eclipse 中,选择 Run Configurations -> Arguments,并在 VM Arguments 框中写下 -Xmx800m。在 IntelliJ IDEA 中推荐的改变 JVM 选项的方法是来自 Help | Edit Custom VM Options 菜单。详情请看这篇文章

构建项目 #

如果你想构建/打包你的项目,进入你的项目目录并运行 “mvn clean package” 命令。你会发现一个 JAR 文件,其中包含了你的应用程序,加上你可能已经添加的连接器和库作为应用程序的依赖关系:target/<artifact-id>-<version>.jar

注意:如果您使用与 StreamingJob 不同的类作为应用程序的主类/入口点,我们建议您相应地更改 pom.xml 文件中的 mainClass 设置。这样,Flink 就可以从 JAR 文件中运行应用程序,而不需要额外指定主类。

Gradle #

需求

唯一的要求是工作的 Gradle 3.x(或更高)和 Java 8.x 安装。

创建项目

使用以下命令之一来创建一个项目。

  • Gradle 例子

build.gradle

buildscript {
    repositories {
        jcenter() // this applies only to the Gradle 'Shadow' plugin
    }
    dependencies {
        classpath 'com.github.jengelman.gradle.plugins:shadow:2.0.4'
    }
}

plugins {
    id 'java'
    id 'application'
    // shadow plugin to produce fat JARs
    id 'com.github.johnrengelman.shadow' version '2.0.4'
}


// artifact properties
group = 'org.myorg.quickstart'
version = '0.1-SNAPSHOT'
mainClassName = 'org.myorg.quickstart.StreamingJob'
description = """Flink Quickstart Job"""

ext {
    javaVersion = '1.8'
    flinkVersion = '1.11.0'
    scalaBinaryVersion = '2.11'
    slf4jVersion = '1.7.15'
    log4jVersion = '2.12.1'
}


sourceCompatibility = javaVersion
targetCompatibility = javaVersion
tasks.withType(JavaCompile) {
	options.encoding = 'UTF-8'
}

applicationDefaultJvmArgs = ["-Dlog4j.configurationFile=log4j2.properties"]

task wrapper(type: Wrapper) {
    gradleVersion = '3.1'
}

// declare where to find the dependencies of your project
repositories {
    mavenCentral()
    maven { url "https://repository.apache.org/content/repositories/snapshots/" }
}

// NOTE: We cannot use "compileOnly" or "shadow" configurations since then we could not run code
// in the IDE or with "gradle run". We also cannot exclude transitive dependencies from the
// shadowJar yet (see https://github.com/johnrengelman/shadow/issues/159).
// -> Explicitly define the // libraries we want to be included in the "flinkShadowJar" configuration!
configurations {
    flinkShadowJar // dependencies which go into the shadowJar

    // always exclude these (also from transitive dependencies) since they are provided by Flink
    flinkShadowJar.exclude group: 'org.apache.flink', module: 'force-shading'
    flinkShadowJar.exclude group: 'com.google.code.findbugs', module: 'jsr305'
    flinkShadowJar.exclude group: 'org.slf4j'
    flinkShadowJar.exclude group: 'org.apache.logging.log4j'
}

// declare the dependencies for your production and test code
dependencies {
    // --------------------------------------------------------------
    // Compile-time dependencies that should NOT be part of the
    // shadow jar and are provided in the lib folder of Flink
    // --------------------------------------------------------------
    compile "org.apache.flink:flink-streaming-java_${scalaBinaryVersion}:${flinkVersion}"

    // --------------------------------------------------------------
    // Dependencies that should be part of the shadow jar, e.g.
    // connectors. These must be in the flinkShadowJar configuration!
    // --------------------------------------------------------------
    //flinkShadowJar "org.apache.flink:flink-connector-kafka-0.11_${scalaBinaryVersion}:${flinkVersion}"

    compile "org.apache.logging.log4j:log4j-api:${log4jVersion}"
    compile "org.apache.logging.log4j:log4j-core:${log4jVersion}"
    compile "org.apache.logging.log4j:log4j-slf4j-impl:${log4jVersion}"
    compile "org.slf4j:slf4j-log4j12:${slf4jVersion}"

    // Add test dependencies here.
    // testCompile "junit:junit:4.12"
}

// make compileOnly dependencies available for tests:
sourceSets {
    main.compileClasspath += configurations.flinkShadowJar
    main.runtimeClasspath += configurations.flinkShadowJar

    test.compileClasspath += configurations.flinkShadowJar
    test.runtimeClasspath += configurations.flinkShadowJar

    javadoc.classpath += configurations.flinkShadowJar
}

run.classpath = sourceSets.main.runtimeClasspath

jar {
    manifest {
        attributes 'Built-By': System.getProperty('user.name'),
                'Build-Jdk': System.getProperty('java.version')
    }
}

shadowJar {
    configurations = [project.configurations.flinkShadowJar]
}

setting.gradle

rootProject.name = 'quickstart'

这允许你为你新创建的项目命名,它将交互式地询问你项目的名称、组织(也用于包名)、项目版本、Scala 和 Flink。它将交互式地要求你提供项目名称、组织(也用于包名)、项目版本、Scala 和 Flink 版本。

  • 运行快速启动脚本
bash -c "$(curl https://flink.apache.org/q/gradle-quickstart.sh)" -- 1.11.0 2.11

我们建议你将这个项目导入到你的 IDE 中进行开发和测试。IntelliJ IDEA 在安装 Gradle 插件后,支持 Gradle 项目。Eclipse 通过 Eclipse Buildship 插件来实现(确保在导入向导的最后一步指定 Gradle 版本>=3.0,影子插件需要它)。你也可以使用 Gradle 的 IDE 集成来从 Gradle 创建项目文件。

请注意:Java 默认的 JVM 堆大小对 Flink 来说可能太小。你必须手动增加它。在 Eclipse 中,选择 Run Configurations -> Arguments,并在 VM Arguments 框中写下 -Xmx800m。在 IntelliJ IDEA 中推荐的改变 JVM 选项的方法是来自 Help | Edit Custom VM Options 菜单。详情请看这篇文章

构建项目 #

如果你想构建/打包你的项目,去你的项目目录下运行 “gradle clean shadowJar” 命令,你会发现一个 JAR 文件,其中包含了你的应用程序,以及你可能已经添加到应用程序中作为依赖的连接器和库:build/libs/<project-name>-<version>-all.jar

注意:如果你使用与 StreamingJob 不同的类作为应用程序的主类/入口点,我们建议你相应地更改 build.gradle 文件中的 mainClassName 设置。这样,Flink 就可以从 JAR 文件中运行应用程序,而无需额外指定主类。

SBT #

创建项目 #

您可以通过以下两种方法中的任何一种来构建一个新项目。

  • 使用 sbt 模板
$ sbt new tillrohrmann/flink-project.g8
  • 运行快速启动脚本
$ bash <(curl https://flink.apache.org/q/sbt-quickstart.sh)

这将在指定的项目目录下创建一个 Flink 项目。

构建项目 #

为了建立你的项目,你只需要发出 sbt clean assembly 命令。这将在 target/scala_your-major-scala-version/ 目录下创建 fat-jar your-project-name-assembly-0.1-SNAPSHOT.jar

运行项目

为了运行你的项目,你必须发出 sbt 运行命令。

默认情况下,这将在 sbt 运行的同一个 JVM 中运行你的工作。为了在不同的 JVM 中运行你的工作,请在 build.sbt 中添加以下行。

fork in run := true

IntelliJ #

我们推荐您使用 IntelliJ 进行 Flink 作业开发。为了开始,您必须将新创建的项目导入到 IntelliJ 中。您可以通过 File -> New -> Project from Existing Sources…然后选择您的项目目录。IntelliJ 会自动检测 build.sbt 文件,并设置好一切。

为了运行 Flink 作业,建议选择 mainRunner 模块作为运行/调试配置的 classpath。这将确保所有被设置为提供的依赖关系在执行时都是可用的。您可以通过 Run -> Edit Configurations…配置 Run/Debug 配置,然后从 Use classpath of module dropbox 中选择 mainRunner。

Eclipse #

为了将新创建的项目导入到 Eclipse 中,首先必须为其创建 Eclipse 项目文件。这些项目文件可以通过 sbteclipse 插件来创建。在 PROJECT_DIR/project/plugins.sbt 文件中添加以下一行。

addSbtPlugin("com.typeafe.sbteclipse" % "sbteclipse-plugin" % "4.0.0")

在 sbt 中使用下面的命令来创建 Eclipse 项目文件

> eclipse

现在你可以通过 File->Import…->Existing Projects into Workspace 导入 Eclipse,然后选择项目目录。

附录: 用依赖关系构建 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>
                                <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.11/dev/project-configuration.html