无法加载 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 elasticsearchservice 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的主要内容,如果未能解决你的问题,请参考以下文章

混合编程jni 第十一篇之JNA详情

混合编程jni 第十一篇之JNA详情

适用于 z/OS (USS) 的 JNA 库

使用JNA,让java调用原生代码

JNA 调用c++函数的出错,java能加载库,但是找不到c++写的函数

JNA的用法