谷歌暑期实习生项目 '19

谷歌暑期实习生项目对我来说是一次很棒的学习体验。我为开源项目做出了贡献,了解了 Apache Beam 的内部机制,并与世界上最优秀的工程师一起工作。

动机

我的两位朋友在 2018 年参加了 GSoC。他们的经历让我很着迷。在最好的领域专家的指导下,为可能被全球开发人员使用的开源软件工作,这种想法令人兴奋!因此,我决定今年尝试一下谷歌暑期实习生项目。

什么是谷歌暑期实习生项目?

谷歌暑期实习生项目 是由谷歌主办的全球性项目,旨在让学生了解开源软件开发。学生在大学假期期间与开源组织合作,进行为期 3 个月的编程项目。

为什么选择 Apache Beam?

Atlan 实习期间,我发现了数据工程领域。我认为该领域的挑战和工程师的讨论很有趣。在为我的实习项目做研究时,我发现了《流式系统》一书。这本书向我介绍了 Apache Beam 用于批处理和流式系统的统一模型,我对此很着迷。我想探索数据工程,因此在 GSoC 中,我想从事该领域的项目。在实习结束时,我开始为 Apache Airflow(非常棒的项目)和 Apache Beam 做贡献,希望其中一个项目会参与 GSoC。我幸运地得到了机会!

此外,Spotify 的 Discover Weekly 使用 Apache Beam!

准备

我已经读过《流式系统》一书。因此,我对 Beam 所基于的概念有所了解,但我从未真正使用过 Beam。在实际提交提案之前,我查看了许多资源,以确保我对 Beam 有了具体的了解。我阅读了 Tyler Akidau 的《流式 101》和《流式 102》博客。它们是 Beam 用于批处理和流式系统的统一模型的完美介绍。此外,我还观看了 YouTube 上的所有 Beam 演讲。您可以在 Beam 网站 上找到它们。Beam 的文档非常棒。编程指南 对 Beam 的所有概念进行了很好的阐述。Beam 的执行模型 也有很好的记录,这是了解 Beam 如何处理数据的必读内容。waitingforcode.com 也提供了有关 Beam 概念的优质博文。为了更好地了解 Beam 代码库,我尝试使用它,并针对一些 PR 进行了一些工作,以便更好地了解 Beam,并熟悉测试套件和工作流程。

GSoC 之旅

GSoC 分为两个阶段。第一个阶段是社区融合期,学生在此期间熟悉项目和社区。另一个阶段是实际的编码期,学生在此期间进行项目工作。由于编码期有三个评估,间隔一个月,我将我的项目分为三个部分,重点是实现、测试和文档或改进。

项目

我的项目(BEAM-6611)为流式管道向 BigQuery 插入数据添加了对文件加载方法的支持。它基于针对 BEAM-6553 的 PR - #7655,该 PR 为 Python SDK 添加了使用文件加载方法对批处理管道写入 BigQuery 的支持。使用非默认窗口、触发和累积模式的流式管道可以使用文件加载方法将数据写入 BigQuery。如果发生故障,管道将原子性地失败。这意味着每条记录最多仅加载一次到 BigQuery 中。您可以在 此处 找到我的提案。

社区融合

当 GSoC 开始时,我的学期末考试还没有结束。因此,我无法完成太多工作。我为 Python SDK 制作了三个 PTransforms - Latest、WithKeys 和 Reify。

编码期 I

在此期间,我为使用流式插入的 BigQuery 接收器编写了一些集成测试,以进行流式模式测试。我针对我的项目做了一些失败的集成测试。我还完成了项目的实现。但是,一个提交后测试没有通过。我意识到用于查询 BigQuery 以获取结果的集成测试匹配器旨在用于批处理模式。因此,我编写了一个版本的匹配器,以便在流式模式下工作。

编码期 II

即使我添加了流式模式的匹配器,提交后测试也没有通过。即使没有指定,一个测试也在运行。我将故障隔离到 nose(一个 Python 测试框架)的多进程插件的限制,导致它找到了比指定更多的测试。我花了一些时间才弄清楚这一点。在此期间,我的项目更改已合并。我还处理了一些与测试相关的较小问题。

这一时期发生了一些令人兴奋的事件。

  • 最终成为 apache/beam 的前 100 名贡献者。
  • 我第一次在开源项目中进行 PR 审查。
Weird flex but ok

编码期 III

这是该项目结束前的最后一个编码期。由于我的项目比预期更早地合并了,我的导师建议我处理 BigQueryIO 领域中的另一个有趣的问题(BEAM-7742)。因此,我开始对 BigQuery 中写入的文件进行分区,以确保触发的所有加载作业都符合为 BigQuery 指定的加载作业大小限制。在处理我的项目时,我使用了一个使用 PubSub 作为源和 BigQuery 作为接收器的管道来验证我的更改。我的导师建议我们将它们添加到 Beam 测试套件中,因为它将是对 BigQueryIO 的最终测试。我还开始将此测试添加到 Beam 中。

您可以在 此处 找到我参与的 PR 列表。

结论

GSoC 对我来说是一堂关于纪律和目标设定课程。决定我想做什么,以及每周想完成多少工作,这很重要。我从未远程工作过,所以这对我来说是一次全新的体验。虽然最初我对此感到很苦恼,但我现在很感谢它带来的灵活性。我还在了解 Apache Beam 的内部机制以及同一生态系统中的其他工具方面玩得很开心。这也是我第一次使用测试先行的方式编写代码。

我感谢我的导师 - Pablo Estrada、Apache Beam、Apache 软件基金会和谷歌暑期实习生项目为我提供了这次机会。我还要感谢我的导师在各方面都提供了帮助,以及 Apache Beam 社区所提供的支持和鼓励。

只要付出正确的努力、坚持不懈、坚定信念并制定计划,一切皆有可能。一切皆有可能。