本指南记录了为 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 工程实践文档中代码审查者的详细指南。简而言之,具有许多或大的积极影响,以及很少的消极影响或风险的更改,更有可能被合并,并且合并速度更快。风险较高且价值较低的更改不太可能被合并,并且可能会被直接拒绝,而不是进行多次审查。
在提出代码更改之前,请先查看前面的部分。本节介绍如何执行此操作。
当您贡献代码时,您确认该贡献是您的原创作品,并且您根据项目的开源许可证将该作品许可给项目。无论您是否明确声明这一点,通过 pull request、电子邮件或其他方式提交任何受版权保护的材料,您都同意根据项目的开源许可证许可该材料,并保证您拥有这样做的法律授权。
如果您有兴趣使用最新的开发中代码或为 Apache Spark 开发做出贡献,您可以从 Git 检出 master 分支
# Master development branch
git clone git://github.com/apache/spark.git
下载 Spark 后,您可以在文档页面上找到有关安装和构建它的说明。
通常,Spark 使用 JIRA 来跟踪逻辑问题,包括错误和改进,并使用 GitHub pull request 来管理特定代码更改的审查和合并。也就是说,JIRA 用于描述应该修复或更改的内容以及高级方法,而 pull request 用于描述如何在项目的源代码中实现该更改。例如,主要的架构决策将在 JIRA 中讨论。
修复 Foo scaladoc 中的错别字
correctness
: 一个正确性问题data-loss
: 一个数据丢失问题release-notes
: 更改的效果需要在发行说明中提及。 JIRA 或 pull request 应包括适合包含在发行说明中的详细信息——请参见下面的“Docs Text”。starter
: 适合新贡献者的小型、简单的更改dev@spark.apache.org
上邀请讨论该问题。在 Apache Spark 中创建 pull request 之前,重要的是检查测试是否可以在您的分支上通过,因为我们的 GitHub Actions 工作流程会自动为您的 pull request/后续提交运行测试,并且每次运行都会加重 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
分支打开一个 pull request。(只有在特殊情况下,PR 才会针对其他分支打开)。这将触发 Spark 仓库上的“On pull request*”工作流程,该工作流程将查找/监视“你的” fork 仓库上成功的工作流程运行(如果正在运行,它将等待)。[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
添加 remote 以跟上上游更改,运行 git fetch upstream
,然后运行 git rebase upstream/master
并手动解决冲突,然后将结果推送到你的分支来解决此问题。master
之外的分支打开 pull request,你实际上必须手动关闭 pull request请遵循现有代码库的样式。
如果你不确定某种事物的正确样式,请尝试遵循现有代码库的样式。 查看代码中是否有其他示例使用了你的功能。 也可以在 dev@spark.apache.org
列表中提问和/或咨询提交者。
Apache Spark 项目遵循 Apache 软件基金会行为准则。 行为准则适用于 Apache 软件基金会管理的所有空间,包括 IRC、所有公共和私人邮件列表、问题跟踪器、维基、博客、Twitter 以及我们的社区使用的任何其他沟通渠道。 专门针对面对面活动(即会议)的行为准则已编入已发布的 ASF 反骚扰政策。
我们希望正式或非正式地参与 Apache 社区或声称与基金会有任何关联的每个人,在任何与基金会相关的活动中,尤其是在代表 ASF 时,以任何身份遵守此行为准则。
此代码不是详尽或完整的。 它旨在提炼我们对协作、共享环境和目标的共同理解。 我们希望它在精神上和字面上都得到遵守,以便它可以丰富我们所有人以及我们参与的技术社区。
有关更多信息和具体指南,请参阅 Apache 软件基金会行为准则。