TT Bigdata TT Bigdata
首页
  • 部署专题

    • 常规安装
    • 一键部署
  • 组件安装

    • 常规&高可用
  • 版本专题

    • 更新说明
  • Ambari-Env

    • 环境准备
    • 开始使用
  • 组件编译

    • 专区—Ambari
    • 专区—Bigtop
  • 报错解决

    • 专区—Ambari
    • 专区—Bigtop
  • 其他技巧

    • Maven镜像加速
    • Gradle镜像加速
    • Bower镜像加速
    • 虚拟环境思路
    • R环境安装+一键安装脚本
    • Ivy配置私有镜像仓库
    • Node.js 多版本共存方案
    • Ambari Web本地启动
    • Npm镜像加速
    • PostgreSQL快速安装
    • Temurin JDK 23快速安装
  • 成神之路

    • 专区—Ambari
    • 专区—Bigtop
  • 集成案例

    • Redis集成教学
    • Dolphin集成教学
    • Doris集成教学
    • 持续整理...
  • 模板代码

    • 各类组件
    • 通用模板
  • 国产化&其他系统

    • Centos系列
    • Kylin系列
    • OpenEuler系列
    • Rocky系列
    • Ubuntu系列
  • 生产调优

    • 组件调优指南
    • 1v1指导调优
  • 定制开发

    • 组件版本定制
    • 样式风格定制
  • 蓝图愿景
  • 技术支持
  • 合作共建
GitHub (opens new window)

JaneTTR

数据酿造智慧,每一滴都是沉淀!
首页
  • 部署专题

    • 常规安装
    • 一键部署
  • 组件安装

    • 常规&高可用
  • 版本专题

    • 更新说明
  • Ambari-Env

    • 环境准备
    • 开始使用
  • 组件编译

    • 专区—Ambari
    • 专区—Bigtop
  • 报错解决

    • 专区—Ambari
    • 专区—Bigtop
  • 其他技巧

    • Maven镜像加速
    • Gradle镜像加速
    • Bower镜像加速
    • 虚拟环境思路
    • R环境安装+一键安装脚本
    • Ivy配置私有镜像仓库
    • Node.js 多版本共存方案
    • Ambari Web本地启动
    • Npm镜像加速
    • PostgreSQL快速安装
    • Temurin JDK 23快速安装
  • 成神之路

    • 专区—Ambari
    • 专区—Bigtop
  • 集成案例

    • Redis集成教学
    • Dolphin集成教学
    • Doris集成教学
    • 持续整理...
  • 模板代码

    • 各类组件
    • 通用模板
  • 国产化&其他系统

    • Centos系列
    • Kylin系列
    • OpenEuler系列
    • Rocky系列
    • Ubuntu系列
  • 生产调优

    • 组件调优指南
    • 1v1指导调优
  • 定制开发

    • 组件版本定制
    • 样式风格定制
  • 蓝图愿景
  • 技术支持
  • 合作共建
GitHub (opens new window)
  • 准备阶段

  • 理解packages.gradle

    • Bigtop 构建过程中 RPM 打包路径解析
    • Bigtop 如何统一管理各组件版本
    • Bigtop 如何插入补丁
      • 🧩 Patch 注入机制概览
      • ⚙️ 注入逻辑代码解析 + 效果图展示
        • ① 注入 patch 文件声明
        • 🔍 结果前后对比
        • ② 注入 patch 执行命令
        • 🔍 对应位置效果图
        • 📦 这些补丁从哪来?
      • 🧠 总结:Bigtop 如何实现补丁自动插入
      • 📎 附:完整处理逻辑源码
    • Bigtop 应用补丁
    • Bigtop 多版本编译源码改造(一)
    • Bigtop 多版本编译源码改造(二)
  • 理解bigtop.bom

  • Hadoop编译

  • Flink编译

  • Spark编译

  • Atlas编译

  • Superset编译

  • Zookeeper编译

  • Hbase编译

  • Hive编译

  • Kafka编译

  • Solr编译

  • Tez编译

  • Zeppelin编译

  • 组件编译-Bigtop
  • 理解packages.gradle
JaneTTR
2022-12-18
目录

Bigtop 如何插入补丁

在 Bigtop 的组件构建中,我们经常需要修改上游源码。这些修改往往以 .diff 补丁的形式存在。

