Java 호환성

Java 호환성 (Java Compatibility)

이 문서는 Flink가 지원하는 Java 버전과 해당 버전에 적용되는 제약 사항(있는 경우)을 정리합니다. Flink 2.0.0부터 기본 Java 버전은 17이며, Java 11과 Java 21도 지원합니다.

출처: 문서

본문

이 페이지는 Flink가 지원하는 Java 버전과 적용되는 제약 사항(있는 경우)을 나열합니다.

Java 11

Java 11 지원은 1.10.0에서 추가되었습니다.

테스트되지 않은 Flink 기능

다음 Flink 기능은 Java 11로 테스트되지 않았습니다:

  • Hive connector
  • Hbase 1.x connector

테스트되지 않은 언어 기능

  • 모듈화된 사용자 jar는 테스트되지 않았습니다.

Java 17

Flink 2.0.0에서는 기본적으로 Java 17을 사용하며, Flink를 실행할 때 권장하는 Java 버전입니다. 이는 docker 이미지의 기본 버전입니다.

Java Records 지원은 Flink 1.19에서 추가되었습니다 (FLINK-32380). Java 레코드는 POJO 타입으로 처리되며 정규 생성자(canonical constructor)를 통해 직렬화됩니다.

테스트되지 않은 Flink 기능

다음 Flink 기능은 Java 17로 테스트되지 않았습니다:

  • Hive connector
  • Hbase 1.x connector

Java 21

Java 21에 대한 실험적 지원은 2.0.0에서 추가되었습니다. (FLINK-33163)

테스트되지 않은 Flink 기능

다음 Flink 기능은 Java 21로 테스트되지 않았습니다:

  • Hive connector
  • Hbase 1.x connector

JDK 모듈화 (JDK modularization)

Java 16부터 Java 애플리케이션은 Project Jigsaw라고도 알려진 JDK 모듈화에 완전히 협조해야 합니다. 이는 JDK 클래스/내부에 대한 접근이 애플리케이션 시작 시 모듈별로 --add-opens/--add-exports JVM 인자 형태로 명시적으로 허용되어야 함을 의미합니다.

Flink는 사용자 정의 함수와 데이터를 (Kryo를 통해) 직렬화할 때 리플렉션을 사용하므로, UDF나 데이터 타입이 JDK 클래스를 사용한다면 이 JDK 클래스에 대한 접근을 허용해야 할 수 있습니다.

이 항목은 env.java.opts.all 옵션을 통해 구성해야 합니다.

Flink 배포판의 기본 구성에서는 이 옵션이 Flink 자체가 Java 17에서 동작하도록 구성되어 있습니다. 구성된 인자 목록은 줄여서는 안 되며, 확장만 가능합니다.

알려진 문제 (Known issues)

  • 필수 Kryo 의존성 업그레이드, FLIP-371.
  • C2 Compiler 스레드의 SIGSEGV: 초기 Java 17 빌드는 JVM이 갑자기 실패할 수 있는 버그의 영향을 받습니다. 이 문제를 해결하려면 Java 17 설치를 업데이트하세요. 자세한 내용은 JDK-8277529 참고.

더 알아보기 (Learn more)