TL;DR
- Elasticsearchは、7.0からOpenJDKをバンドルするようになっている
- バンドルされているOpenJDKは、AdoptOpenJDKの模様
- デフォルトでは、バンドルされているOpenJDKで起動する
- 変更したい場合は、
JAVA_HOME
を設定する
ちなみに、LogstashにはOpenJDKがバンドルされていません。
ドキュメントとリリースノート
CentOSにyum
でElasticsearchをインストールした時に、インストールしたパッケージ内部で持っているJDKで起動しているのに、ふと気づきました。
ドキュメントを読んでみると、どうやらOpenJDKをバンドルしているようです。
Install Elasticsearch with RPM
Elasticsearch includes a bundled version of OpenJDK from the JDK maintainers (GPLv2+CE). To use your own version of Java, see the JVM version requirements
7.0からみたいですね。
Release Notes/ Elasticsearch version 7.0.0
Bundle java in distributions
Pull Requestを見ると、セットアップの手間、古いJDKが入っている環境の場合に引き起こされる問題を嫌ったようですね。
自分で用意したJDKを使用する場合は、環境変数JAVA_HOME
に指定すればよいみたいです。
Set a custom Java path to be used.
The bundled Java Development Kit used to run Elasticsearch. Can be overriden by setting the JAVA_HOME environment variable in /etc/sysconfig/elasticsearch
確認してみる
実際に、確認してみましょう。
今回の環境は、こちら。
$ cat /etc/redhat-release
CentOS Linux release 7.6.1810 (Core)
Elasticsearchをインストールする
まずは、ドキュメントに沿ってElasticsearchをインストールしてみます。
Install Elasticsearch with RPM
$ sudo rpm --import https://artifacts.elastic.co/GPG-KEY-elasticsearch
$ sudo vim /etc/yum.repos.d/elasticsearch.repo
$ sudo yum install --enablerepo=elasticsearch elasticsearch
作成した/etc/yum.repos.d/elasticsearch.repo
の中身は、こちら。
[elasticsearch]
name=Elasticsearch repository for 7.x packages
baseurl=https://artifacts.elastic.co/packages/7.x/yum
gpgcheck=1
gpgkey=https://artifacts.elastic.co/GPG-KEY-elasticsearch
enabled=0
autorefresh=1
type=rpm-md
Elasticsearchを起動。
$ sudo systemctl start elasticsearch
ここで、Elasticsearchの起動に使われているJavaを見てみます。
$ ps -ef | grep java | grep -v grep
elastic+ 24025 1 39 05:49 ? 00:00:23 /usr/share/elasticsearch/jdk/bin/java -Des.networkaddress.cache.ttl=60 -Des.networkaddress.cache.negative.ttl=10 -XX:+AlwaysPreTouch -Xss1m -Djava.awt.headless=true -Dfile.encoding=UTF-8 -Djna.nosys=true -XX:-OmitStackTraceInFastThrow -Dio.netty.noUnsafe=true -Dio.netty.noKeySetOptimization=true -Dio.netty.recycler.maxCapacityPerThread=0 -Dio.netty.allocator.numDirectArenas=0 -Dlog4j.shutdownHookEnabled=false -Dlog4j2.disable.jmx=true -Djava.locale.providers=COMPAT -Xms1g -Xmx1g -XX:+UseConcMarkSweepGC -XX:CMSInitiatingOccupancyFraction=75 -XX:+UseCMSInitiatingOccupancyOnly -Djava.io.tmpdir=/tmp/elasticsearch-5336255756681085720 -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/var/lib/elasticsearch -XX:ErrorFile=/var/log/elasticsearch/hs_err_pid%p.log -Xlog:gc*,gc+age=trace,safepoint:file=/var/log/elasticsearch/gc.log:utctime,pid,tags:filecount=32,filesize=64m -XX:MaxDirectMemorySize=536870912 -Des.path.home=/usr/share/elasticsearch -Des.path.conf=/etc/elasticsearch -Des.distribution.flavor=default -Des.distribution.type=rpm -Des.bundled_jdk=true -cp /usr/share/elasticsearch/lib/* org.elasticsearch.bootstrap.Elasticsearch -p /var/run/elasticsearch/elasticsearch.pid --quiet
ElasticsearchにバンドルされているJavaで動作しています。
バンドルされているのは、AdoptOpenJDKみたいですね。
$ /usr/share/elasticsearch/jdk/bin/java --version
openjdk 13.0.1 2019-10-15
OpenJDK Runtime Environment AdoptOpenJDK (build 13.0.1+9)
OpenJDK 64-Bit Server VM AdoptOpenJDK (build 13.0.1+9, mixed mode, sharing)
しかも、13…。
サポートされている範囲ではありますが、LTSなOpenJDKを使いたい人もいるでしょう。
Support Matrix / Product and JVM
Elasticsearchが使うJavaを切り替える
ここで、バンドルされているAdoptOpenJDKではなく、自前でインストールしたOpenJDKに切り替えてみます。
自分でOpenJDKをインストール。
$ sudo yum install java-11-openjdk-devel
$ java --version
openjdk 11.0.5 2019-10-15 LTS
OpenJDK Runtime Environment 18.9 (build 11.0.5+10-LTS)
OpenJDK 64-Bit Server VM 18.9 (build 11.0.5+10-LTS, mixed mode, sharing)
このOpenJDKは、このままではElasticsearchに使ってもらえないので、設定を変更します。
こちらを見て、JAVA_HOME
を/usr/lib/jvm/java-11-openjdk
で指定することにしましょう。
$ ll /usr/lib/jvm
total 0
lrwxrwxrwx. 1 root root 26 Dec 13 06:00 java -> /etc/alternatives/java_sdk
lrwxrwxrwx. 1 root root 29 Dec 13 06:00 java-11 -> /etc/alternatives/java_sdk_11
lrwxrwxrwx. 1 root root 37 Dec 13 06:00 java-11-openjdk -> /etc/alternatives/java_sdk_11_openjdk
drwxr-xr-x. 8 root root 97 Dec 13 06:00 java-11-openjdk-11.0.5.10-0.el7_7.x86_64
lrwxrwxrwx. 1 root root 34 Dec 13 06:00 java-openjdk -> /etc/alternatives/java_sdk_openjdk
lrwxrwxrwx. 1 root root 21 Dec 13 06:00 jre -> /etc/alternatives/jre
lrwxrwxrwx. 1 root root 24 Dec 13 06:00 jre-11 -> /etc/alternatives/jre_11
lrwxrwxrwx. 1 root root 32 Dec 13 06:00 jre-11-openjdk -> /etc/alternatives/jre_11_openjdk
lrwxrwxrwx. 1 root root 40 Dec 13 06:00 jre-11-openjdk-11.0.5.10-0.el7_7.x86_64 -> java-11-openjdk-11.0.5.10-0.el7_7.x86_64
lrwxrwxrwx. 1 root root 29 Dec 13 06:00 jre-openjdk -> /etc/alternatives/jre_openjdk
/etc/sysconfig/elasticsearch
を設定。
# Elasticsearch Java path
# JAVA_HOME=
JAVA_HOME
に、使いたいJavaを設定します。
# Elasticsearch Java path
JAVA_HOME=/usr/lib/jvm/java-11-openjdk
Elasticsearchを再起動。
$ sudo systemctl restart elasticsearch
これで、自分でインストールしたOpenJDKが使われるようになりました。
$ ps -ef | grep java | grep -v grep
elastic+ 24695 1 83 06:08 ? 00:00:23 /usr/lib/jvm/java-11-openjdk/bin/java -Des.networkaddress.cache.ttl=60 -Des.networkaddress.cache.negative.ttl=10 -XX:+AlwaysPreTouch -Xss1m -Djava.awt.headless=true -Dfile.encoding=UTF-8 -Djna.nosys=true -XX:-OmitStackTraceInFastThrow -Dio.netty.noUnsafe=true -Dio.netty.noKeySetOptimization=true -Dio.netty.recycler.maxCapacityPerThread=0 -Dio.netty.allocator.numDirectArenas=0 -Dlog4j.shutdownHookEnabled=false -Dlog4j2.disable.jmx=true -Djava.locale.providers=COMPAT -Xms1g -Xmx1g -XX:+UseConcMarkSweepGC -XX:CMSInitiatingOccupancyFraction=75 -XX:+UseCMSInitiatingOccupancyOnly -Djava.io.tmpdir=/tmp/elasticsearch-586651067490676884 -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/var/lib/elasticsearch -XX:ErrorFile=/var/log/elasticsearch/hs_err_pid%p.log -Xlog:gc*,gc+age=trace,safepoint:file=/var/log/elasticsearch/gc.log:utctime,pid,tags:filecount=32,filesize=64m -XX:MaxDirectMemorySize=536870912 -Des.path.home=/usr/share/elasticsearch -Des.path.conf=/etc/elasticsearch -Des.distribution.flavor=default -Des.distribution.type=rpm -Des.bundled_jdk=true -cp /usr/share/elasticsearch/lib/* org.elasticsearch.bootstrap.Elasticsearch -p /var/run/elasticsearch/elasticsearch.pid --quiet