640 字
3 分钟
借助Docker让Pulsar可以在M1上原生运行

我作为一名程序员,体验了m1的mac后,感觉棒,不烫、安静、续航久。便入手了丐版air。 在日常开发中,我需要使用Pulsar服务。Pulsar是使用Java开发的,天生具有跨平台的特性。事与愿违,我在M1 mac上并不能启动Pulsar。

本地运行#

在Pulsar官网,我们下载Pulsar 2.8.1的压缩包,在本地启动pulsar会遇到RocksDB JNI library报错。

java.io.IOException: Failed to load RocksDB JNI library
	at org.apache.bookkeeper.bookie.storage.ldb.KeyValueStorageRocksDB.<init>(KeyValueStorageRocksDB.java:93) ~[org.apache.bookkeeper-bookkeeper-server-4.12.0.jar:4.12.0]
	at org.apache.bookkeeper.bookie.storage.ldb.KeyValueStorageRocksDB.<init>(KeyValueStorageRocksDB.java:85) ~[org.apache.bookkeeper-bookkeeper-server-4.12.0.jar:4.12.0]

它为什么会报错呢,从名字上看,RocksDB JNI应该是针对不同平台有不同的二进制文件。

在pulsar的lib目录中我找到了org.rocksdb-rocksdbjni-6.10.2.jar文件,解压这个文件,在目录中可以看到各种平台的二进制文件。

librocksdbjni-linux-aarch64-musl.so
librocksdbjni-linux-aarch64.so
librocksdbjni-linux-ppc64le-musl.so
librocksdbjni-linux-ppc64le.so
librocksdbjni-linux32-musl.so
librocksdbjni-linux32.so
librocksdbjni-linux64-musl.so
librocksdbjni-linux64.so
librocksdbjni-osx.jnilib
librocksdbjni-win64.dll

arm64对应的平台简称是aarch64, mac系统对应的是osx。这些文件中没有包含mac arm64的二进制文件。

既然rocksdbjni这个版本不支持m1, 那我们就看看新版本中支不支持。我查看了rocksdbjni项目的GitHub,他们还没对m1做支持,项目上有等待合并的支持m1的PR,但我尝试构建了下,没有成功。

那么现在就不能在m1上使用了pulsar了吗?作为一个热衷于吃螃蟹的程序员,我不能放弃。

Docker 原生运行Pulsar#

linux在arm64上早就跑起来了,日常见得多的是安卓手机的内核和树莓派。rocksdbjni包中是有librocksdbjni-linux-aarch64.so文件的,也就是支持linux/arm64

我们何不自己打包一个linux/arm64的pulsar镜像呢?说干就干。Dockerflie走起。

FROM adoptopenjdk:8-jdk-hotspot
# Prepare environment
ENV PULSAR_HOME=/pulsar
ENV PATH=$PULSAR_HOME/bin:$PATH
RUN groupadd --system --gid=9999 pulsar && useradd --system --home-dir $PULSAR_HOME --uid=9999 --gid=pulsar pulsar
WORKDIR $PULSAR_HOME

ARG PULSAR_VERSION
ENV PULSAR_VERSION 2.8.1
# Install Pulsar
RUN set -ex; \
  apt-get update && apt-get install -y wget; \
  PULSAR_VERSION=$PULSAR_VERSION; \
  wget -O pulsar.tgz "https://archive.apache.org/dist/pulsar/pulsar-${PULSAR_VERSION}/apache-pulsar-${PULSAR_VERSION}-bin.tar.gz"; \
  tar -xf pulsar.tgz --strip-components=1; \
  rm pulsar.tgz; \
  \
  chown -R pulsar:pulsar .;

EXPOSE 6650 8080
CMD [ "bin/pulsar","standalone" ]

docker构建镜像,run起来,Pulsar成功启动,并且启动速度比模拟amd64快了三倍起。赞~

大家可以自己构建或者使用我构建好的镜像docker pull jianyun8023/pulsar:2.8.1来使用Pulsar。

结语#

M1作为苹果的新产品,性能不错,续航好,还解决了macbook的梦幻单管散热问题。但新的平台,在软件原生适配上还有很长时间。在日常使用些专业软件,多多少少还是会遇到问题。凭借自己能力,用docker + linux-arm64镜像解决了Pulsar不能使用问题,还是非常开心的。

借助Docker让Pulsar可以在M1上原生运行
https://www.jianyun.run/posts/run-pulsar-natively-on-m1-with-docker/
作者
唐长老日志
发布于
2021-03-07
许可协议
CC BY-NC-SA 4.0