Google Summer of Code '19

Google Summer of Code 對我來說是一次很棒的學習體驗。我為開源專案做出貢獻,了解了 Apache Beam 的內部運作,並與世界上最優秀的工程師一起工作。

動機

我的兩個朋友在 2018 年參加了 GSoC。他們的經歷引起了我的興趣。在該領域最優秀的人指導下,從事可能被世界各地的開發人員使用的開源軟體工作,這個想法令人興奮!因此,我決定今年嘗試參加 Google Summer of Code。

什麼是 Google Summer of Code?

Google Summer of Code 是由 Google 主辦的一項全球計畫,旨在向學生介紹開源軟體開發。學生在大學放假期間,與開源組織合作進行為期 3 個月的程式設計專案。

為什麼選擇 Apache Beam?

Atlan 實習期間,我發現了資料工程領域。我發現那裡的工程師面臨的挑戰和討論很有趣。在研究我的實習專案時,我偶然發現了《Streaming Systems》這本書。它向我介紹了 Apache Beam 對於批次和串流系統的統一模型,我對此非常著迷。我想探索資料工程,所以在 GSoC,我想從事該領域的專案。在我的實習快結束時,我開始為 Apache Airflow(非常酷的專案)和 Apache Beam 做出貢獻,希望他們其中一個會參與 GSoC。我運氣很好!

此外,Spotify 的「Discover Weekly」也使用了 Apache Beam!

準備

我已經讀過《Streaming Systems》這本書。因此,我了解 Beam 的基本概念,但從未真正使用過 Beam。在實際提交提案之前,我瀏覽了許多資源,以確保我對 Beam 有具體的理解。我讀了 Tyler Akidau 的 Streaming 101Streaming 102 部落格。它們是對 Beam 批次和串流統一模型的完美介紹。此外,我還觀看了 YouTube 上所有關於 Beam 的演講。您可以在Beam 網站上找到它們。Beam 有非常好的文件。程式設計指南很好地闡述了 Beam 的所有概念。Beam 的執行模型也有很好的文件記錄,是了解 Beam 如何處理資料的必讀內容。waitingforcode.com 也有關於 Beam 概念的優質部落格文章。為了更好地了解 Beam 的程式碼庫,我對其進行了操作,並完成了一些 PR,以更好地了解 Beam,並熟悉測試套件和工作流程。

GSoC 之旅

GSoC 分為兩個階段。第一個階段是社群連結期,學生在此期間熟悉專案和社群。另一個階段是實際的程式設計期,學生在此期間從事他們的專案。由於程式設計期有三次評估,間隔一個月,我將專案分為三個部分,重點關注實作、測試和文件或改進。

專案

我的專案(BEAM-6611)新增了對於串流管線,使用檔案載入方法將資料插入 BigQuery 的支援。它建立在 PR - #7655 的基礎上,該 PR 針對 BEAM-6553,在 Python SDK 中新增了使用檔案載入方法將資料寫入 BigQuery 的支援,適用於批次管線。具有非預設 Windowing、Triggering 和 Accumulation 模式的串流管線可以使用檔案載入方法將資料寫入 BigQuery。如果發生錯誤,管線將以原子方式失敗。這表示每筆記錄最多會被載入到 BigQuery 一次。您可以在這裡找到我的提案。

社群連結

當 GSoC 開始時,我的學期末考試還沒結束。因此,我沒有做太多事情。我為 Python SDK 撰寫了三個 PTransform - Latest、WithKeys 和 Reify。

程式設計期 I

在此期間,我使用串流模式,為 BigQuery sink 撰寫了一些使用串流插入的整合測試。我為我的專案撰寫了一個失敗的整合測試。我也完成了我的專案實作。但是,有一個 PostCommit 測試沒有通過。我意識到查詢 BigQuery 結果的整合測試的匹配器,原本是設計用於批次模式。因此,我撰寫了一個用於串流模式的匹配器版本。

程式設計期 II

即使我新增了串流模式的匹配器,PostComit 測試也沒有通過。即使沒有指定,也會執行測試。我將失敗的原因歸咎於 限制,這是因為 nose(一個 Python 測試框架)的多進程插件,導致它找到的測試比指定的還要多。我花了一些時間才弄清楚這一點。在此期間,我的專案的變更被合併。我也處理了與測試相關的小問題。

這段期間發生了一些令人興奮的事件

  • 成為 apache/beam 的前 100 名貢獻者。
  • 我第一個開源專案的 PR 審查。
Weird flex but ok

程式設計期 III

這是計畫結束前的最後一個程式設計期。由於我的專案比預期的更早合併,我的導師建議在同一個區域 - BigQueryIO 中,處理另一個我感興趣的問題(BEAM-7742)。因此,我致力於在 BigQuery 中分割寫入的檔案,以確保所有觸發的載入作業都符合 BigQuery 指定的載入作業大小限制。在處理我的專案時,我使用了一個以 PubSub 作為來源,並以 BigQuery 作為 sink 的管線來驗證我的變更。我的導師建議我們將它們新增到 Beam 測試套件中,因為這將是對 BigQueryIO 的最終測試。我也致力於將此測試新增到 Beam 中。

您可以在這裡找到我處理的 PR 列表。

結論

GSoC 對我來說是一堂關於紀律和目標設定的課程。決定我想做什麼以及我每週想完成多少事情是一堂重要的課程。我從未遠端工作過,所以這是一種新的體驗。雖然我最初很掙扎,但我很欣賞它帶來的彈性。我也從學習 Apache Beam 的內部運作和同一生態系統中的其他工具中獲得了很多樂趣。這也是我第一次使用測試優先方法撰寫程式碼。

我感謝我的導師 - Pablo Estrada、Apache Beam、The Apache Software Foundation 和 Google Summer of Code 提供這個機會。我也感謝我的導師幫助我解決了我需要的一切,以及更多,並感謝 Apache Beam 社群的支持和鼓勵。

只要有正確的努力、毅力、信念和計畫,一切皆有可能。一切。