BigQuery 概念验证

Google 的新 BigQuery 服务是否可以为客户提供大数据分析能力,而无需昂贵的软件或新的基础设施?Thoughtworks 和 AutoTrader 进行了一周的 概念验证测试,使用了一个庞大的数据集。测试表明,在 7.5 亿行数据集上,查询性能始终保持在 7-10 秒的范围内。我们使用 REST API 与 Java、JavaScript 和 Google 图表创建了一个带有交互式可视化查询结果的 Web 前端。整个练习由三个人在五天内完成。结论:BigQuery 表现良好,可以为拥有大数据和较小预算的组织带来益处,尤其是那些没有数据仓库或数据仓库使用受限的组织。

2012 年 9 月 4 日


Photo of Ian Cartwright

伊恩是 Thoughtworks 的首席顾问和架构师。他已在 Thoughtworks 工作 10 年,从编写代码到帮助 CTO 制定战略,无所不包。他目前关注的领域包括 GPU 和多核如何改变软件设计以及在线竞争所需的组织变革。


Google 最近对其企业产品进行了升级,推出了改进版的 Google App Engine 和一些新工具。Google BigQuery 是一种新的在线服务,用于对海量数据(高达数十亿行)运行交互式查询,速度极快。它非常适合快速分析大量数据,但不适合修改数据。在数据分析方面,BigQuery 是一种 OLAP(联机分析处理)系统,旨在帮助组织处理大数据。

我们非常有兴趣对这项技术进行测试,因此我们寻找了一家拥有“大”数据集的合作伙伴。我们的一位英国客户 AutoTrader 既拥有大数据,又有一个他们希望 BigQuery 能够帮助解决的业务问题。

AutoTrader 是英国排名第一的二手车买卖网站,还出版了一份每周分类广告杂志。经销商在二手车入库时想知道的两个问题是:应该出价多少?以及可能需要多长时间才能卖出去?答案就在 AutoTrader 的历史数据中。

我们从 AutoTrader 借用了过去五年中他们在网站上发布的所有广告的数据,包括广告展示的时间以及车辆从网站上移除时的价格(假设这是车辆的售价)。测试数据集包含超过 7.5 亿行数据,并已上传到亚马逊的 EC2。

将数据导入 BigQuery

在处理大数据时,文件大小限制是一个问题。我们使用了 Unix 命令行“split”将数据文件拆分为适当大小的块,注意在行边界处拆分文件,而不是在记录的中间。在执行此操作时,需要考虑 Google Cloud Storage (GCS) 限制和 BigQuery 导入限制。

一旦我们成功安装了 Google 的 GCS 命令行工具 gsutil,我们就使用它将数据从亚马逊转移到 GCS,事实证明这是整个过程中最慢的部分。总共大约需要 12 个小时才能将所有行转移到 GCS。我们尝试使用 gsutil 中的并行上传功能,但这会导致我们的 EC2 实例成为 I/O 绑定。事后看来,我们可以花更多时间尝试不同的亚马逊区域、文件大小和并行上传,以加快此过程。

将数据放入 GCS 后,我们接下来创建了一个非常简单的文本文件来表示模式,并将其与 Big Query 命令行工具 (bq) 一起使用,在 BigQuery 中设置表格。我们首先使用一小部分数据进行了测试,从 BigQuery Web 控制台 执行了一些查询,以确保在加载整个数据集之前一切正常。

下一阶段是从 GCS 完成传输到新定义的 BigQuery 数据库。由于我们在从亚马逊上的源进行并行上传到 GCS 时遇到了问题,因此我们没有尝试对加载到 BigQuery 的操作使用并行功能。后来我们发现,我们可以这样做,并且可能将 8 小时的传输时间缩短到大约 15 分钟。

上传完所有数据后,我们尝试了一些查询。一开始,这些查询速度非常慢,可能是由于 BigQuery 内部的一些内部分布尚未完成。最初这些查询需要几分钟才能完成,但第二天早上,查询时间缩短到大约 7 到 10 秒,并且在整个练习的剩余时间里,查询时间保持在合理范围内。

使用 BigQuery 和 Google 图表创建大数据 Web 分析

我们决定使用 Google App Engine 为我们的查询创建一个简单的 Web 前端,并嵌入 Google 图表 以实现交互式可视化输出。

