TT Bigdata TT Bigdata
首页
GitHub (opens new window)
JaneTTR

JaneTTR

数据酿造智慧,每一滴都是沉淀!
  • 开发环境

  • Ambari 编译

  • Bigtop 编译

  • Ambari 源码编译

  • 前端开发

  • 后端开发

  • 官方组件编译

    • 准备阶段

    • 理解packages.gradle

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

    • Hadoop编译

    • Flink编译

    • Spark编译

    • Livy编译

    • Zeppelin编译

    • Zookeeper编译

    • Hbase编译

    • Hive编译

    • Kafka编译

    • Solr编译

    • Tez编译

  • 扩展组件编译

  • 源码编译
  • 官方组件编译
  • 理解packages.gradle
JaneTTR
2022-12-18
目录
🧩 Patch 注入机制概览
⚙️ 注入逻辑代码解析 + 效果图展示
① 注入 patch 文件声明
🔍 结果前后对比
② 注入 patch 执行命令
🔍 对应位置效果图
📦 这些补丁从哪来?
🧠 总结:Bigtop 如何实现补丁自动插入
📎 附:完整处理逻辑源码

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
Bigtop 如何统一管理各组件版本
Bigtop 应用补丁

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

最近更新
01
当前版本 2026/08
08-29
02
把 Ambari Server HA 稳稳地跑起来
08-17
03
从一次启用操作追到主备就绪
08-17
更多文章>
Theme by Vdoing | Copyright © 2017-2026 JaneTTR | MIT License
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式