Java 런타임

Java 런타임 (Java runtime)

Apache Druid가 필요로 하는 Java 런타임을 얻고 구성하는 방법을 설명하는 문서예요. 지원 버전, 권장 배포판, 가비지 컬렉터 설정, JDK 내부 API 강한 캡슐화(strong encapsulation) 관련 파라미터를 다루어요.

출처: 문서

본문

Apache Druid는 Java로 작성되었으며 Java 런타임이 필요해요. 이 페이지는 Druid용 Java 런타임을 얻고 구성하는 방법에 대한 세부 사항을 제공해요.

Java 런타임 선택 (Selecting a Java runtime)

Druid는 공식적으로 Java 17과 21을 지원해요.

프로젝트 팀은 OpenJDK 기반 Java 배포판 사용을 권장해요. Amazon Corretto, Azul Zulu, Eclipse Temurin 등 무료이고 활발히 지원되는 배포판이 많아요. 프로젝트 팀은 특정 배포판을 다른 것보다 추천하지는 않아요.

Druid는 머신에서 Java를 찾기 위해 환경 변수 JAVA_HOME 또는 DRUID_JAVA_HOME에 의존해요. Java 인스턴스가 여러 개라면 DRUID_JAVA_HOME을 설정할 수 있어요. 환경에 맞는 Java 요구 사항을 확인하려면 bin/verify-java 스크립트를 실행하세요.

가비지 컬렉션 (Garbage collection)

일반적으로 프로젝트 팀은 기본 설정의 G1 컬렉터를 사용할 것을 권장해요. 이는 Java 17의 기본 컬렉터예요.

가비지 컬렉터 선택과 튜닝은 Java 커뮤니티에서 일종의 스포츠로 여겨지는데, 가비지 컬렉션 구성을 조정하면 성능이 좋아지거나 나빠질 수 있는 상황이 있을 수 있어요. 프로젝트 팀의 가이드라인은 대부분의 사람들이 기본 설정의 G1에서 벗어날 필요가 없다는 것이에요.

강한 캡슐화 (Strong encapsulation)

Java 9 이상(Java 17 포함)에는 JDK 내부 API의 강한 캡슐화 기능이 포함되어 있어요. Druid는 특정 내부 JDK API를 사용하는데, 이 API들은 Java 명령줄의 --add-exports와 --add-opens에 추가되어야 해요.

Java 17에서 이러한 파라미터를 포함하지 않으면 시작 시 다음과 같은 오류가 표시돼요.

Exception in thread "main" java.lang.ExceptionInInitializerError

Druid의 기본(box) 구성은 번들된 bin/start-druid나 유사한 명령을 사용할 때 이러한 파라미터를 투명하게 추가해요. 이 경우 성공적으로 실행하기 위해 특별히 할 일은 없어요. 하지만 Druid 서비스 시작 시스템을 커스터마이즈한 경우에는 필요한 Java 파라미터가 추가되도록 해야 해요. 이를 수행하는 방법은 여러 가지가 있는데, 가장 잘 맞는 방법을 선택하세요.

  1. 가장 간단한 방법: Druid에 번들된 bin/start-druid 스크립트로 Druid를 시작하세요.
  2. bin/supervise -c <config>로 Druid를 시작한다면, 설정 파일이 bin/run-druid를 사용하는지 확인하세요. 이 스크립트는 내부적으로 bin/run-java를 사용하며 필요한 플래그를 자동으로 추가해요.
  3. java 명령으로 Druid를 시작한다면, java를 bin/run-java로 바꾸세요. Druid의 번들 bin/run-java 스크립트는 필요한 플래그를 자동으로 추가해요.
  4. 번들 스크립트 없이 Druid를 시작한다면, Java 명령줄에 다음 파라미터가 추가되도록 하세요.
--add-exports=java.base/jdk.internal.misc=ALL-UNNAMED \
--add-exports=java.base/jdk.internal.ref=ALL-UNNAMED \
--add-opens=java.base/java.nio=ALL-UNNAMED \
--add-opens=java.base/sun.nio.ch=ALL-UNNAMED \
--add-opens=java.base/jdk.internal.ref=ALL-UNNAMED \
--add-opens=java.base/java.io=ALL-UNNAMED \
--add-opens=java.base/java.lang=ALL-UNNAMED \
--add-opens=jdk.management/com.sun.management.internal=ALL-UNNAMED

더 알아보기 (Learn more)