如何在苹果硅Mac上运行Elasticsearch 6 ?



对于开发应用程序,我需要在Apple Silicon Mac上运行Elasticsearch 6。

我试过用Docker运行它。阅读Docker Desktop for Apple silicon,我已经安装了Rosetta2:

softwareupdate --install-rosetta

并增加了--platform linux/amd64命令行选项。

运行:

docker run -d --platform linux/amd64 --name elasticsearch  -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" elasticsearch:6.8.18

我得到关于AVX指令集的警告:

OpenJDK 64-Bit Server VM warning: UseAVX=2 is not supported on this CPU, setting it to UseAVX=0

所以我添加了命令行选项:-e "ES_JAVA_OPTS=-XX:UseAVX=0",但我仍然得到:

[2021-08-22T00:06:20,727][WARN ][o.e.b.ElasticsearchUncaughtExceptionHandler] [unknown] uncaught exception in thread [main]
org.elasticsearch.bootstrap.StartupException: org.elasticsearch.bootstrap.BootstrapException: java.io.IOException: Cannot run program "/usr/share/elasticsearch/modules/x-pack-ml/platform/linux-x86_64/bin/controller": error=0, Failed to exec spawn helper: pid: 131, exit value: 1
at org.elasticsearch.bootstrap.Elasticsearch.init(Elasticsearch.java:163) ~[elasticsearch-6.8.18.jar:6.8.18]
at org.elasticsearch.bootstrap.Elasticsearch.execute(Elasticsearch.java:150) ~[elasticsearch-6.8.18.jar:6.8.18]
at org.elasticsearch.cli.EnvironmentAwareCommand.execute(EnvironmentAwareCommand.java:86) ~[elasticsearch-6.8.18.jar:6.8.18]
at org.elasticsearch.cli.Command.mainWithoutErrorHandling(Command.java:124) ~[elasticsearch-cli-6.8.18.jar:6.8.18]
at org.elasticsearch.cli.Command.main(Command.java:90) ~[elasticsearch-cli-6.8.18.jar:6.8.18]
at org.elasticsearch.bootstrap.Elasticsearch.main(Elasticsearch.java:116) ~[elasticsearch-6.8.18.jar:6.8.18]
at org.elasticsearch.bootstrap.Elasticsearch.main(Elasticsearch.java:93) ~[elasticsearch-6.8.18.jar:6.8.18]
Caused by: org.elasticsearch.bootstrap.BootstrapException: java.io.IOException: Cannot run program "/usr/share/elasticsearch/modules/x-pack-ml/platform/linux-x86_64/bin/controller": error=0, Failed to exec spawn helper: pid: 131, exit value: 1
at org.elasticsearch.bootstrap.Bootstrap.setup(Bootstrap.java:167) ~[elasticsearch-6.8.18.jar:6.8.18]
at org.elasticsearch.bootstrap.Bootstrap.init(Bootstrap.java:333) ~[elasticsearch-6.8.18.jar:6.8.18]
at org.elasticsearch.bootstrap.Elasticsearch.init(Elasticsearch.java:159) ~[elasticsearch-6.8.18.jar:6.8.18]
... 6 more
Caused by: java.io.IOException: Cannot run program "/usr/share/elasticsearch/modules/x-pack-ml/platform/linux-x86_64/bin/controller": error=0, Failed to exec spawn helper: pid: 131, exit value: 1
at java.lang.ProcessBuilder.start(ProcessBuilder.java:1142) ~[?:?]
at java.lang.ProcessBuilder.start(ProcessBuilder.java:1073) ~[?:?]
at org.elasticsearch.bootstrap.Spawner.spawnNativeController(Spawner.java:118) ~[elasticsearch-6.8.18.jar:6.8.18]
at org.elasticsearch.bootstrap.Spawner.spawnNativeControllers(Spawner.java:86) ~[elasticsearch-6.8.18.jar:6.8.18]
at org.elasticsearch.bootstrap.Bootstrap.setup(Bootstrap.java:165) ~[elasticsearch-6.8.18.jar:6.8.18]
at org.elasticsearch.bootstrap.Bootstrap.init(Bootstrap.java:333) ~[elasticsearch-6.8.18.jar:6.8.18]
at org.elasticsearch.bootstrap.Elasticsearch.init(Elasticsearch.java:159) ~[elasticsearch-6.8.18.jar:6.8.18]
... 6 more
Caused by: java.io.IOException: error=0, Failed to exec spawn helper: pid: 131, exit value: 1
at java.lang.ProcessImpl.forkAndExec(Native Method) ~[?:?]
at java.lang.ProcessImpl.<init>(ProcessImpl.java:313) ~[?:?]
at java.lang.ProcessImpl.start(ProcessImpl.java:244) ~[?:?]
at java.lang.ProcessBuilder.start(ProcessBuilder.java:1109) ~[?:?]
at java.lang.ProcessBuilder.start(ProcessBuilder.java:1073) ~[?:?]
at org.elasticsearch.bootstrap.Spawner.spawnNativeController(Spawner.java:118) ~[elasticsearch-6.8.18.jar:6.8.18]
at org.elasticsearch.bootstrap.Spawner.spawnNativeControllers(Spawner.java:86) ~[elasticsearch-6.8.18.jar:6.8.18]
at org.elasticsearch.bootstrap.Bootstrap.setup(Bootstrap.java:165) ~[elasticsearch-6.8.18.jar:6.8.18]
at org.elasticsearch.bootstrap.Bootstrap.init(Bootstrap.java:333) ~[elasticsearch-6.8.18.jar:6.8.18]
at org.elasticsearch.bootstrap.Elasticsearch.init(Elasticsearch.java:159) ~[elasticsearch-6.8.18.jar:6.8.18]
... 6 more

