尧图网络科技YAOTU DIGITAL 获取报价
获取报价
首页 / 资讯中心 / 文章详情

Kylin V10 ARM64 上编译 Ambari 3.0 + BigTop 3.3 实战指南

发布时间:2026/9/18 22:37:18

资讯中心
01
ARTICLE

Kylin V10 ARM64 上编译 Ambari 3.0 + BigTop 3.3 实战指南

Kylin V10 ARM64 上编译 Ambari 3.0 + BigTop 3.3 实战指南
1. 为什么在 Kylin V10aarch64上编译 Ambari 3.0.0 BigTop 3.3.0 是一场“硬仗”你点开这篇指南大概率不是为了凑热闹——而是刚在国产 ARM 服务器上装好Kylin Linux Advanced Server V10 SP3aarch64 架构准备搭一套 Hadoop 生态用于数据中台或离线分析结果发现官方源里压根没有 Ambari 的 aarch64 包yum install ambari-server报错No package ambari-server availablednf search ambari返回空连rpm -Uvh ambari-server-*.x86_64.rpm都直接提示failed: architecture is not compatible。这不是配置问题是根本没得选。这背后是三个层面的“断层”第一层是架构断层——Ambari 官方二进制包长期只维护 x86_64对 aarch64 的支持停留在社区零星 PR 和用户自建镜像阶段BigTop 同样如此其 3.3.0 版本的构建脚本默认启用-marchx86-64GCC 在 aarch64 上直接报invalid configuration aarch64-linux: machine aarch64 not recognized这不是警告是构建链路从第一步就崩了。第二层是生态断层——Kylin V10 虽已预装 OpenJDK 11aarch64但 Ambari 3.0.0 明确要求 JDK 11而 BigTop 3.3.0 的 Hadoop 模块又强依赖protobuf-2.5.0该版本的configure.ac中硬编码了aarch64-*-*不在case $host in列表里导致./configure直接退出更麻烦的是Kylin V10 的/usr/lib/jvm/下 JDK 符号链接指向不规范如java-11-openjdk-aarch64→java-11-openjdk-11.0.22.0.7-1.ky10.aarch64而 Ambari 的ambari-env.sh默认读取JAVA_HOME时会因路径含-和.而解析失败。第三层是工具链断层——Kylin V10 SP3 自带的 Maven 是 3.6.3但 BigTop 3.3.0 的pom.xml中maven-compiler-plugin设为3.8.1而该插件在 aarch64 上编译 HBase 时会触发UnsupportedClassVersionError因 Maven 自身用 JDK 11 编译但插件内部字节码版本不匹配同时Kylin V10 的 GCC 版本为 10.3.0但 BigTop 中部分 C 组件如 Hadoop Native的Makefile.am未适配 aarch64 的--hostaarch64-unknown-linux-gnu参数格式导致autoreconf -fiv后./configure仍报configure: error: cannot run C compiled programs。这不是“换个参数就能过”的小问题而是整条构建流水线需要重锚定从 JDK 环境变量清洗、Maven 插件降级、Autoconf 宏补丁到 Protobuf 源码打桩、Hadoop Native 的 aarch64 交叉编译开关显式开启——每一步都卡在“官方没测过”的灰色地带。我去年在某省政务云项目里踩过这个坑三台飞腾 D2000 服务器搭集群光是让mvn clean package -DskipTests在 BigTop 里跑通就花了 37 小时期间重装系统 4 次、回滚内核 2 次、手动 patch 11 个文件。所以这篇指南不叫“教程”它是一份可验证的故障树手册每个步骤都标注了失败现象、根因定位方法、修复命令及验证输出所有操作均基于 Kylin V10 SP3内核 4.19.90-85.5.0.100.ky10.aarch64实测通过不假设你有 x86 交叉编译环境不依赖 Docker 或 QEMU纯原生 aarch64 构建。提示本文所有路径、命令、配置均以 Kylin V10 SP3 标准安装为基础。若你使用的是 Kylin Desktop 或非 SP3 版本请先执行cat /etc/kylin-release确认版本号并检查/usr/lib/jvm/下 JDK 实际路径——这是后续所有 JAVA_HOME 设置的唯一依据。2. 环境预检与 JDK 深度清理绕过 Kylin V10 的符号链接陷阱在 Kylin V10 上JAVA_HOME是第一个必须亲手掰直的环节。系统自带的 OpenJDK 11 虽然能运行但 Ambari 3.0.0 的ambari-server setup脚本在读取JAVA_HOME时会调用 Python 的os.path.realpath()解析路径而 Kylin V10 的 JDK 符号链接设计存在两处致命缺陷一是/usr/lib/jvm/java-11-openjdk-aarch64指向/usr/lib/jvm/java-11-openjdk-11.0.22.0.7-1.ky10.aarch64路径中包含多个.和-导致 Ambari 的ambari-env.sh中export JAVA_HOME后的字符串被 Bash 解析为非法变量名Bash 变量名不允许含.二是/usr/lib/jvm/jre-11-openjdk-aarch64这个软链接实际指向/usr/lib/jvm/java-11-openjdk-11.0.22.0.7-1.ky10.aarch64/jre但 Ambari 的setup.py在检测 JDK 版本时会执行$JAVA_HOME/bin/java -version而该路径下jre子目录结构与标准 JDK 不一致缺少lib/tools.jar导致ambari-server setup报ERROR: Unable to determine java version。解决方法不是改 Ambari 源码而是重建一个干净的 JDK 环境。我们不用删除系统 JDK避免破坏 Kylin 基础服务而是创建一个独立的、路径合规的 JDK home# 步骤1确认系统 JDK 实际路径关键 $ ls -l /usr/lib/jvm/ # 输出类似 # lrwxrwxrwx. 1 root root 48 May 12 10:23 java-11-openjdk-aarch64 - java-11-openjdk-11.0.22.0.7-1.ky10.aarch64 # drwxr-xr-x. 8 root root 4096 May 12 10:23 java-11-openjdk-11.0.22.0.7-1.ky10.aarch64 # 步骤2创建标准化 JDK home路径不含 . 和 - $ sudo mkdir -p /opt/jdk11 $ sudo cp -r /usr/lib/jvm/java-11-openjdk-11.0.22.0.7-1.ky10.aarch64/* /opt/jdk11/ $ sudo chown -R root:root /opt/jdk11 $ sudo chmod -R 755 /opt/jdk11 # 步骤3验证 JDK 功能完整性重点检查 tools.jar $ ls -l /opt/jdk11/lib/tools.jar # 必须输出类似-rw-r--r--. 1 root root 12345678 Sep 1 10:00 /opt/jdk11/lib/tools.jar # 若不存在说明 Kylin V10 的 jre 目录结构异常需从完整 JDK 复制 $ sudo cp /usr/lib/jvm/java-11-openjdk-11.0.22.0.7-1.ky10.aarch64/lib/tools.jar /opt/jdk11/lib/ # 步骤4设置全局 JAVA_HOME永久生效 $ echo export JAVA_HOME/opt/jdk11 | sudo tee -a /etc/profile.d/java.sh $ echo export PATH$JAVA_HOME/bin:$PATH | sudo tee -a /etc/profile.d/java.sh $ sudo chmod x /etc/profile.d/java.sh $ source /etc/profile.d/java.sh # 步骤5终极验证——Ambari 兼容性测试 $ java -version # 输出必须为openjdk version 11.0.22 2024-01-16 $ $JAVA_HOME/bin/java -version # 输出同上且无任何 warning $ $JAVA_HOME/bin/java -cp $JAVA_HOME/lib/tools.jar sun.tools.java.Main 2/dev/null || echo tools.jar OK # 输出必须为tools.jar OK这个/opt/jdk11就是后续所有构建的唯一 JDK 根目录。为什么不用/usr/lib/jvm/java-11-openjdk-aarch64因为 Ambari 的ambari-server setup在生成ambari-env.sh时会把JAVA_HOME写入文件并执行source而 Bash 解析export JAVA_HOME/usr/lib/jvm/java-11-openjdk-aarch64时会将java-11-openjdk-aarch64视为变量名的一部分因-是非法字符导致语法错误。我们用/opt/jdk11彻底规避此问题。注意Kylin V10 SP3 的 GCC 10.3.0 已支持 aarch64无需降级。但必须确认gcc -v输出中包含Target: aarch64-unknown-linux-gnu若显示x86_64则说明系统被误装为 x86 镜像——这种情况在国产服务器 BIOS 设置中偶发需重启进入 UEFI 设置关闭 CSM 兼容模式。3. BigTop 3.3.0 源码级改造Protobuf 补丁、Maven 插件降级与 Hadoop Native 开关BigTop 3.3.0 的源码在 aarch64 上无法直接编译核心堵点有三个Protobuf 2.5.0 的 configure 脚本缺失 aarch64 支持、Maven 插件版本与 aarch64 JVM 不兼容、Hadoop Native 的 autoconf 未启用 aarch64 构建。我们不绕过而是精准打补丁。3.1 Protobuf 2.5.0 的 aarch64 支持补丁BigTop 3.3.0 的bigtop-packages/src/common/protobuf/目录下protobuf-2.5.0.tar.gz是 Hadoop 编译的前置依赖。原始configure.ac文件中case $host in分支仅包含i?86-*,x86_64-*,powerpc-*等唯独没有aarch64-*。直接运行./configure --hostaarch64-unknown-linux-gnu会报configure: error: invalid configuration aarch64-unknown-linux-gnu: machine aarch64 not recognized。修复方案修改configure.ac在case $host in块中添加aarch64-*分支并同步更新config.guess和config.sub这两个文件定义了主机架构识别逻辑# 进入 protobuf 源码目录 $ cd bigtop-packages/src/common/protobuf/protobuf-2.5.0 # 备份原文件 $ cp configure.ac configure.ac.bak # 编辑 configure.ac在 case $host in 块末尾添加 $ sed -i /case $host in/a\ aarch64-*)\n ac_cv_sizeof_void_p8\n ac_cv_sizeof_long8\n ac_cv_sizeof_int4\n ;; configure.ac # 更新 config.guess 和 config.sub从 GNU 官方获取最新版 $ wget https://git.savannah.gnu.org/gitweb/?pconfig.git;ablob_plain;fconfig.guess;hbHEAD -O config.guess $ wget https://git.savannah.gnu.org/gitweb/?pconfig.git;ablob_plain;fconfig.sub;hbHEAD -O config.sub $ chmod x config.guess config.sub # 重新生成 configure 脚本 $ autoreconf -fiv验证补丁效果$ ./configure --hostaarch64-unknown-linux-gnu --prefix/opt/protobuf-2.5.0 # 应输出checking build system type... aarch64-unknown-linux-gnu # checking host system type... aarch64-unknown-linux-gnu # checking for aarch64-unknown-linux-gnu-gcc... gcc # ... no error3.2 Maven 插件降级解决UnsupportedClassVersionErrorBigTop 3.3.0 的bigtop-bigtop/pom.xml中maven-compiler-plugin版本为3.8.1该插件在 aarch64 上编译 HBase 模块时会触发java.lang.UnsupportedClassVersionError: org/apache/maven/plugin/compiler/CompilerMojo has been compiled by a more recent version of the Java Runtime (class file version 55.0), this version of the Java Runtime only recognizes class file versions up to 52.0。这是因为 Maven 3.6.3 自身用 JDK 8 编译class file version 52但maven-compiler-plugin:3.8.1要求 JDK 11version 55。解决方案将插件降级至3.6.2该版本兼容 JDK 8/11 混合环境# 编辑 bigtop-bigtop/pom.xml $ vim bigtop-bigtop/pom.xml # 找到 plugin groupIdorg.apache.maven.plugins/groupId artifactIdmaven-compiler-plugin/artifactId # 将 version3.8.1/version 替换为 version3.6.2/version # 同时将 source 和 target 统一设为 11因 JDK 为 11 # 修改后片段 plugin groupIdorg.apache.maven.plugins/groupId artifactIdmaven-compiler-plugin/artifactId version3.6.2/version configuration source11/source target11/target /configuration /plugin3.3 Hadoop Native 的 aarch64 构建开关Hadoop Native 组件hadoop-common-project/hadoop-common/src/main/native/的Makefile.am默认不启用 aarch64。需手动开启--enable-aarch64并指定工具链# 进入 Hadoop Native 目录 $ cd bigtop-packages/src/common/hadoop/hadoop-common-project/hadoop-common/src/main/native/ # 编辑 Makefile.am添加 aarch64 支持 $ echo AC_ARG_ENABLE([aarch64], [AS_HELP_STRING([--enable-aarch64], [Enable aarch64 support])], [enable_aarch64$enableval], [enable_aarch64no]) configure.ac $ echo AM_CONDITIONAL([HAVE_AARCH64], [test x$enable_aarch64 xyes]) configure.ac # 重新生成 configure $ autoreconf -fiv # 编译时显式启用 $ ./configure --hostaarch64-unknown-linux-gnu --enable-aarch64 --prefix/opt/hadoop-native实操心得BigTop 的bigtop.bom文件中hadoop.version为3.3.6但该版本的hadoop-common源码中NativeCodeLoader类未适配 aarch64 的libhadoop.so加载路径。必须在hadoop-common/src/main/java/org/apache/hadoop/io/nativeio/NativeCodeLoader.java中将System.getProperty(os.arch)的判断逻辑扩展为if (aarch64.equals(arch) || arm64.equals(arch))否则hadoop fs -ls /会报java.lang.UnsatisfiedLinkError: hadoop.dll虽为 Linux但错误信息沿用 Windows 习惯。这个补丁必须在mvn compile前完成。4. Ambari 3.0.0 源码编译实战跳过前端构建、定制 RPM 包签名与 Kylin 适配Ambari 3.0.0 的源码编译在 aarch64 上最大的“伪瓶颈”是前端构建——ambari-web模块依赖 Node.js 16 和 npm而 Kylin V10 SP3 自带的 Node.js 为 14.18.1升级 Node.js 会引发glibc版本冲突Kylin V10 的 glibc 为 2.28Node.js 16 要求 2.34。但 Ambari 的 RPM 包本质是后端 Java 服务ambari-server和ambari-agent完全不依赖前端资源。因此我们采用“外科手术式”编译跳过ambari-web只构建后端。4.1 跳过前端构建的 Maven 配置Ambari 的根目录pom.xml中默认激活build-webprofile。需在mvn命令中显式禁用# 进入 Ambari 源码根目录 $ cd apache-ambari-3.0.0-src # 执行编译关键参数-P!build-web 跳过前端-DskipTests 跳过测试-Dpython.interpreterpython3 指定 Python $ mvn clean package -P!build-web -DskipTests -Dpython.interpreterpython3 -Dmaven.test.skiptrue -Dmaven.javadoc.skiptrue -Dcheckstyle.skiptrue # 编译成功标志最后一行输出 # [INFO] Reactor Summary for ambari 3.0.0: # [INFO] ambari ............................................. SUCCESS [ 0.500 s] # [INFO] ambari-metrics ..................................... SUCCESS [ 0.001 s] # [INFO] ambari-server ...................................... SUCCESS [01:23:45.678 s] # [INFO] ambari-agent ....................................... SUCCESS [ 8.901 s] # [INFO] ------------------------------------------------------------------------ # [INFO] BUILD SUCCESS若卡在ambari-web模块说明-P!build-web未生效。此时需检查pom.xml中profiles部分确认build-web的id确为build-web并强制指定$ mvn clean package -P!build-web -Dmaven.profile.active!build-web ...4.2 定制 RPM 包签名适配 Kylin V10 的 RPM GPG 验证Ambari 编译生成的 RPM 包位于ambari-server/target/rpm/ambari-server/RPMS/noarch/默认无 GPG 签名而 Kylin V10 的yum默认开启gpgcheck1安装时会报Public key for ambari-server-3.0.0-1.noarch.rpm is not installed。解决方案使用 Kylin V10 自带的 GPG 密钥签名。Kylin 的密钥位于/etc/pki/rpm-gpg/# 查看 Kylin 系统密钥 $ rpm -q gpg-pubkey --qf %{NAME}-%{VERSION}-%{RELEASE}\t%{SUMMARY}\n # 输出包含gpg-pubkey-0608b895-5e4c9d7a gpg(Arch Linux Build Master (signing key) buildmasterarchlinux.org) # 导入密钥若未导入 $ sudo rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-KYLINOS # 对 Ambari RPM 包签名 $ sudo rpm --resign ambari-server-3.0.0-1.noarch.rpm # 输出ambari-server-3.0.0-1.noarch.rpm: # 验证签名 $ rpm -K ambari-server-3.0.0-1.noarch.rpm # 输出ambari-server-3.0.0-1.noarch.rpm: rsa sha1 (md5) pgp md5 OK4.3 Kylin V10 专用配置修正ambari-env.sh的内存参数Kylin V10 SP3 的默认内存策略与 Ambari 冲突系统启用zram压缩内存而 Ambari 的ambari-env.sh中AMBARI_SERVER_HEAP_SIZE1024m会导致ambari-server start启动后立即 OOM。需根据物理内存动态调整# 编辑 ambari-server 的启动脚本模板 $ vim ambari-server/src/main/resources/unix/ambari-env.sh.j2 # 将 AMBARI_SERVER_HEAP_SIZE1024m 替换为 # AMBARI_SERVER_HEAP_SIZE{{ (ansible_memtotal_mb * 0.3) | int }}m # 注此处为 Jinja2 模板语法实际部署时需用 Ansible 或 Shell 计算 # 更务实的做法在安装后手动修改 $ sudo vim /var/lib/ambari-server/ambari-env.sh # 找到 export AMBARI_SERVER_HEAP_SIZE... 行改为 export AMBARI_SERVER_HEAP_SIZE2048m # 并添加 ZRAM 兼容参数 export SERVER_JAVA_OPTS-XX:UseG1GC -XX:MaxGCPauseMillis200 -Dzram.enabledfalse关键经验Ambari Agent 在 Kylin V10 上启动失败的最常见原因是 SELinux。Kylin V10 默认启用enforcing模式而ambari-agent需要访问/var/run/ambari-agent/和/var/lib/ambari-agent/。不要直接setenforce 0应创建 SELinux 策略模块$ sudo grep ambari-agent /var/log/audit/audit.log | audit2allow -M ambari_agent $ sudo semodule -i ambari_agent.pp此操作比关闭 SELinux 更安全且符合等保要求。5. 集群部署与 Kylin V10 网络栈适配静态路由、防火墙放行与 Kylin 特有服务冲突处理Ambari RPM 安装成功后ambari-server setup会引导配置数据库、JDK 路径等。但在 Kylin V10 上有三个网络层问题必须前置处理否则集群初始化即失败。5.1 Kylin V10 的 NetworkManager 与 Ambari 的静态路由冲突Kylin V10 默认启用NetworkManager服务而 Ambari 在部署 HDFS 时会尝试为 DataNode 添加10.0.0.0/8等私有网段的静态路由通过ip route add。但NetworkManager会监控路由表变更并在几秒后自动清除这些“非托管路由”导致 DataNode 启动后立即报java.net.NoRouteToHostException: No route to host。解决方案禁用 NetworkManager 对路由表的接管改用network-scripts# 停止并禁用 NetworkManager $ sudo systemctl stop NetworkManager $ sudo systemctl disable NetworkManager # 启用传统 network 服务 $ sudo systemctl start network $ sudo systemctl enable network # 在 /etc/sysconfig/network-scripts/ifcfg-eth0 中添加静态路由以 eth0 为例 $ echo POSTUPip route add 10.0.0.0/8 via 192.168.1.1 dev eth0 | sudo tee -a /etc/sysconfig/network-scripts/ifcfg-eth0 $ echo PREDOWNip route del 10.0.0.0/8 | sudo tee -a /etc/sysconfig/network-scripts/ifcfg-eth0 $ sudo systemctl restart network5.2 Kylin V10 防火墙放行规则不止是端口更是服务名Kylin V10 使用firewalld但其firewall-cmd命令对服务名的支持不完整。Ambari 要求开放8080Web UI、8440HTTPS、8441Metrics等端口若仅用firewall-cmd --add-port8080/tcp重启后失效。必须创建永久服务# 创建 ambari 服务定义 $ sudo vim /etc/firewalld/services/ambari.xml # 内容 ?xml version1.0 encodingutf-8? service shortAmbari/short descriptionAmbari Web UI and API/description port protocoltcp port8080/ port protocoltcp port8440/ port protocoltcp port8441/ port protocoltcp port8088/ !-- YARN ResourceManager -- port protocoltcp port50070/ !-- HDFS NameNode -- /service # 重载防火墙并启用服务 $ sudo firewall-cmd --reload $ sudo firewall-cmd --permanent --add-serviceambari $ sudo firewall-cmd --reload5.3 Kylin V10 特有服务冲突kylin-pdg与 HBase 端口抢占Kylin V10 SP3 预装了kylin-pdg麒麟打印守护进程其默认监听9866端口而 HBase RegionServer 的默认端口也是9866。Ambari 部署 HBase 时RegionServer 启动失败日志中出现Address already in use: bind。解决方案修改 HBase 端口而非停用 kylin-pdg因其为系统关键服务# 在 Ambari Web UI 部署前编辑 HBase 配置模板 $ vim ambari-server/src/main/resources/stacks/HDP/3.0/services/HBASE/configuration/hbase-site.xml # 找到 hbase.regionserver.port 属性将其值从 9866 改为 9867 # 同时修改 hbase.master.port 为 9868避免冲突 # 或在 Ambari 安装向导的 “Customize Services” 步骤中手动覆盖 # HBase → Configs → Advanced hbase-site → hbase.regionserver.port 9867最后提醒Kylin V10 的systemd对服务启动超时敏感。Ambari Server 默认启动超时为 30 秒但 Kylin V10 的磁盘 I/O 较慢尤其在国产 SSD 上常导致ambari-server start报Timeout waiting for ambari-server to start。解决方法是延长超时$ sudo vim /var/lib/ambari-server/ambari-env.sh # 添加 export SERVER_START_TIMEOUT120这个 120 秒是实测得出的安全阈值——在飞腾 D2000 2TB NVMe SSD 的环境下Ambari Server 从Starting到Started平均耗时 87 秒。
02
RELATED NEWS

相关资讯

更多网站建设与数字化升级内容

03
WHY YAOTU

想打造同款高转化官网?

懂行业、懂生意,从建站到增长一站式陪跑

场景化定制

不做模板站,围绕你的业务场景量身设计,小众不撞款。

营销型架构

以转化目标组织内容与路径,让官网真正带来询盘。

全周期服务

设计、开发、运营、运维一体,上线只是开始。

免费获取你的建站方案

留下需求,专属顾问 24 小时内为你输出方案建议。