从 Spark 1.0.0 开始,Spark 项目将遵循 语义版本控制指南,并有一些偏差。这些细微的差异解释了 Spark 作为多模块项目的本质。
每个 Spark 版本都将被版本化:[MAJOR].[FEATURE].[MAINTENANCE]
当向 Spark 添加新组件时,它们最初可能会被标记为“alpha”。Alpha 组件不必遵守上述指南,但是,在最大程度上,它们应该尝试遵守。一旦它们被标记为“稳定”,它们就必须遵循这些指南。
API 是 Spark 中公开的任何公共类或接口,未标记为“开发者 API”或“实验性”。如果针对版本 A 编译的代码可以干净地针对版本 B 编译,则版本 A 与版本 B 兼容。目前,不保证针对版本 A 链接的已编译应用程序可以在不重新编译的情况下干净地针对版本 B 链接。链接级兼容性是我们将在未来版本中努力保证的内容。
但是,请注意,即使对于“开发者 API”和“实验性”功能,我们也努力保持最大兼容性。如果计划稍后更改 API,则不应将代码作为“实验性”合并到项目中,因为用户期望所有可用 API 具有最大兼容性。
Spark 项目努力避免破坏 API 或静默更改行为,即使在主要版本中也是如此。虽然这并不总是可行,但在选择破坏 API 之前,应考虑以下因素的平衡。
破坏 API 几乎总是会给 Spark 用户带来非凡的成本。破坏的 API 意味着 Spark 程序需要在升级之前重写。但是,在考虑成本时,有一些需要考虑的因素
API 在 Spark 中存在了多长时间?
即使对于基本程序,API 是否也很常见?
我们在 JIRA 或邮件列表中看到最近问题的频率如何?
它在 StackOverflow 或博客中出现的频率如何?
破坏后的行为 - 今天有效的程序在破坏后将如何工作?以下是按严重程度递增的顺序排列的
会出现编译器或链接器错误吗?
会出现运行时异常吗?
该异常是否会在完成大量处理后发生?
我们会静默返回不同的答案吗?(非常难以调试,甚至可能不会注意到!)
当然,以上并不意味着我们永远不会破坏任何 API。我们还必须考虑对项目和用户保持所讨论 API 的成本。
项目成本 - 我们拥有的每个 API 都需要进行测试,并且需要随着项目的其他部分发生变化而保持工作状态。当外部依赖项发生变化(JVM、Scala 等)时,这些成本会大大增加。在某些情况下,虽然在技术上并非完全不可行,但维护特定 API 的成本可能会变得过高。
用户成本 - API 对学习 Spark 或尝试理解 Spark 程序的用户也具有认知成本。当所讨论的 API 具有令人困惑或未定义的语义时,这种成本会更高。
在存在“不良 API”但移除成本也很高的情况下,应该考虑一些替代方案,这些方案不会损害现有用户,但确实可以解决一些维护成本。
避免不良 API - 虽然这有点明显,但这是一个重要的观点。每当我们向 Spark 添加新接口时,我们都应该考虑我们可能永远无法摆脱这个 API。深入思考新 API 与现有 API 的关系,以及您期望它们如何随着时间的推移而发展。
弃用警告 - 所有弃用警告都应该指向明确的替代方案,并且永远不应该仅仅说 API 已被弃用。
更新的文档 - 文档应该指向执行给定任务的“最佳”推荐方法。在维护旧文档的情况下,我们应该明确指向较新的 API,并向用户建议“正确”的方法。
社区工作 - 许多人通过阅读博客和其他网站(如 StackOverflow)来学习 Spark。但是,许多这些资源已经过时。更新它们,以降低最终移除弃用 API 的成本。
分支每年 1 月和 7 月被切断,因此功能(“次要”)版本通常每 6 个月发布一次。因此,Spark 2.3.0 通常会在 2.2.0 发布大约 6 个月后发布。维护版本根据需要在功能版本之间发布。主要版本没有按照固定时间表发布。
日期 | 活动 |
---|---|
2023 年 7 月 16 日 | 代码冻结。发布分支切断。 |
2023 年 7 月下旬 | QA 阶段。专注于错误修复、测试、稳定性和文档。通常,不会合并新功能。 |
2023 年 8 月 | 发布候选版本 (RC)、投票等,直到最终版本通过 |
功能发布分支通常会使用错误修复版本维护 18 个月。例如,分支 2.3.x 从 2019 年 9 月开始不再被视为维护,这是 2018 年 2 月发布 2.3.0 18 个月后。在那之后,不应该再期望出现 2.3.x 版本,即使是错误修复也是如此。
主要版本中的最后一个次要版本通常会作为“LTS”版本维护更长时间。例如,2.4.0 于 2018 年 11 月 2 日发布,并一直维护了 31 个月,直到 2021 年 5 月发布 2.4.8。2.4.8 是最后一个版本,即使是错误修复,也不应该再期望出现 2.4.x 版本。