如何在 Apple M1 上使用 Apache Pulsar

本文详细介绍了如何在Apple M1芯片的Mac上运行Apache Pulsar,重点解决了由于RocksDB不支持osx-arm64架构导致的启动问题。通过升级RocksDB到6.29.4.1版本,现在Pulsar可以原生支持M1。文章提供了不同环境下的解决方案,包括使用最新Master分支、替换JAR文件、构建Docker镜像等,并给出了具体的操作步骤和示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

如何在 Apple M1 上使用 Apache Pulsar

从 RocksDB 说起

Apache Pulsar 将在 2.11 版本升级 RocksDB1( 6.10.2 -> 6.29.4.1),届时将原生支持在 Apple M1 上运行 Pulsar。

在这之前的 Pulsar 版本,因为依赖的 RocksDB 尚不支持 osx-arm64 架构,这会让 Bookie 在启动阶段报一个 UnsatisfiedLinkError错误,导致无法正确启动。

解压 org.rocksdb-rocksdbjni-6.10.2.jar ,可以看到仅有一个支持 osx-x86 架构的 librocksdbjni-osx.jnilib 包。

rocksdbjni-6.10.2
├── HISTORY-JAVA.md
├── META-INF
├── 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
└── org

终于:

“RocksDB 6.29.4.1 has been released to Maven Central which should now work on M1 macs.”

Apache Pulsar 也很快做了跟进:

“Upgrade to newest version of RocksDb which has support for Mac with M1 architecture.”

在最新的 2.11.0-SNAPSHOT里,rocksdb 版本已经确定在 :<rocksdb.version>6.29.4.1</rocksdb.version>

解压 rocksdbjni-6.29.4.1.jar,可以看到增加了对 osx-arm64 对支持。

cksdbjni-6.29.4.1
├── HISTORY-JAVA.md
├── META-INF
├── librocksdbjni-linux-aarch64-musl.so
├── librocksdbjni-linux-aarch64.so
├── librocksdbjni-linux-ppc64le-musl.so
├── librocksdbjni-linux-ppc64le.so
├── librocksdbjni-linux-s390x-musl.so
├── librocksdbjni-linux-s390x.so
├── librocksdbjni-linux32-musl.so
├── librocksdbjni-linux32.so
├── librocksdbjni-linux64-musl.so
├── librocksdbjni-linux64.so
├── librocksdbjni-osx-arm64.jnilib
├── librocksdbjni-osx-x86_64.jnilib
├── librocksdbjni-win64.dll
└── org

推荐使用最新的 2.11 master 分支

所以在目前的时间点,在 M1 环境运行 Apache Pulsar 最佳的方案是使用最新的 Master 分支代码(2.11.0-SNAPSHOT)。不过目前还有点[兼容性问题][1]。

老版本如何使用

除此之外,我们可以分环境来说明,如何在 M1 下使用老版本 Apache Pulsar:

  1. 裸机环境(使用 arm64 JDK):可将 lib/rocksdbjni-6.10.2.jar 替换 rocksdbjni-6.29.4.1.jar,可兼容大部分消息场景(已简单测试 2.10、2.9.3 和 2.8.2 版本)。处理 Ledger 索引、Pulsar IO 和一些客户端可能会有问题。
  2. 裸机环境(使用 x86 JDK):可直接使用默认的 apache pulsar(推荐方案)。推荐使用 [sdkman][3]工具,通过配置 sdkman_rosetta2_compatible=true ,让本地 JDK 通过 rosetta2 来运行 Pulsar。配置步骤参考链接 [2]。
  3. Docker 环境(arm64):可自行制作 arm64 的 pulsar 镜像,注意也可以升级下 rocksdb。也可以催促下官方的 arm64 镜像[7]。
  4. Docker 环境(模拟 x86):推荐使用 [colima][4] 虚拟机工具来运行 x86 架构的 docker 运行时(例如 colima start --arch x86_64 --cpu 4 --memory 8 可开启一个本地的 x86 虚拟机),可支持 x86 架构的 pulsar 镜像运行。

arm 镜像制作示例

对于 arm64 的 pulsar 镜像,一个简单制作和使用示例如下,参考 [5]。

  1. 制作 Dockerfile:

    FROM --platform=arm64v8 adoptopenjdk:11-hotspot AS build
    # 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.10.0
    # Install Pulsar
    RUN set -ex; \
      apt-get update && apt-get install -y wget; \
      PULSAR_VERSION=$PULSAR_VERSION; \
      wget -O pulsar.tgz "http://mirrors.ustc.edu.cn/apache/pulsar/pulsar-${PULSAR_VERSION}/apache-pulsar-${PULSAR_VERSION}-bin.tar.gz"; \
      tar -xf pulsar.tgz --strip-components=1; \
      mv lib/org.rocksdb-rocksdbjni-6.10.2.jar lib/org.rocksdb-rocksdbjni-6.10.2.jar.bak; \
      wget -O lib/rocksdbjni-6.29.4.1.jar https://maven.aliyun.com/repository/public/org/rocksdb/rocksdbjni/6.29.4.1/rocksdbjni-6.29.4.1.jar; \
      rm pulsar.tgz; \
      \
      chown -R pulsar:pulsar .;
    
    EXPOSE 6650 8080
    CMD [ "bin/pulsar","standalone" ]
    
  2. 编译命令(这里是我编译好的镜像 [6]):

    docker buildx build --platform linux/arm64 -t futeng/pulsar:2.10.0-rocksdbjni-6.29.4.1 .
    
  3. 启动命令:

    docker run -it -p 6650:6650  -p 8080:8080 \
    --mount source=pulsardata,target=/pulsar/data \
    --mount source=pulsarconf,target=/pulsar/conf \
    futeng/pulsar:2.10.0-rocksdbjni-6.29.4.1 \
    bin/pulsar standalone
    
  4. 查看架构

    root@29fba9e349d1:/pulsar# uname -a
    Linux 29fba9e349d1 5.10.104-linuxkit #1 SMP PREEMPT Thu Mar 17 17:05:54 UTC 2022 aarch64 aarch64 aarch64 GNU/Linux
    

对于在 M1 上运行 arm 容器,速度上还是有很大优势的。

鸣谢

感谢 @Yisheng Cai 安利 colima,感谢 @Yunze Xu 推荐 sdkman,感谢 @Kai Wang 介绍 Pulsar ARM 相关使用。

结束语

最完美的方案还是等待官方 2.11.0 版本的 release 啊!

[1]: https://github.com/apache/pulsar/issues/14961 "Pulsar IO integration tests"
[2]: https://pulsar.apache.org/docs/getting-started-standalone/#install-jdk-on-m1 "install x86 jdk on m1"
[3]: https://sdkman.io "Home - SDKMAN! the Software Development Kit Manager"
[4]: https://github.com/abiosoft/colima "Colima - container runtimes on macOS (and Linux) with minimal setup."
[5]: https://www.zhaojianyun.com/archives/run-pulsar-on-m1-mac "借助DOCKER让PULSAR可以在M1上原生运行"
[6]: https://hub.docker.com/r/futeng/pulsar/tags "docker pull futeng/pulsar:2.10.0-rocksdbjni-6.29.4.1"
[7]: https://github.com/apache/pulsar/issues/12944 "#12944 ARM based docker image"

  1. RocksDB 用来存储 ledger 的索引。 ↩︎

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值