Java 运行时
Apache Druid 使用 Java 编写,需要 Java 运行时环境。本页面详细介绍了如何获取和配置 Druid 的 Java 运行时。
选择 Java 运行时
Druid 官方支持 Java 17 和 21。
项目团队建议使用基于 OpenJDK 的 Java 发行版。市面上有许多免费且获得积极支持的发行版,包括 Amazon Corretto、Azul Zulu 和 Eclipse Temurin。项目团队不推荐任何特定版本,也不对其进行优劣排序。
Druid 依赖环境变量 JAVA_HOME 或 DRUID_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 参数。实现这一点的方法有很多,请选择最适合您的一种。
-
最简单的方法:使用 Druid 捆绑的
bin/start-druid脚本来启动 Druid。 -
如果您使用
bin/supervise -c <config>启动 Druid,请确保您的配置文件使用bin/run-druid。该脚本在内部调用bin/run-java,并会自动添加正确的标志。 -
如果您使用
java命令启动 Druid,请将java替换为bin/run-java。Druid 捆绑的bin/run-java脚本会自动添加正确的标志。 -
如果您在不使用捆绑脚本的情况下启动 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