但手动维护 .spec 文件里的 patch 声明与命令,不仅繁琐,还容易遗漏。为此,Bigtop 实现了一套自动化 patch 注入机制 —— 只需放置 patch 文件,其余全部交给构建框架完成。

# 🧩 Patch 注入机制概览

Bigtop 通过 占位符 + 脚本替换 的方式完成补丁自动注入:

类型 占位符 注入内容
补丁声明 #BIGTOP_PATCH_FILES 会替换为 Patch0: xxx.diff
补丁执行 #BIGTOP_PATCH_COMMANDS 会替换为 %patch0 -p1

这些写法看似特殊,其实只是被 Groovy 脚本在构建过程中替换掉的钩子点。

# ⚙️ 注入逻辑代码解析 + 效果图展示

# ① 注入 patch 文件声明

if (line.startsWith("#BIGTOP_PATCH_FILES")) {
    def patchNum = 0
    patches.each { p ->
        specWriter << "Patch$patchNum: $p\n"
        patchNum++
    }
}
1
2
3
4
5
6
7

这一段会将所有 patch*.diff 文件写入 .spec 中的 patch 声明位置。

# 🔍 结果前后对比

构建前:

image-20240704112725190

构建后:

image-20240704112357343

可以看到,系统自动插入了从 patch0 到 patch4 的声明,无需手动添加,路径也都是来自 rpm/SOURCES/。

# ② 注入 patch 执行命令

if (line.startsWith("#BIGTOP_PATCH_COMMANDS")) {
    def patchNum = 0
    patches.each { p ->
        specWriter << "%patch$patchNum -p1\n"
        patchNum++
    }
}
1
2
3
4
5
6
7

这段代码则负责生成 %patchN 的执行命令,并插入到 %prep 阶段。

# 🔍 对应位置效果图

构建前:

image-20240704112611651

构建后:

image-20240704112425887

这正是 RPM 标准方式应用 patch 的写法,只不过由 Bigtop 自动替你完成了。

# 📦 这些补丁从哪来?

你只需要将 patch 文件放到以下路径中即可:

bigtop-packages/src/extensions/
1

系统会自动将其复制到:

build/<component>/rpm/SOURCES/
1

并完成注入流程。

提示

命名规则必须符合 patch*.diff 才能被识别和注入。例如 patch0-RANGER.diff、patch1-feature-fix.diff

# 🧠 总结:Bigtop 如何实现补丁自动插入

步骤 动作
Step 1 .spec 文件中插入注释占位符:#BIGTOP_PATCH_FILES 和 #BIGTOP_PATCH_COMMANDS
Step 2 把补丁放入 src/extensions,命名形如 patch0-xxx.diff
Step 3 构建时 Groovy 脚本扫描补丁文件并写入 .spec
Step 4 .spec 文件更新后即可由 rpmbuild 自动执行所有 patch 操作
推荐做法 对于经常需要改动上游源码的组件(如 Hudi、Ranger、Kafka),强烈建议统一采用该机制,可极大降低维护成本和手动出错风险。

# 📎 附:完整处理逻辑源码

如果你希望自定义 patch 注入逻辑,也可以在 packages.gradle 中找到如下片段做修改:

def patches = new File("${PKG_BUILD_DIR}/rpm/SOURCES").list({ d, f -> f ==~ /patch.*diff/ }).sort()
specFile.eachLine { line ->
    if (line.startsWith("#BIGTOP_PATCH_FILES")) {
        patches.eachWithIndex { p, i -> specWriter << "Patch$i: $p\n" }
    } else if (line.startsWith("#BIGTOP_PATCH_COMMANDS")) {
        patches.eachWithIndex { p, i -> specWriter << "%patch$i -p1\n" }
    } else {
        specWriter << "$line\n"
    }
}
1
2
3
4
5
6
7
8
9
10
#Bigtop#RPM#Patch 注入
Bigtop 如何统一管理各组件版本
Bigtop 应用补丁

← Bigtop 如何统一管理各组件版本 Bigtop 应用补丁→

最近更新
01
Pandoc 缺失导致 SparkR 构建失败
06-08
02
Cyrus SASL/GSASL 缺失解决
06-07
03
Hadoop_3.3.4 编译实战 1.0.0+
06-06
更多文章>
Theme by Vdoing | Copyright © 2017-2025 JaneTTR | MIT License
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式