本指南介绍了为 Apache Spark 做出各种贡献的最佳方式,包括提交代码更改之前需要做些什么。
为 Spark 贡献不仅仅意味着编写代码。在邮件列表上帮助新用户、测试版本和改进文档也同样受欢迎。事实上,提出重大的代码更改通常需要先通过其他方式帮助社区,从而积累经验和信誉。本指南也是成为有效贡献者的指南。
因此,本指南按顺序组织了贡献,这些贡献应该是新贡献者在打算长期参与时应该考虑的。建立一些帮助他人的记录,而不仅仅是打开拉取请求。
为 Spark 做出贡献的一个好方法是帮助回答用户在 [email protected]
邮件列表或 StackOverflow 上的问题。总是有很多新的 Spark 用户;花几分钟时间帮助回答一个问题是一项非常有价值的社区服务。
贡献者应该订阅此列表并关注它,以便了解 Spark 中发生的事情。回答问题是帮助社区的一种出色且可见的方式,这也展示了你的专业知识。
请参阅 邮件列表指南,了解有关如何在邮件列表以及 StackOverflow 等论坛上有效参与讨论的指南。
Spark 的发布流程是面向社区的,社区成员可以在 [email protected]
邮件列表上对新版本进行投票。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
。如果错误报告没有得到足够的关注,请发送电子邮件至 [email protected]
,以引起更多关注。
也可以提出新功能。这些通常没有帮助,除非附带详细信息,例如设计文档和/或代码更改。大型新贡献应该首先考虑 spark-packages.org(见上文),或者首先在邮件列表上进行讨论。功能请求可能会被拒绝,或者在长时间不活动后被关闭。
鉴于 Apache Spark JIRA 中提出的问题数量之多,不可避免地,一些问题是重复的,或者最终以其他方式变得过时并最终得到修复,或者无法重现,或者可以从更多细节中获益,等等。帮助识别这些问题并解决它们很有用,无论是通过推进讨论,甚至解决 JIRA。大多数贡献者能够直接解决 JIRA。在确定你是否非常有信心应该解决问题时,请使用判断,尽管更改可以轻松撤消。如有疑问,请在 JIRA 上留言。
在解决 JIRA 时,请遵守一些有用的约定
Spark 是一个异常繁忙的项目,平均每隔几个小时就会出现一个新的 JIRA 或拉取请求。审查可能需要提交者花费数小时或数天的时间。如果贡献者专注于有用、清晰、易于评估且已通过基本检查的更改,每个人都会受益。
有时,贡献者已经有一个特定的新更改或错误。如果正在寻找想法,请咨询 JIRA 中的入门任务列表,或询问 [email protected]
邮件列表。
在继续之前,贡献者应该评估建议的更改是否可能相关、新颖且可操作
[email protected]
发送电子邮件,了解可能的更改[email protected]
和 [email protected]
邮件列表的 存档 以查找相关讨论。通常,问题之前已经讨论过,并且有一个不需要代码更改的解决方案,或者记录了哪些类型的更改不会被接受为解决方案。spark [搜索词]
。如果已经存在逻辑上类似的问题,那么请先参与现有 JIRA 和拉取请求的讨论,而不是创建一个新的问题。值得再次强调的是,对 Spark 核心的更改,或对 SQL 和 Catalyst 等高度复杂且重要的模块的更改,更难正确进行。它们将受到更多审查,并且将比对不太关键的代码的更改有更高的审查标准。
虽然丰富的算法集是 MLLib 的重要目标,但要扩展项目,可维护性、一致性和代码质量必须放在首位。新的算法应该
@Since
注解。Spark 中抛出的异常应该与标准化和可操作的错误消息相关联。
错误消息应该回答以下问题
编写错误消息时,您应该
有关更多详细信息,请参阅 错误消息指南。
在考虑如何贡献代码之前,了解代码是如何审查的以及为什么更改可能会被拒绝非常有用。请参阅 Google 工程实践文档中的 代码审查人员详细指南。简而言之,具有许多或大型积极因素,并且负面影响或风险很少的更改更有可能被合并,并且合并速度更快。风险较大和价值较低的更改极不可能被合并,并且可能直接被拒绝,而不是接受审查迭代。
在提出代码更改之前,请查看上一节。本节介绍如何进行操作。
当您贡献代码时,您确认贡献是您的原创作品,并且您根据项目的开源许可证将作品许可给项目。无论您是否明确说明这一点,通过拉取请求、电子邮件或其他方式提交任何受版权保护的材料,您都同意根据项目的开源许可证许可该材料,并保证您有权这样做。
如果您有兴趣使用最新的开发中代码或为 Apache Spark 开发做出贡献,您可以从 Git 中检出 master 分支
# Master development branch
git clone git://github.com/apache/spark.git
下载 Spark 后,您可以在 文档页面 上找到安装和构建它的说明。
通常,Spark 使用 JIRA 来跟踪逻辑问题,包括错误和改进,并使用 GitHub 拉取请求来管理特定代码更改的审查和合并。也就是说,JIRA 用于描述应该修复或更改的内容以及高级方法,而拉取请求描述如何在项目的源代码中实现该更改。例如,主要的设计决策在 JIRA 中进行讨论。
Fix typos in Foo scaladoc
correctness
:正确性问题data-loss
:数据丢失问题release-notes
:更改的影响需要在发行说明中提及。JIRA 或拉取请求应包含适合包含在发行说明中的详细信息 - 请参阅下面的“文档文本”。starter
:适合新贡献者的简单的小更改[email protected]
上邀请讨论该问题。在 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 存储库上),该工作流程将查找/观察“您的”分叉存储库上的成功工作流程运行(如果正在运行,它将等待)。[SPARK-xxxx][COMPONENT] Title
的形式,其中 SPARK-xxxx
是相关的 JIRA 编号,COMPONENT
是 spark-prs.appspot.com 上显示的 PR 类别之一,Title 可以是 JIRA 的标题或更具体的标题,描述 PR 本身。[WIP]
。@username
以立即 ping 他们。git remote add upstream https://github.com/apache/spark.git
添加远程以跟上上游更改,运行 git fetch upstream
,然后运行 git rebase upstream/master
并手动解决冲突,然后将结果推送到您的分支。master
以外的分支打开拉取请求的罕见情况下,您实际上需要手动关闭拉取请求。请遵循现有代码库的风格。
如果您不确定某件事的正确风格,请尝试遵循现有代码库的风格。查看代码中是否有其他使用您功能的示例。随时在 [email protected]
列表上提问,以及/或者询问提交者。
Apache Spark 项目遵循 Apache 软件基金会行为准则。该 行为准则 适用于 Apache 软件基金会管理的所有空间,包括 IRC、所有公开和私人邮件列表、问题跟踪器、维基、博客、Twitter 以及我们的社区使用的任何其他通信渠道。针对面对面活动(即会议)的行为准则在已发布的 ASF 反骚扰政策中进行了编码。
我们希望所有正式或非正式地参与 Apache 社区,或声称与基金会有任何关联,在任何与基金会相关的活动中,尤其是在代表 ASF 时,在任何角色中,都遵守此行为准则。
此代码并非详尽无遗或完整。它旨在提炼我们对协作、共享环境和目标的共同理解。我们希望它在精神上和文字上都能得到遵循,以便它能够丰富我们所有人以及我们参与的技术社区。
有关更多信息和具体指南,请参阅 Apache 软件基金会行为准则。