技术课程插图审计与图像资产治理:Data Engineering Zoomcamp 2027 批次处理模块的 80 项插图盘点
【免费下载链接】data-engineering-zoomcampData Engineering Zoomcamp is a free 9-week course on building production-ready data pipelines. Join the course here 👇🏼项目地址: https://gitcode.com/GitHub_Trending/da/data-engineering-zoomcamp
本篇技术指南系统讲解 Data Engineering Zoomcamp 2027 批次处理(Batch Processing)模块(cohorts/2027/06-batch/)的一次完整插图盘点与图像资产管理实践:从审计范围、保留规则(Rubric)到"确定性裁剪 / 受控图像生成"两条处理路径,再到 80 项引用逐条决策与最终验证。读者读完可以掌握一套可复用的"技术文档插图审计方法论",并理解为何精确的命令行、代码、UI 截图必须走确定性裁剪,而边界清晰的说明性示意图才允许交给图像生成模型重绘。
审计范围:一份明确的边界声明
本次盘点由仓库内的治理文档 .tmp/de-2027-batch-image-rollout.md 记录,范围被严格限定为cohorts/2027/06-batch/下所有本地 Markdown 图片引用。该模块是数据工程课程的核心单元,包含从批处理概念到 Spark 安装、DataFrame、RDD、GCS、Dataproc 与 BigQuery 连接的完整 16 节课(单元清单见 cohorts/2027/06-batch/README.md)。
文档开篇明确了执行者的能力边界与纪律:
- 图像生成能力可用,但只用于"有边界的说明性示意图"(bounded explanatory diagrams),且必须经过确定性裁剪与肉眼检查之后才允许生成;
- 精确的代码、命令、URL、图表、数值输出与真实 UI 一律用确定性裁剪/放大处理,绝不交给图像生成模型"重写";
- 所有原始 JPG 保留在 cohorts/2027/06-batch/images/ 目录中,作为可恢复的事实来源。
保留规则(Rubric):什么图值得留下
审计不是"图片好看就留",而是基于一套可操作的教学价值标准。每张源图都要通过以下六项检查:
| 维度 | 要求 |
|---|---|
| 具体的教学点(specific teaching point) | 图片必须承载文字难以表达的信息,而非装饰 |
| 相关性(relevant) | 与所在课程文字直接相关 |
| 可读性(readable) | 在课程渲染尺寸下清晰可读 |
| 补充性(additive to prose/code) | 对旁边的文字/代码有增量价值 |
| 耐久性(durable) | 不依赖时效性内容(如网页搜索结果) |
| 有用且准确的说明文字(useful caption) | 图片替代文本必须准确描述内容 |
没有教学贡献或属于冗余导航的图片一律删除,删除并不删除源文件——原始 JPG 全部保留供恢复与追溯。
两条处理路径:什么时候用裁剪,什么时候用生成
这是本次治理实践最核心的方法论。对 74 张保留资产,采用了两条互斥路径:
- 确定性技术裁剪(57 张):用于精确证据类内容——命令输出、终端截图、Spark UI、notebook 代码、BigQuery/Dataproc 控制台等。典型做法是
ImageMagick的-crop加上+repage -strip,裁剪掉浏览器/编辑器 chrome、摄像头画面、光标等录制痕迹,保留教学核心区域(例如裁剪几何x=20,y=32,w=480,h=300反复用于终端类截图)。 - 受控图像生成 imagegen(17 张):只用于"边界清晰的概念示意图"。流程固定为:从原始 640×360 视频帧做确定性裁剪(最常见几何为
x=37,y=0,w=465,h=340)→ 本地肉眼检查 → 以"原始 JPG + 原生裁剪"作为仅有的两个输入进行重绘 → 逐字节复制到发布目标。重绘必须移除演讲者、摄像头画面、工具栏、浏览器边框等录制痕迹,同时精确保留图中的教学标签与箭头方向(如RIDE.STARTS→PROCESSOR、DRIVER→SPARK SUBMIT→MASTER、P1/P2输出分区等)。
在仓库中可以直接对照实践结果:原始 JPG 与其-cropped.png(确定性裁剪)或-imagegen.png(受控生成)产物以同级兄弟文件形式共存于 cohorts/2027/06-batch/images/。
80 项逐条决策:保留 74、移除 6
完整盘点覆盖 80 个源引用,最终74 张保留、6 张移除。下面按课程顺序给出完整决策清单("方法"列中IG 465×340表示 imagegen 重绘且裁剪几何为x=37,y=0,w=465,h=340;DC表示确定性裁剪,括号内为裁剪几何):
| # | 来源 | 决策 | 方法 | 评分 | 教学点 / 限制 |
|---|---|---|---|---|---|
| 1 | 01-batch-vs-streaming | 保留 | IG 465×340 | 10/12 | 保留"批处理日历→任务→输出"与连续流式流程,移除演讲者/摄像头/工具栏/边框 |
| 2 | 01-streaming-example | 保留 | IG 465×340 | 10/12 | 保留RIDE.STARTS→处理器→输出流 |
| 3 | 01-batch-job-frequencies | 保留 | IG 465×340 | 9/12 | 保留三种调度频率(周/日/时)的顺序 |
| 4 | 01-technologies | 保留 | IG 465×340 | 10/12 | 两栏图保留批处理频率与 Python/SQL/Spark/Flink 技术清单 |
| 5 | 01-batch-workflow | 移除 | — | 2/12 | 硬门槛失败:源图是"优点清单"而非文字所述"工作流",且与相邻优点图重复 |
| 6 | 01-advantages | 保留 | IG 465×340 | 10/12 | 保留三项优点与"延迟"缺点 |
| 7 | 01-batch-vs-streaming-share | 保留 | IG 465×340 | 10/12 | 保留约 80% 批处理 / 20% 流式的占比与处理关系 |
| 8 | 02-spark-google-search | 移除 | — | 4/12 | 谷歌搜索结果导航图,无理解增益、时效性强、非互补证据 |
| 9 | 02-data-processing-engine-whiteboard | 保留 | IG 465×340 | 10/12 | 保留"输入数据→Spark 集群→输出数据"与语言标注 |
| 10 | 02-when-to-use-spark-whiteboard | 保留 | IG 465×340 | 11/12 | 保留 SQL 与 Spark 取舍建议及 Hive/Presto/Athena 标签 |
| 11 | 02-typical-workflow-whiteboard | 保留 | IG 465×340 | 11/12 | 保留 SQL 准备、Spark/Python 训练、模型创建与 Spark 应用模型 |
| 12 | 03-install-guide-java | 保留 | DCx=20,y=205,w=465,h=145 | 9/12 | 保留 Linux/Java/OpenJDK 安装指引,排除无关页面/侧栏 |
| 13 | 03-java-home | 保留 | DCx=20,y=32,w=480,h=300 | 10/12 | 保留 JDK 解压输出、路径与JAVA_HOME导出命令 |
| 14 | 03-spark-download-page | 保留 | DCx=0,y=28,w=490,h=305 | 9/12 | 保留 Spark 版本与 Hadoop 构建选择器 |
| 15 | 03-spark-home | 保留 | DCx=20,y=32,w=480,h=300 | 10/12 | 保留解压/删除/导出命令与SPARK_HOME路径 |
| 16 | 03-spark-shell | 保留 | DCx=20,y=32,w=480,h=300 | 10/12 | 保留 Spark 3.0.3 shell 输出与结果[1,2,3,4,5,6,7,8,9] |
| 17 | 04-spark-ui | 保留 | DCx=0,y=28,w=480,h=320 | 9/12 | 保留 Spark 3.0.3 Jobs UI 与任务状态证据 |
| 18 | 04-schema-problem-pandas | 保留 | DCx=22,y=30,w=465,h=300 | 10/12 | 保留StringType模式与 pandas 采样设置 |
| 19 | 04-schema-structtype | 保留 | DCx=45,y=28,w=455,h=300 | 10/12 | 保留显式StructField声明 |
| 20 | 04-partitions-slides | 保留 | IGx=132,y=50,w=350,h=270 | 10/12 | 保留云存储分区与集群 executor 的关系 |
| 21 | 04-repartition-write-parquet | 保留 | DCx=22,y=30,w=465,h=300 | 10/12 | 保留 schema、repartition(24)与 parquet 写入代码 |
| 22 | 05-print-schema | 保留 | DCx=22,y=30,w=465,h=300 | 10/12 | 保留printSchema()输出与类型化列 |
| 23 | 05-select | 保留 | DC 同上 | 10/12 | 保留所选列与结果 DataFrame 模式 |
| 24 | 05-built-in-functions | 保留 | DC 同上 | 10/12 | 保留F.补全列表与to_date上下文 |
| 25 | 05-udf | 保留 | DC 同上 | 10/12 | 保留 filter/show 输出与crazy_stuff函数上下文 |
| 26 | 06-tlc-website | 移除 | — | 4/12 | 导航性页面截图,且浏览器右键菜单遮挡链接,文字已给出数据源 |
| 27 | 06-url-list | 保留 | DCx=20,y=32,w=465,h=300 | 9/12 | 保留生成的 TLC URL 与循环输出 |
| 28 | 06-printf | 保留 | DC 同上 | 9/12 | 保留printf补零格式命令与输出 |
| 29 | 06-zcat | 保留 | DC 同上 | 10/12 | 保留zcat ... \| head -n 10命令与 CSV 输出证据 |
| 30 | 06-tree-raw | 保留 | DC 同上 | 9/12 | 保留 raw 目录层级与按月文件 |
| 31 | 06-schema-strings | 保留 | DCx=22,y=30,w=465,h=300 | 10/12 | 保留推断的全StringType模式,作为"需显式定义 schema"的证据 |
| 32 | 06-spark-ui-one-task | 保留 | DCx=0,y=30,w=480,h=300 | 10/12 | 保留单任务/活跃任务 UI 证据 |
| 33 | 06-tree-pq | 保留 | DCx=20,y=32,w=465,h=300 | 10/12 | 保留 parquet 目录层级、_SUCCESS标记与 part 文件 |
| 34 | 07-read-parquet | 保留 | DCx=22,y=30,w=465,h=300 | 10/12 | 保留 parquet 读取命令与数据证据 |
| 35 | 07-common-columns | 保留 | DC 同上 | 10/12 | 保留共享列集合与两个 DataFrame 的关系 |
| 36 | 08-spark-submit-master | 保留 | IG 465×340 | 10/12 | 保留DRIVER → SPARK SUBMIT → MASTER与4040标签 |
| 37 | 08-executors-failure | 保留 | IG 465×340 | 10/12 | 保留 master 协调 executor 与单 executor 故障重分配 |
| 38 | 08-executors-pull-partitions | 保留 | IG 465×340 | 10/12 | 保留四个 DataFrame 分区流向集群 executor |
| 39 | 08-s3-gcs-instead-of-hdfs | 保留 | IG 465×340 | 11/12 | 保留 S3/GCS 作为活动存储、HADOOP/HDFS 弱化与分区拉取 |
| 40 | 09-reshuffling-whiteboard | 保留 | IG 465×340 | 10/12 | 保留子结果、按键交叉箭头、输出分区P1/P2与外部归并排序 |
| 41 | 09-revenue-query | 保留 | DCx=22,y=30,w=465,h=300 | 10/12 | 保留收入查询 notebook 上下文与分组键证据 |
| 42 | 09-three-stages | 保留 | DCx=0,y=28,w=480,h=300 | 10/12 | 保留三阶段 DAG 证据 |
| 43 | 09-shuffle-read-write | 保留 | DC 同上 | 10/12 | 保留完成阶段数、任务总数与 shuffle 读证据 |
| 44 | 10-outer-join | 保留 | DCx=22,y=30,w=465,h=300 | 10/12 | 保留外连接代码与连接键 |
| 45 | 10-sort-merge-join-stages | 保留 | DCx=0,y=28,w=500,h=300 | 10/12 | 保留两个扫描阶段、exchange 与下游 join DAG |
| 46 | 10-zones-lookup | 保留 | DCx=22,y=30,w=465,h=300 | 10/12 | 保留 zones 查找表模式与样例行 |
| 47 | 10-broadcast-exchange | 保留 | DCx=0,y=28,w=480,h=300 | 9/12 | 保留广播交换任务证据(原生行选中高亮保留) |
| 48 | 11-map-key-value-whiteboard | 保留 | IG 465×340 | 11/12 | 保留Row→map→RDD与键(H,Z)/ 值(AMT,CNT)分组语义 |
| 49 | 11-rdd-of-rows | 保留 | DCx=22,y=30,w=465,h=300 | 9/12 | 保留 Row 对象输出与 RDD 搭建 |
| 50 | 11-reducebykey-chain | 保留 | DC 同上 | 10/12 | 保留 filter/map/reduceByKey 链与聚合输出 |
| 51 | 11-todf-lost-names | 保留 | DC 同上 | 10/12 | 保留泛化_1–_4列与 toDF 链 |
| 52 | 11-namedtuple-schema | 保留 | DC 同上 | 10/12 | 保留 RevenueRow/namedtuple 与显式 StructType schema |
| 53 | 11-dag-two-stages | 保留 | DCx=0,y=28,w=480,h=300 | 10/12 | 保留两阶段 DAG 与 partitionBy/mapPartitions 证据 |
| 54 | 12-map-partitions-diagram | 保留 | IG 465×340 | 11/12 | 保留RDD→Partition→mapPartitions→Partition关系与"1TB"标签 |
| 55 | 12-feature-columns | 保留 | DCx=20,y=32,w=600,h=210 | 9/12 | 保留特征选择代码、全部输出列头与样例值 |
| 56 | 12-one-result-per-partition | 保留 | DCx=22,y=30,w=465,h=300 | 10/12 | 保留 mapPartitions 函数、collect 调用与[1,1,1,1]结果 |
| 57 | 12-partition-sizes | 保留 | DC 同上 | 10/12 | 保留计数函数与不均衡分区计数 |
| 58 | 12-pandas-dataframe | 移除 | — | 4/12 | 硬性图文不符:文字称展示 pandas 无意义列名,截图为后续函数与分区计数 |
| 59 | 12-model-and-yield | 保留 | DC 同上 | 9/12 | 保留模型预测、预测时长列与 yield 行代码 |
| 60 | 12-predicted-duration | 保留 | DC 同上 | 9/12 | 保留 mapPartitions/toDF 管线与预测时长查询 |
| 61 | 13-gcs-connector-instructions | 移除 | — | 5/12 | 临时 Slack 帖子含演示人头像与聊天框 chrome,与课程复现步骤冗余 |
| 62 | 13-upload-parquet-to-gcs | 保留 | DCx=60,y=48,w=475,h=285 | 10/12 | 保留目录列表与gsutil -m cp -r pq/ gs://.../pq命令 |
| 63 | 13-upload-progress | 保留 | DCx=60,y=48,w=475,h=305 | 10/12 | 保留对象复制流与底部进度状态 |
| 64 | 13-download-connector-jar | 保留 | DCx=60,y=200,w=540,h=108 | 11/12 | 保留 gsutil 连接器下载、完成状态与 jar 文件名 |
| 65 | 13-spark-conf-gcs-connector | 保留 | DCx=100,y=150,w=500,h=100 | 10/12 | 聚焦 SparkConf jar 与服务账号设置 |
| 66 | 13-spark-session-gcs | 保留 | DCx=20,y=198,w=600,h=130 | 11/12 | 保留SparkSession.builder配置与gs://.../green/*/*读取路径 |
| 67 | 13-read-from-gcs-test | 保留 | DCx=20,y=184,w=600,h=48 | 9/12 | 保留df_green.count()调用与阶段进度 |
| 68 | 14-spark-master-ui | 保留 | DCx=0,y=30,w=640,h=105 | 10/12 | 保留 Master URL、活跃 worker 数与核心使用 |
| 69 | 14-worker-registered | 保留 | DCx=0,y=30,w=640,h=160 | 11/12 | 保留 worker 数、地址、ALIVE 状态、核心/内存/资源表 |
| 70 | 14-converted-script | 保留 | DCx=180,y=75,w=360,h=260+ 光标遮罩 | 9/12 | 保留转换后的 Python/Spark 导入、会话构建与 parquet 读取 |
| 71 | 14-running-script-2020 | 保留 | DCx=60,y=60,w=475,h=280 | 10/12 | 保留 2020 命令、Spark 警告与阶段进度 |
| 72 | 14-spark-submit-2021 | 保留 | DCx=60,y=48,w=475,h=300 | 9/12 | 保留 2021 运行的 executor/scheduler 日志证据 |
| 73 | 15-create-cluster | 保留 | DCx=0,y=30,w=535,h=330 | 10/12 | 保留 Dataproc 集群创建步骤与选中的 Jupyter/Docker 组件 |
| 74 | 15-submit-job-form | 保留 | DCx=280,y=95,w=360,h=265 | 9/12 | 保留绿/黄输入与报告输出参数面板 |
| 75 | 15-job-finished-report | 保留 | DCx=0,y=30,w=535,h=320 | 10/12 | 保留桶身份、对象标签与code/、pq/、report-2021/目录 |
| 76 | 15-iam-dataproc-role | 移除 | — | 4/12 | 说明文字声称添加 Dataproc Administrator 角色,截图仅见 IAM 表格,无该角色或添加动作 |
| 77 | 15-reports-in-bucket | 保留 | DCx=0,y=30,w=145,h=330 | 9/12 | 保留report-2020/与report-2021/目录证据 |
| 78 | 16-connector-tutorial | 保留 | DCx=180,y=52,w=430,h=278 | 10/12 | 保留 Dataproc 提交命令、GCS 参数与 BigQuery 连接器教程 |
| 79 | 16-failed-to-find-bigquery | 保留 | DCx=60,y=100,w=540,h=240 | 9/12 | 保留ClassNotFoundException、缺失bigquery数据源报错与堆栈证据 |
| 80 | 16-bigquery-table | 保留 | DCx=0,y=30,w=535,h=300 | 10/12 | 保留 BigQueryreports-2020表、项目树、模式与类型化字段 |
六张被移除资产的共性
值得特别关注的是 6 张被移除的图(#5、#8、#26、#58、#61、#76),它们暴露了技术文档插图最常见的四类问题:
- 图文不符(硬性失败):
#58的说明文字与截图内容不一致、#76声称展示的角色添加动作在截图中不存在——这是评分最低(2/12、4/12)的硬门槛失败; - 导航冗余:
#8的搜索结果页、#26的网站截图、#61的 Slack 帖子对教学内容零增量; - 与文字重复:
#5的"优点清单"图与相邻"优点"图重复,且不是文字描述的"工作流"; - 时效性差:
#8的搜索结果会随搜索引擎变化而失效,不满足"耐久性"要求。
移除的决策同样保留原始 JPG 与审计记录,保证任何时刻都能回溯。
典型保留资产与教学点拆解
从 74 张保留资产中可以清晰地反推出课程的教学主线,这正是"以教学点为纲"审计的价值:
- 概念层(imagegen 重绘):批次 vs 流式对比(见 01-introduction-to-batch-processing.md 第 32 行引用)、Spark 集群解剖图组(
08-*四张:提交链路、executor 故障转移、分区拉取、S3/GCS 替代 HDFS)、groupBy 重分区白板图、mapPartitions 分区转换图(见 12-spark-rdd-mappartition.md 第 20 行引用)。这些图保留了教学标签、箭头方向与分组语义,是文字无法替代的"关系型证据"。 - 证据层(确定性裁剪):Spark 3.0.3 安装命令与 shell 输出、
printSchema()类型化列、repartition(24)写 parquet、gsutil -m cp上传命令、Dataproc 创建表单与提交参数、BigQuery 连接失败的ClassNotFoundException堆栈。这些截图是"可复现实验证据",任何文字转述都会损失精确度,因此严格禁止生成模型改写。
例如课程第 1 课 01-introduction-to-batch-processing.md 中,batch-vs-streaming 图与 80/20 占比图分别支撑"批处理把一天数据一次处理完"与"多数数据处理是批处理"两个论断;第 12 课的 mapPartitions 图则直接支撑"分区进、分区出"的转换语义。留与不留,都以"这句话没有这张图是否还成立"为判断基准。
可追溯性与验证:比"改图"更重要的是一致性
本次盘点并非一次性清理,而是一套可持续的治理闭环,其验证标准包括:
- 完整性:全部 80 个源引用都有审计条目;74 张保留引用全部解析到同级的
-cropped.png(确定性裁剪)或-imagegen.png(受控生成)资产,且 80 个原始 JPG 全部仍在images/目录; - 结果构成:保留集中包含 17 张 imagegen 示意图与 57 张确定性技术裁剪;
- 质量门禁:
git diff --check对范围内的课程/报告文件全部通过; - 工作区整洁:一次性接触表与中间裁剪存放在 .tmp/de-batch-contact-sheets/ 等
.tmp目录下,不进入正式资产,交付前从工作树移除。
此外,这一治理过程还有后续的严格语义修复记录,见 cohorts/2027/06-batch/2026-09-09-follow-up-provenance.md:它为 lessons 11–15 提供了权威的当前引用审计、每张图的 SHA-256 哈希链、原始 JPG → 原生裁剪 → imagegen 产物的完整溯源,并记录了诸如"分区箭头必须落在对应 executor 框内""存储箭头不得交叉"等细粒度验收标准。与仓库层面的 .tmp/de-2027-distrust-audit.md(对全cohorts/2027的 175 处引用做信任审计,移除 64 张无源支持的生成图)配合,构成了"先信任审计、再语义修复、再逐条盘点"的三级图像治理体系。
对技术文档维护者的可复用方法论
本次盘点的价值不在于"改了一批图",而在于沉淀了一套可迁移的插图治理流程:
- 先定范围再动手:明确"哪个目录、哪些引用"属于本次治理边界;
- 用 Rubric 而非审美做决策:教学点、相关性、可读性、补充性、耐久性、说明文字六项打分,明确区分"导航图"与"教学图";
- 按内容类型分流:精确证据走确定性裁剪,概念示意图走受控生成,且生成必须以"原始素材 + 原生边界裁剪"为输入,禁止凭空发挥;
- 删除不销毁:被移除的资产保留原件与审计条目,保证可追溯;
- 验证闭环:引用解析、
git diff --check、原生尺寸与课程渲染尺寸双重检查,缺一不可。
这套方法论同样适用于任何以教学视频/讲座为源头、以 Markdown 课程为载体的技术文档项目:它回答的始终是同一个问题——这张图是"证据"还是"装饰",它是否配得上占据读者的一个屏幕?
【免费下载链接】data-engineering-zoomcampData Engineering Zoomcamp is a free 9-week course on building production-ready data pipelines. Join the course here 👇🏼项目地址: https://gitcode.com/GitHub_Trending/da/data-engineering-zoomcamp
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考