Bigslice:Go 的集群计算系统

在 GRAIL,我们的使命是在癌症可以治愈的时候及早发现。我们的方法是一种特别数据密集型的方法。我们从大量研究参与者中收集基因组测序数据。这些数据必须以计算密集型方式进行处理,然后进行整体分析以训练可以预测个体癌症状态的模型。

这种构建模型的方法是迭代的:在开发过程中,研究人员必须在真实数据上测试他们的想法,以获得更多的洞察力,从而产生进一步的改进。这种开发得益于快速的反馈周期;研究人员必须能够快速执行他们的想法,并从结果中学习。只有当我们能够及时有效地执行所需的数据处理时,该方法才可行。

在 GRAIL,我们将 Go 编程语言用于大多数生物信息学、数据处理和机器学习任务。虽然对于这些领域来说这是一种有点非传统的语言,但我们觉得我们的选择很好:Go 的简单性让新手更容易学习;其透明的运行时语义可以很容易地推断性能;它控制数据布局和分配的能力使得编写高性能数据处理代码成为可能。

然而,Go生态系统缺乏大规模数据处理的工具。Bigslice 就是那个工具。

Bigslice gopher

Bigslice 是 Go 中用于数据处理的库。Bigslice 提供了一组连贯的运算符,可帮助用户使用普通的 Go 代码有效地计算大型数据集。虽然用户的计算是顺序的——他们指定如何将数据集逐步转换为所需的结果——Bigslice 将计算并行化,并可以将其分布在多个处理器和大型计算集群上。

在底层,Bigslice 将数据集拆分为许多较小的部分,并在每个部分上单独执行这些转换,以便它们可以放入内存中,因此它们可以在多台机器上并行执行。当转换需要重新排列数据时(例如 join 或 reduce 之类的操作),Bigslice 会相应地安排数据重新排列。

Bigslice 是一个普通的 Go 库。例如,用户可以:编写自己的使用 Bigslice 的库;在程序的主函数中使用 Bigslice;或编写单元测试。默认情况下,Bigslice 将在运行它的机器上的可用处理器内核之间分配其计算。这对于测试和开发很有用,但是 Bigslice 的大多数用例都需要机器集群来执行手头的任务。为此,可以指示 Bigslice 在用户云提供商的计算实例之间进行自我分发。Bigslice 使用 Bigmachine 管理一个临时的计算节点集群以支持分发。一旦工作完成,节点再次被拆除;Bigslice 仅分配作业所需的计算。由于 Bigslice 还提供容错功能,它可以提供更便宜但不太可靠的实例(例如,来自 AWS 的 EC2 现货市场);Bigslice 在需要时透明地管理恢复。

使用 Bigslice 分发计算不需要额外的基础设施。通过 Bigmachine,Bigslice 管理所有底层基础设施问题。只要云凭证在用户环境中可用,Bigslice 就会管理所有细节。从这个意义上说,您可以将 Bigslice 称为“无服务器”数据处理系统。

与 Bigmachine 一样,Bigslice 竭尽全力与现有的 Go 生态系统和工具保持一致。即使在大型机器集群上执行数据处理时,Bigslice 也像单个进程一样运行。这方面一个特别有用的方面是用户可以检索整个集群的运行时性能配置文件,从而更容易理解为什么特定作业可能没有像用户预期的那样执行。

在 GRAIL,我们在许多应用程序中广泛使用 Bigslice,包括:

  • 数据处理和ETL;

我们相信 Bigslice 现在的状态将对更广泛的受众有用。截至今天,Bigslice 在 https://github.com/grailbio/bigslice和 https://bigslice.io/ 上开源。 我们期待着接受来自更大社区的贡献。

感谢 Nick Schrock、Jaran Charumilind、Oggie Nikolic 和 Demetri Nicolaou 对这篇文章的反馈。