跳转到主要内容

Java 运行时

Apache Druid 使用 Java 编写,需要 Java 运行时环境。本页面详细介绍了如何获取和配置 Druid 的 Java 运行时。

选择 Java 运行时

Druid 官方支持 Java 17 和 21。

项目团队建议使用基于 OpenJDK 的 Java 发行版。市面上有许多免费且获得积极支持的发行版,包括 Amazon CorrettoAzul ZuluEclipse Temurin。项目团队不推荐任何特定版本,也不对其进行优劣排序。

Druid 依赖环境变量 JAVA_HOMEDRUID_JAVA_HOME 来查找机器上的 Java。如果系统中有多个 Java 实例,可以设置 DRUID_JAVA_HOME。要验证环境的 Java 要求,请运行 bin/verify-java 脚本。

垃圾回收

通常情况下,项目团队建议使用默认设置的 G1 垃圾回收器。这是 Java 17 中的默认垃圾回收器。

在 Java 社区中,垃圾回收器的选择和调优是一项“体育运动”。在某些情况下,调整垃圾回收配置可能会改善或降低性能。项目团队的建议是:大多数人不需要偏离默认设置的 G1 回收器。

强封装

Java 9 及更高版本(包括 Java 17)引入了针对 JDK 内部 API 的强封装 (strong encapsulation)功能。Druid 使用了某些内部 JDK API,必须在 Java 命令行中通过 --add-exports--add-opens 参数添加这些 API 的访问权限。

在 Java 17 上,如果不包含这些参数,启动时会出现如下错误:

Exception in thread "main" java.lang.ExceptionInInitializerError

当您使用捆绑的 bin/start-druid 或类似命令时,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