本指南說明對 Apache Spark 進行各種類型貢獻的最佳方式,包括提交程式碼變更前所需的條件。
參與 Spark 不僅僅是撰寫程式碼。協助郵件清單上的新使用者、測試版本和改善文件也受到歡迎。事實上,提出重要的程式碼變更通常需要先透過其他方式協助,在社群中獲得經驗和信譽。這也是成為有效貢獻者的指南。
因此,本指南依序整理貢獻,讓有意長期參與的新貢獻者參考。建立協助他人的記錄,而不要只是開啟拉取請求。
參與 Spark 的絕佳方式是在 user@spark.apache.org
郵件清單或 StackOverflow 上協助回答使用者問題。Spark 永遠都有許多新使用者;花幾分鐘時間協助回答問題是一項非常有價值的社群服務。
貢獻者應訂閱此清單並追蹤,以隨時掌握 Spark 的最新動態。回答問題是協助社群的絕佳且顯著方式,也能展現您的專業知識。
請參閱 郵件清單指南,了解如何有效參與郵件清單上的討論,以及 StackOverflow 等論壇。
Spark 的發佈流程以社群為導向,社群成員可以在 dev@spark.apache.org
郵件清單上針對新發佈進行投票。我們邀請 Spark 使用者訂閱此清單以接收公告,並在較新的版本上測試其工作負載,並提供在較新版本中發現的任何效能或正確性問題的回饋。
Spark 原始碼的變更會透過 GitHub pull 要求(稍後說明)提出、檢閱和提交。任何人都可以在這裡檢視和評論目前的變更。檢閱他人的變更是一個很好的方式,可以瞭解變更流程如何運作,並接觸程式碼各部分的活動。您可以透過檢閱變更並提出問題或指出問題(例如錯字或小型的樣式問題)來提供協助。另請參閱 https://spark-prs.appspot.com/,以取得檢視和篩選開啟的 PR 的便利方式。
若要建議變更發佈文件(即出現在 https://spark.dev.org.tw/docs/ 下的文件),請編輯 Spark docs/
目錄中的 Markdown 原始檔,其 README
檔會顯示如何建立文件以在本地測試您的變更。建議文件變更的流程與下面建議程式碼變更的流程相同。
若要建議變更其餘文件(即不出現在 https://spark.dev.org.tw/docs/ 下的文件),請以類似的方式編輯 spark-website 儲存庫 中的 Markdown,並開啟 pull 要求。
正如 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 中引發的例外狀況應與標準化且可操作的錯誤訊息相關聯。
錯誤訊息應回答下列問題
撰寫錯誤訊息時,您應該
請參閱 錯誤訊息指南 以取得更多詳細資訊。
在考慮如何貢獻程式碼之前,了解如何檢閱程式碼以及變更可能被拒絕的原因很有用。請參閱 Google 工程實務文件中的 程式碼檢閱員詳細指南。簡單來說,具有許多或大量正面影響,且負面影響或風險較少的變更,合併的可能性較高,而且合併速度也較快。風險且價值較低的變更不太可能合併,而且可能會被直接拒絕,而不是接受重複的檢閱。
在提出程式碼變更之前,請檢閱前一節。本節記載如何執行此操作。
當您貢獻程式碼時,您聲明該貢獻是您的原創作品,而且您根據專案的開源授權將作品授權給專案。無論您是否明確陳述,透過拉取要求、電子郵件或其他方式提交任何受版權保護的資料,即表示您同意根據專案的開源授權授權該資料,並保證您有合法權限這麼做。
如果您有興趣使用最新的開發中程式碼,或對 Apache Spark 開發有興趣,您可以從 Git 檢出主分支
# 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 或 pull request 應包含適合納入版本說明的詳細資料 – 參閱下方的「文件文字」。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)。這將觸發 Spark 儲存庫中的「拉取請求上*」工作流程,該工作流程會在「您的」分岔儲存庫上尋找/觀察成功的執行工作流程(如果正在執行,則會等待)。
[SPARK-xxxx][組件] 標題
格式,其中 SPARK-xxxx
為相關的 JIRA 編號,組件
為 spark-prs.appspot.com 上顯示的 PR 類別之一,而標題可以是 JIRA 標題或描述 PR 本身的更具體標題。[WIP]
。@username
以立即 ping 他們。git remote add upstream https://github.com/apache/spark.git
,執行 git fetch upstream
,接著執行 git rebase upstream/master
,再手動解決衝突,然後將結果推送到您的分支。master
之外的分支開啟 pull request,您實際上必須手動關閉 pull request請遵循現有程式碼庫的風格。
如果您不確定某項內容的正確樣式,請嘗試遵循現有程式碼庫的樣式。查看程式碼中是否有其他範例使用您的功能。您也可以隨時在 dev@spark.apache.org
清單中詢問,或詢問提交者。
Apache Spark 專案遵循 Apache 軟體基金會行為準則。行為準則 適用於 Apache 軟體基金會管理的所有空間,包括 IRC、所有公開和私人郵件清單、問題追蹤器、Wiki、部落格、Twitter,以及我們的社群使用的任何其他通訊管道。針對實體活動(例如會議)的特定行為準則已編纂在已發布的 ASF 反騷擾政策中。
我們預期參與 Apache 社群(正式或非正式)的每個人,或聲稱與基金會有任何關聯的人,在任何與基金會相關的活動中,特別是在代表 ASF 擔任任何職位時,都能遵守此行為準則。
此準則並非詳盡無遺或完整。其目的是提煉我們對協作、共享環境和目標的共同理解。我們預期它將在精神上和文字上得到遵循,以便它能豐富我們所有人和我們參與的技術社群。
有關更多資訊和具體指南,請參閱 Apache 軟體基金會行為準則。