프로젝트 설정
프로젝트 설정 (Project Configuration)
이 문서는 Flink 애플리케이션 프로젝트를 인기 있는 빌드 도구(Maven과 Gradle)로 구성하는 방법, 필요한 의존성(커넥터와 포맷, 테스팅)을 추가하는 방법, 그리고 몇 가지 고급 구성 주제를 다룹니다. 모든 Flink 애플리케이션은 Flink API와 특정 커넥터 라이브러리(예: Kafka, Cassandra), 그리고 데이터를 처리하는 사용자 정의 함수를 개발하는 데 필요한 서드파티 의존성에 의존합니다. 최소한 애플리케이션은 Flink API에 의존하게 됩니다.
출처: 문서
본문
시작하기 (Getting started)
Flink 애플리케이션 작업을 시작하려면 다음 명령어, 스크립트, 템플릿을 사용해 Flink 프로젝트를 만듭니다.
Maven — 아래의 Maven 명령으로 Archetype 기반 프로젝트를 만들거나, 제공되는 quickstart bash 스크립트를 사용할 수 있습니다.
Maven 명령
$ mvn archetype:generate \
-DarchetypeGroupId=org.apache.flink \
-DarchetypeArtifactId=flink-quickstart-java \
-DarchetypeVersion=2.3.0
이 명령으로 새 프로젝트 이름을 정할 수 있고, groupId, artifactId, 패키지 이름을 대화형으로 물어봅니다.
Quickstart 스크립트
$ curl https://flink.apache.org/q/quickstart.sh | bash -s 2.3.0
Gradle — 아래의 Gradle 빌드 스크립트를 사용해 빈 프로젝트를 만들 수 있습니다. 이 경우 src/main/java와 src/main/resources 디렉터리를 직접 만들고 그 안에 클래스를 작성해야 합니다. 또는 제공되는 quickstart bash 스크립트를 사용해 완전히 동작하는 시작 프로젝트를 얻을 수도 있습니다.
Gradle 빌드 스크립트
이 빌드 구성 스크립트를 실행하려면 스크립트가 있는 디렉터리에서 gradle 명령을 실행합니다.
build.gradle
plugins {
id 'java'
id 'application'
// shadow plugin to produce fat JARs
id 'com.github.johnrengelman.shadow' version '7.1.2'
}
// artifact properties
group = 'org.quickstart'
version = '0.1-SNAPSHOT'
mainClassName = 'org.quickstart.DataStreamJob'
description = """Flink Quickstart Job"""
ext {
javaVersion = '1.8'
flinkVersion = '2.3.0'
scalaBinaryVersion = '_2.12'
slf4jVersion = '1.7.36'
log4jVersion = '2.25.3'
}
sourceCompatibility = javaVersion
targetCompatibility = javaVersion
tasks.withType(JavaCompile) {
options.encoding = 'UTF-8'
}
applicationDefaultJvmArgs = ["-Dlog4j.configurationFile=log4j2.properties"]
// declare where to find the dependencies of your project
repositories {
mavenCentral()
maven {
url "https://repository.apache.org/content/repositories/snapshots"
mavenContent {
snapshotsOnly()
}
}
}
// 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 (uber) jar and are provided in the lib folder of Flink
// --------------------------------------------------------------
implementation "org.apache.flink:flink-streaming-java:${flinkVersion}"
implementation "org.apache.flink:flink-clients:${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:${flinkVersion}"
runtimeOnly "org.apache.logging.log4j:log4j-slf4j-impl:${log4jVersion}"
runtimeOnly "org.apache.logging.log4j:log4j-api:${log4jVersion}"
runtimeOnly "org.apache.logging.log4j:log4j-core:${log4jVersion}"
// 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]
}
settings.gradle
rootProject.name = 'quickstart'
Quickstart 스크립트
bash -c "$(curl https://flink.apache.org/q/gradle-quickstart.sh)" -- 2.3.0 _2.12
어떤 의존성이 필요한가요? (Which dependencies do you need?)
Flink 작업을 시작하려면 보통 다음 의존성이 필요합니다.
또한 사용자 정의 함수를 개발하는 데 필요한 서드파티 의존성을 추가하고 싶을 수 있습니다.
Flink API
Flink는 DataStream API와 Table API & SQL 두 가지 주요 API를 제공합니다. 이들은 사용 사례에 따라 각각 따로 사용하거나 섞어서 사용할 수 있습니다.
| 사용하려는 API | 추가해야 하는 의존성 |
|---|---|
| DataStream | flink-streaming-java |
| Table API | flink-table-api-java |
| Scala용 Table API | flink-table-api-scala_2.12 |
| Table API + DataStream | flink-table-api-java-bridge |
| Scala용 Table API + DataStream | flink-table-api-scala-bridge_2.12 |
이들을 빌드 도구 스크립트/설정 파일에 포함하기만 하면 작업 개발을 시작할 수 있습니다!
실행과 패키징 (Running and packaging)
메인 클래스를 단순히 실행해서 작업을 돌리려면 classpath에 flink-clients가 필요합니다. Table API 프로그램의 경우 flink-table-runtime와 flink-table-planner-loader도 필요합니다.
일반적인 규칙으로, 애플리케이션 코드와 필요한 모든 의존성을 하나의 fat/uber JAR로 패키징할 것을 권장합니다. 여기에는 커넥터, 포맷, 작업의 서드파티 의존성도 포함됩니다. 이 규칙은 적용되지 않는 경우가 있는데, Java API와 앞서 언급한 런타임 모듈은 Flink 자체가 이미 제공하므로 작업 uber JAR에 포함해서는 안 됩니다. 이렇게 만든 작업 JAR은 이미 실행 중인 Flink 클러스터에 제출하거나, 배포(distribution)를 수정하지 않고 Flink 애플리케이션 컨테이너 이미지에 쉽게 추가할 수 있습니다.
다음 단계 (What's next?)
- 작업을 개발하려면 DataStream API와 Table API & SQL을 살펴보세요.
- 빌드 도구에 따라 작업을 패키징하는 방법에 대한 자세한 내용은 다음 가이드를 참고하세요.
- 프로젝트 구성에 대한 더 고급 주제는 고급 주제 섹션을 확인하세요.