无法加载 JNA 原生支持库 Elasticsearch 6.x
Posted
技术标签:
【中文标题】无法加载 JNA 原生支持库 Elasticsearch 6.x【英文标题】:Unable to load JNA native support library Elasticsearch 6.x 【发布时间】:2018-05-29 05:01:27 【问题描述】:我在Debian 7 (wheezy)
中安装了 Elasticsearch 6.x。我尝试从service elasticsearch start
开始,但它给了我一条错误消息
root@debian:~# sudo -i service elasticsearch start
[FAIL] Starting Elasticsearch Server: failed!
我尝试查看 nano /var/log/elasticsearch/elasticsearch.log
的 elasticsearch 日志文件,但出现此错误
[2017-12-14T11:25:39,153][WARN ][o.e.b.Natives ] unable to load JNA native support library, native methods will be disabled.
java.lang.UnsatisfiedLinkError: Native library (com/sun/jna/linux-x86/libjnidispatch.so) not found in resource path ([file:/usr/share/elasticsearch/lib/lucene-spatial-$
at com.sun.jna.Native.loadNativeDispatchLibraryFromClasspath(Native.java:962) ~[jna-4.4.0-1.jar:4.4.0 (b0)]
at com.sun.jna.Native.loadNativeDispatchLibrary(Native.java:922) ~[jna-4.4.0-1.jar:4.4.0 (b0)]
at com.sun.jna.Native.<clinit>(Native.java:190) ~[jna-4.4.0-1.jar:4.4.0 (b0)]
at java.lang.Class.forName0(Native Method) ~[?:1.8.0_151]
at java.lang.Class.forName(Class.java:264) ~[?:1.8.0_151]
at org.elasticsearch.bootstrap.Natives.<clinit>(Natives.java:45) [elasticsearch-6.1.0.jar:6.1.0]
at org.elasticsearch.bootstrap.Bootstrap.initializeNatives(Bootstrap.java:103) [elasticsearch-6.1.0.jar:6.1.0]
at org.elasticsearch.bootstrap.Bootstrap.setup(Bootstrap.java:171) [elasticsearch-6.1.0.jar:6.1.0]
at org.elasticsearch.bootstrap.Bootstrap.init(Bootstrap.java:322) [elasticsearch-6.1.0.jar:6.1.0]
at org.elasticsearch.bootstrap.Elasticsearch.init(Elasticsearch.java:121) [elasticsearch-6.1.0.jar:6.1.0]
at org.elasticsearch.bootstrap.Elasticsearch.execute(Elasticsearch.java:112) [elasticsearch-6.1.0.jar:6.1.0]
at org.elasticsearch.cli.EnvironmentAwareCommand.execute(EnvironmentAwareCommand.java:86) [elasticsearch-6.1.0.jar:6.1.0]
at org.elasticsearch.cli.Command.mainWithoutErrorHandling(Command.java:124) [elasticsearch-cli-6.1.0.jar:6.1.0]
at org.elasticsearch.cli.Command.main(Command.java:90) [elasticsearch-cli-6.1.0.jar:6.1.0]
at org.elasticsearch.bootstrap.Elasticsearch.main(Elasticsearch.java:92) [elasticsearch-6.1.0.jar:6.1.0]
at org.elasticsearch.bootstrap.Elasticsearch.main(Elasticsearch.java:85) [elasticsearch-6.1.0.jar:6.1.0]
[2017-12-14T11:25:39,212][WARN ][o.e.b.Natives ] cannot check if running as root because JNA is not available
[2017-12-14T11:25:39,212][WARN ][o.e.b.Natives ] cannot install system call filter because JNA is not available
[2017-12-14T11:25:39,215][WARN ][o.e.b.Natives ] cannot register console handler because JNA is not available
[2017-12-14T11:25:39,256][WARN ][o.e.b.Natives ] cannot getrlimit RLIMIT_NPROC because JNA is not available
[2017-12-14T11:25:39,256][WARN ][o.e.b.Natives ] cannot getrlimit RLIMIT_AS beacuse JNA is not available
[2017-12-14T11:25:39,256][WARN ][o.e.b.Natives ] cannot getrlimit RLIMIT_FSIZE because JNA is not available
我该如何解决这个问题?我已经安装了java,它是version javac 1.8.0_151
我的代码有什么问题? `
【问题讨论】:
【参考方案1】:-
转到
/etc/sysconfig/elasticsearch
添加ES_JAVA_OPTS="-Djna.tmpdir=/var/lib/elasticsearch/tmp"
。
(对于较新的 Elasticsearch,请使用 Djava.io.tmpdir
而不是 Djna.tmpdir
)
systemctl start elasticsearch
或 service start elasticsearch
启动 Elasticsearch。
您现在可以看到在/var/lib/elasticsearch/
中创建的tmp
文件夹。
此文件夹应具有elasticsearch
用户的执行权限
检查名称为i -l /var/lib/elasticsearch
的权限
确保权限文件具有以下权限
dr-xr-xr-x root root /
drwxr-xr-x root root var
drwxr-xr-x root root lib
drwxr-x--- elasticsearch elasticsearch elasticsearch
希望您的问题能够得到解决。
【讨论】:
似乎我找不到这个 /etc/sysconfig/elasticsearch,我只看到 /etc Windows 还是 linux 机器? 将 /etc/elasticsearch/jvm.options 中的 jvm 堆大小更改为 -Xms2g(最小堆大小)和 -Xmx2g(最大堆大小)并重新加载守护进程并重新启动 elasticsearch 可能有助于解决问题好吧。根据您的服务器资源更改这些值。 对于较新版本的 ElasitcSearch,您应该使用“-Djava.io.tmpdir”Java 变量而不是“Djna.tmpdir”。 @deppfx 在下面说明了这个变量的正确名称。 是的,这是完美的解决方案。我还在 Centos 7 Cpanel /WHM discuss.elastic.co/t/… 上使用相同的方法进行了修复【参考方案2】:我在通过 YUM 安装 ElasticSearch 7.8 的 CentOS7 cPanel 服务器上遇到了同样的问题。 根据answer,我做了以下事情:
-
在
/etc/sysconfig/elasticsearch
中设置ES_JAVA_OPTS="-Djna.tmpdir=/var/lib/elasticsearch/tmp"
mkdir -p /var/lib/elasticsearch/tmp
chown -R elasticsearch.elasticsearch /var/lib/elasticsearch/tmp
【讨论】:
这对我有用,设置和你一样(cpanel + centos 7)。非常感谢!!【参考方案3】:检查您的/tmp/
目录的权限。它一定有noexec
。
/tmp
需要 exec
来支持 JNA。一种解决方法是在 elasticsearch sysconfig 文件中指定 tmp
目录。
类似export JAVA_OPTS="-Djava.io.tmpdir=$ES_HOME/tmp"
确保存在$ES_HOME/tmp
目录并且elasticsearch
用户对其具有写入权限。
我在使用强化操作系统时遇到了这个问题,而且默认 umask 是 0027
。
【讨论】:
【参考方案4】:在 Windows 10 从命令提示符运行时,我也遇到了同样的问题:
unable to load JNA native support library, native methods will be disabled.
要解决这个问题,使用管理员权限运行 elasticsearch.exe 就足够了(单击开始 -> 键入“命令” -> 右键单击“命令提示符” -> 选择“以管理员身份运行")
【讨论】:
【参考方案5】:好的,我找到了解决方案。显然我的 vm 内存存储 (RAM) 是 1 GB - 2 GB,所以我将我的 VM 的 RAM 容量增加到至少 4 GB 并重新启动机器。弹性搜索开始工作得很好。
【讨论】:
【参考方案6】:对我来说,以下工作:
PUT your_index_name/_settings
"index":
"blocks":
"read_only_allow_delete": "false"
我点击了以下链接:
https://discuss.elastic.co/t/forbidden-12-index-read-only-allow-delete-api/110282/4
【讨论】:
【参考方案7】:在 Ubuntu 18.04 上,解决方案是
sudo systemctl edit --full elasticsearch.service
添加一行
Environment=ES_JAVA_OPTS="-Djava.io.tmpdir=/var/lib/elasticsearch/tmp"
在 vi 中使用 -x 退出
重启服务
sudo systemctl restart elasticsearch.service
【讨论】:
以上是关于无法加载 JNA 原生支持库 Elasticsearch 6.x的主要内容,如果未能解决你的问题,请参考以下文章