然后我看看Elasticsearchedit中的机器学习设置,其中声明:

机器学习使用SSE4.2指令,所以它只在cpu支持SSE4.2的机器上工作。如果你在旧的硬件上运行Elasticsearch,你必须禁用机器学习(通过将xpack.ml.enabled设置为false)。

所以我添加了命令行选项:-e"xpack.ml.enabled=false", Elasticsearch现在开始,但没有出现在日志中,它不回答请求。

我的问题是:如何在苹果硅Mac上运行Elasticsearch 6 ?

我刚刚遇到这个问题,我发现你可以在这里使用curl指令运行elasticsearch,但想使用docker。

如果你想使用我的图片,请继续:

docker run -p 9200:9200 -p 9300:9300 tompreston377/elasticsearch

为了制作这个图像,我这样组织文件:

.
├── Dockerfile-elastic
└── elasticsearch.yml

Dockerfile:

# Dockerfile-elastic.yml
FROM arm64v8/openjdk:8-jdk-buster
WORKDIR /usr
# add a non root user
RUN useradd -m elasticuser
# Download extras
RUN apt update
RUN apt install -y curl nano
# Download elasticsearch
RUN curl -L -O https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-6.8.23.tar.gz
RUN tar -xvf elasticsearch-6.8.23.tar.gz
# Add config
ADD elasticsearch.yml /usr/elasticsearch-6.8.23/config/elasticsearch.yml
RUN chown -R elasticuser: .
USER elasticuser
ENV JAVA_HOME=/usr/local/openjdk-18/bin/java
ENV discovery.type=single-node
ENV xpack.security.enabled: false
ENV xpack.ml.enabled: false
RUN cd elasticsearch-6.8.23/bin
RUN chown -R elasticuser: elasticsearch-6.8.23
EXPOSE 9200 9300
CMD cd /usr/elasticsearch-6.8.23/bin/ && ./elasticsearch

elasticsearch.yml:

# elasticsearch.yml
xpack.security.enabled: false
xpack.ml.enabled: false
http.host: 0.0.0.0
transport.host: 0.0.0.0

命令:

Build:docker build -f Dockerfile-elastic -t elastic .

运行:docker run -p 9200:9200 -p 9300:9300 elastic

这通常是不支持的,但有报告说https://hub.docker.com/r/webhippie/elasticsearch/可能工作。

如果你还没有一个很好的理由来升级,也许在M1上运行它可能会有所帮助?本机支持(不含Rosetta)已在7.12中添加。

发现这个github问题#81383

添加-e "ES_JAVA_OPTS=-Xms512m -Xmx512m"修复了7.16.1的崩溃。

希望有帮助👍

我为这个问题挣扎了很长时间,下面是我的发现:

  • 常规版本6或7不工作
  • 对于版本7,您需要使用docker.elastic.co/webhippie/elasticsearch:7.10.2-arm64
  • 版本6webhippie/elasticsearch:6.4

我希望这些信息对某人有用。

我自己也遇到过这个问题,很长一段时间都无法解决。解决方案与版本6webhippie/elasticsearch:6.4也工作。

我能够启动容器elasticsearch:6.8.6这就是我所做的

  1. 添加到es环境- xpack.security.enabled=false- bootstrap.system_call_filter=false;
  2. 从esvolumes中删除
  3. esdata添加到commonvolumes
  4. 这样的

es:
image: elasticsearch:6.8.6
environment:
- xpack.security.enabled=false
- discovery.type=single-node
- bootstrap.system_call_filter=false
ports:
- "9200:9200"
- "9300:9300"
volumes:
esdata:
<--anything else-->

也许这个解决方案可以帮助别人

相关内容

最新更新