我们的网页对我们的应用程序进行 RESTful 调用,该应用程序反过来使用 Java Big Query API(Python 也是一种选择)对数据进行 RESTful 调用以调用查询。然后,结果使用 Google 图表库在客户端呈现。除了交互式图表之外,我们还能够添加一个简单的导出机制,利用了 BigQuery 结果保存到临时表格这一事实,可以通过“作业 ID”访问该表格。这为将查询结果导出到 GCS(因此导出到其他 Google 工具或作为 CSV 文件)提供了一种非常简单快捷的方法。所有这些都通过 OAUTH 进行保护,使我们能够对谁可以查看、访问和使用应用程序调用查询进行细粒度控制。

我们开始研究将我们的 Web 应用程序更改为使用异步机制来调用 BigQuery,但时间不够。也就是说,使用作业 ID 查询中间结果看起来非常简单。如果有机会再次进行,我们将从一开始就采用异步方法。

结论和优势

总的来说,我们对在短时间内使用 BigQuery、API 和实用程序所取得的成果印象深刻。我们能够以相对较低的投资(时间方面)来尝试不同的可视化和查询大量数据的方法,而无需昂贵的基础设施。

对于渴望深入了解海量数据集的组织来说,BigQuery 可能是一个可行的选择,它不需要购买专门的软件或额外的基础设施。即使对于已经拥有企业数据仓库的组织来说,BigQuery 也是测试理论或在数据仓库管理员对使用施加限制的其他情况下的一种选择。

问题和教训

我们在概念验证过程中遇到了其他人可以从中吸取教训的问题。

安装 Google 工具

确保安装了正确版本的 Python,并且路径上没有多个版本,以避免出现问题。我们发现最好使用可下载版本的工具,因为我们早期的尝试(尝试使用 easy_install 和旧版本的 python)导致了很多问题。

Google 代码库示例

事实证明,很难找到一些在 App Engine 中使用的 BigQuery 的工作 Java 示例,尤其是在 OAUTH 机制方面。但是,一旦我们创建了一些类来处理工作,我们就再也没有遇到任何问题,即使是四阶段重定向(因为 Thoughtworks 使用它自己的企业 OAUTH 机制与 Google 应用程序一起使用)。需要进行更多思考才能使这些机制与诸如 webdriver 和自动验收测试之类的工具一起使用。

图表和 BigQuery 的 JSON 格式略有不同

另一个问题是,BigQuery 返回的 JSON 格式与图表期望的格式略有不同。虽然这样做有充分的理由,但如果图表能够直接使用一些 JSON,则可以减少我们必须创建的代码量。

时间戳是一个问题

我们的数据包含以非标准格式(从 Google 工具的角度来看)的时间戳。这使得构建按时间段选择的查询变得困难。虽然我们能够解决这个问题,但这确实限制了我们希望对数据进行的一些操作。我们已经将此问题反馈给 BigQuery 团队,预计他们将来会在日期/时间格式方面提供更多灵活性。

使用 Web 控制台

在进行实验时,我们发现 BigQuery Web 控制台对于在将查询添加到代码之前尝试查询非常有用。

尝试使用 gsutil 和 bq 并行加载

虽然我们在从亚马逊加载到 GSC 时遇到了 I/O 问题,但我们后来发现,我们可以通过使用从 GCS 到 BigQuery 本身的并行加载来节省很多时间。值得测试 gsutil 和 bq 提供的各种选项,以查看哪些选项在您的环境中提供最佳性能。

在执行查询和使用小型数据集开发时,注意数据使用情况

如果您要对完整数据集进行大量测试,则可能会使用数 TB 或更多 TB 的数据,这可能会产生高额费用。查询返回速度如此之快,以至于您会忘记返回集可能有多个 GB(并且它们会迅速累积)。


技术

BigQuery:命令行、Web 控制台、API

Google Cloud Storage:命令行

Google App Engine:Java、RESTful API、OAUTH

Web 前端:JavaScript、Google 图表

致谢

来自 AutoTrader 的 James Roberts 和来自 Thoughtworks 的 Vyv Codd 与我一起编写了代码。来自 AutoTrader 的 Pete Hanlon 提供了数据,并与来自 Thoughtworks 的 Nick Hines 和 Stuart Hogg 一起支持了团队。

重大修订

2012 年 9 月 4 日:首次发布在 martinfowler.com 上