本指南记录了向 Apache Spark 做出各种类型贡献的最佳方式,包括提交代码更改之前所需的条件。
贡献 Spark 不仅仅意味着编写代码。在邮件列表上帮助新用户、测试发布版本以及改进文档也同样受欢迎。事实上,提出重要的代码更改通常需要首先通过其他方式在社区中积累经验和信誉。本指南也旨在帮助您成为一名有效的贡献者。
因此,本指南按照新贡献者如果打算长期参与可能需要考虑的顺序来组织贡献。建立帮助他人的良好记录,而不仅仅是打开拉取请求。
为 Spark 做出贡献的一个好方法是在 user@spark.apache.org
邮件列表或 StackOverflow 上帮助回答用户问题。总是有许多新的 Spark 用户;花几分钟时间帮助回答一个问题是一项非常有价值的社区服务。
贡献者应订阅此邮件列表并关注它,以便了解 Spark 的最新动态。回答问题是帮助社区的一种极佳且显眼的方式,也能展示您的专业知识。
有关如何在邮件列表以及 StackOverflow 等论坛上有效参与讨论的指南,请参阅邮件列表指南。
Spark 的发布流程以社区为导向,社区成员可以在 dev@spark.apache.org
邮件列表上投票决定新版本。Spark 用户受邀订阅此列表以接收公告,并在新版本上测试他们的工作负载,以及提供在新版本中发现的任何性能或正确性问题的反馈。
Spark 源代码的更改通过GitHub 拉取请求(稍后描述)提出、审查和提交。任何人都可以查看并评论此处的活动更改。审查他人的更改是了解更改流程如何工作以及接触代码各部分活动的好方法。您可以通过审查更改并提出问题或指出问题来提供帮助——无论是错别字还是小的风格问题。另请参阅 https://spark-prs.appspot.com/,以方便查看和筛选开放的 PR。
要提出对发布文档(即出现在 https://spark.apache.org/docs/ 下的文档)的更改,请编辑 Spark docs/
目录中的 Markdown 源文件,其 README
文件展示了如何在本地构建文档以测试您的更改。提出文档更改的过程与下面提出代码更改的过程相同。
要提出对其他文档(即不出现在 https://spark.apache.org/docs/ 下的文档)的更改,同样,请编辑 spark-website 仓库中的 Markdown 并打开一个拉取请求。
就像 Java 和 Scala 应用程序可以访问大量库和实用程序,但这些都不属于 Java 或 Scala 本身一样,Spark 旨在支持丰富的库生态系统。许多新的有用实用程序或功能应该存在于 Spark 之外,而不是在核心中。例如:语言支持可能必须是 Spark 核心的一部分,但有用的机器学习算法可以很好地存在于 MLlib 之外。
为此,大型和独立的全新功能通常会被拒绝包含在 Spark 本身中,但可以且应该作为单独的项目和仓库托管,并包含在 spark-packages.org 集合中。
理想情况下,错误报告应附带修复该错误的拟议代码更改。但这并非总是可行,因为发现错误的人可能没有修复错误的经验。可以通过创建 JIRA 报告错误,但不创建拉取请求(见下文)。
然而,错误报告只有包含足够的信息以理解、隔离并理想情况下重现错误时才有用。仅仅遇到错误并不意味着应该报告错误;如下所述,请先搜索 JIRA,并在 Spark 用户/开发者邮件列表上搜索和询问。无法重现的错误或简单的错误报告可能会被关闭。
如果错误报告包含有关错误是如何引入的、由哪个提交引入的描述,那将非常有帮助,这样审查者可以轻松理解该错误。它还有助于提交者决定合并拉取请求时,错误修复应该回溯到多远的版本。修复错误的拉取请求应将问题缩小到根本原因。
性能退化也是一种错误。修复性能退化的拉取请求必须提供基准测试以证明问题确实已修复。
请注意,数据正确性/数据丢失错误非常严重。请确保相应的错误报告 JIRA 票据被标记为 correctness
或 data-loss
。如果错误报告没有得到足够的关注,请发送电子邮件至 dev@spark.apache.org
,以引起更多关注。
也可以提出新功能。除非附有详细信息(例如设计文档和/或代码更改),否则这些通常没有帮助。大型的新贡献应首先考虑 spark-packages.org(见上文),或者首先在邮件列表上进行讨论。功能请求可能会被拒绝,或者在长时间不活动后关闭。
鉴于 Apache Spark JIRA 中提出的问题数量庞大,不可避免地,有些问题是重复的,或者变得过时并最终通过其他方式修复,或者无法重现,或者可以从更多细节中受益,等等。帮助识别这些问题并解决它们很有用,可以通过推进讨论甚至解决 JIRA。大多数贡献者都能够直接解决 JIRA。在确定您是否非常确信问题应该解决时,请运用判断力,尽管更改可以很容易地撤销。如果有疑问,只需在 JIRA 上留下评论即可。
解决 JIRA 时,请遵循一些有用的约定
Spark 是一个异常繁忙的项目,平均每隔几小时就会有一个新的 JIRA 或拉取请求。审查可能需要提交者数小时或数天的时间。如果贡献者专注于有用、清晰、易于评估且已通过基本检查的更改,那么每个人都会受益。
有时,贡献者会已经有特定的新更改或错误。如果正在寻找想法,请查阅 JIRA 中入门任务列表,或询问 user@spark.apache.org
邮件列表。
在继续之前,贡献者应评估拟议的更改是否可能相关、新颖且可操作
user@spark.apache.org
询问可能的更改user@spark.apache.org
和 dev@spark.apache.org
邮件列表存档中搜索相关讨论。通常,问题以前已经讨论过,并且解决方案不需要代码更改,或者记录了哪些类型的更改将不被接受为解决方案。spark [搜索词]
。如果已经存在逻辑上类似的问题,则首先对现有 JIRA 和拉取请求的讨论做出贡献,而不是创建新的。值得再次强调的是,对 Spark 核心或对 SQL 和 Catalyst 等高度复杂且重要的模块进行更改,更难以正确完成。它们将受到更严格的审查,并按照比对不那么关键的代码更高的审查标准进行评估。
虽然丰富的算法集是 MLlib 的重要目标,但扩展项目需要将可维护性、一致性和代码质量放在首位。新算法应
@Since
注解。Spark 中抛出的异常应与标准化且可操作的错误消息相关联。
错误消息应回答以下问题
编写错误消息时,您应该
有关更多详细信息,请参阅错误消息指南。
行为变更是指通过公共 API 在新版本中用户可见的功能变更。“用户”在这里不仅指编写查询和/或开发 Spark 插件的人,还指部署和/或管理 Spark 集群的人。新功能和错误修复,例如纠正查询结果或模式以及使以前返回不正确结果的不受支持查询失败,都被视为行为变更。但是,性能改进、代码重构以及对未发布 API/功能的更改则不是。
每个人都会犯错误,包括 Spark 开发者。我们将继续修复 Spark 中出现的缺陷。然而,重要的是要传达这些行为变更,以便 Spark 用户为版本升级做好准备。如果一个 PR 引入了行为变更,应在 PR 描述中明确提及。如果行为变更可能需要额外的用户操作,应在迁移指南中突出显示(SQL 组件为 docs/sql-migration-guide.md,其他组件为类似文件)。在可能的情况下,提供选项以恢复之前的行为,并在错误消息中提及这些选项。一些示例包括
此列表并非旨在详尽。任何审查 PR 的人都可以要求 PR 作者将其添加到迁移指南中,如果他们认为该更改有风险并且可能在升级期间扰乱用户。
在考虑如何贡献代码之前,了解代码是如何被审查以及为什么更改可能被拒绝是很有用的。请参阅 Google 工程实践文档中代码审查员详细指南。简而言之,具有许多或巨大优点、且负面影响或风险较小的更改,更有可能被合并,并且会很快合并。有风险且价值较低的更改极不可能被合并,并且可能被直接拒绝,而不是进行多次审查。
在提出代码更改之前,请先阅读前一节。本节将介绍如何操作。
当您贡献代码时,您确认该贡献是您的原创作品,并且您根据项目的开源许可将作品许可给项目。无论您是否明确声明,通过拉取请求、电子邮件或其他方式提交任何受版权保护的材料,即表示您同意根据项目的开源许可许可该材料,并保证您拥有这样做的合法权限。
如果您有兴趣使用最新的开发中代码或为 Apache Spark 开发做出贡献,您可以从 Git 中检出 master 分支
# Master development branch
git clone git://github.com/apache/spark.git
下载 Spark 后,您可以在文档页面上找到安装和构建它的说明。
通常,Spark 使用 JIRA 来跟踪逻辑问题,包括错误和改进,并使用 GitHub 拉取请求来管理特定代码更改的审查和合并。也就是说,JIRA 用于描述应该修复或更改什么以及高级方法,而拉取请求描述如何在项目源代码中实现该更改。例如,重要的设计决策在 JIRA 中讨论。
修复 Foo scaladoc 中的错别字
correctness
: 正确性问题data-loss
: 数据丢失问题release-notes
: 更改的效果需要在发布说明中提及。JIRA 或拉取请求应包含适合发布说明的详细信息——请参阅下面的“文档文本”。starter
: 适合新贡献者的简单小更改dev@spark.apache.org
讨论该问题。在 Apache Spark 中创建拉取请求之前,检查您的分支上的测试是否可以通过非常重要,因为我们的 GitHub Actions 工作流会自动为您的拉取请求/后续提交运行测试,并且每次运行都会增加 Apache Spark 仓库中 GitHub Actions 有限资源的负担。以下步骤将引导您完成该过程。
test("SPARK-12345: a short description of the test") {
...
@Test
public void testCase() {
// SPARK-12345: a short description of the test
...
def test_case(self):
# SPARK-12345: a short description of the test
...
test_that("SPARK-12345: a short description of the test", {
...
./dev/run-tests
)以验证代码是否仍然编译、通过测试并符合风格检查。如果风格检查失败,请查阅下面的代码风格指南。apache/spark
的 master
分支打开拉取请求。(仅在特殊情况下 PR 才会针对其他分支打开)。这将触发“On pull request*”工作流(在 Spark 仓库上),该工作流将查找/监视您 fork 的仓库上的成功工作流运行(如果正在运行,它将等待)。[SPARK-xxxx][COMPONENT] Title
的形式,其中 SPARK-xxxx
是相关的 JIRA 编号,COMPONENT
是 spark-prs.appspot.com 中所示的 PR 类别之一,Title 可以是 JIRA 的标题或更具体地描述 PR 本身的标题。[WIP]
。@username
以立即提醒他们。git remote add upstream https://github.com/apache/spark.git
添加远程以跟上上游更改,运行 git fetch upstream
,然后运行 git rebase upstream/master
并手动解决冲突,然后将结果推送到您的分支来解决。master
以外的分支打开拉取请求,您实际上必须手动关闭拉取请求请遵循现有代码库的风格。
如果您不确定某种风格是否正确,请尝试遵循现有代码库的风格。查看代码中是否有其他使用您功能的示例。也欢迎在 dev@spark.apache.org
邮件列表上提问和/或咨询提交者。
Apache Spark 项目遵循Apache 软件基金会行为准则。行为准则适用于 Apache 软件基金会管理的所有空间,包括 IRC、所有公共和私人邮件列表、问题追踪器、维基、博客、Twitter 以及我们社区使用的任何其他通信渠道。针对面对面活动(即会议)的行为准则已在发布的 ASF 反骚扰政策中明确规定。
我们期望所有正式或非正式参与 Apache 社区、或声称与基金会有任何关联的人,在所有与基金会相关的活动中,特别是在以任何身份代表 ASF 时,都应遵守本行为准则。
本准则并非详尽或完整。它旨在提炼我们对协作、共享环境和目标的共同理解。我们期望其精神和文字同样得到遵循,以便它能够丰富我们所有人以及我们所参与的技术社区。
欲了解更多信息和具体指南,请参阅Apache 软件基金会行为准则。