【翻译】Dremel: Interactive Analysis of WebScale Datasets

作者

Sergey Melnik, Andrey Gubarev, Jing Jing Long, Geoffrey Romer, Shiva Shivakumar, Matt Tolton, Theo assilakis

公司

Google, Inc.

邮箱:{fmelnik,andrey,jlong,gromer,shiva,mtolton,theovg}@google.com

摘要

Dremel 是一个可扩展的交互式即时查询系统,用于分析只读嵌套数据。通过结合多级执行树和列式数据布局,它能够在几秒钟内对万亿行的表运行聚合查询。该系统可扩展到数千个 CPU 和 PB 级数据,并在 Google 中拥有数千名用户。在本文中,我们描述了 Dremel 的架构和实现,并解释了它如何补充基于 MapReduce 的计算。我们为嵌套记录提出了一种新颖的列式存储表示,并讨论了在系统的千个节点实例上的实验。

1. 简介

大规模分析型数据处理已在包括网络公司的多个行业中广泛应用,尤其是因为低成本存储能够收集大量关键业务数据。让分析师和工程师可便捷使用这些数据变得越来越重要。交互式响应时间通常会对数据探索、监控、在线客户支持、快速原型设计、数据流水线调试和其他任务产生质的影响。

大规模执行交互式数据分析需要高度的并行性。例如,使用当今的商用磁盘在一秒钟内读取 1 TB 的压缩数据将需要数万个磁盘。同样,CPU 密集型查询可能需要在数千个核上运行才能在几秒钟内完成。在Google,大规模并行计算是使用商用机器 [5] 的共享集群完成的。集群通常托管大量分布式应用程序,其共享资源、具有广泛变化的工作负载并在具有不同硬件参数的机器上运行。分布式应用程序中的单个工作节点执行给定任务的时间可能比其他工作节点长得多,或者可能由于故障或集群管理系统的抢占而永远无法完成。因此,处理落后者和失败者对于实现快速执行和容错[10]至关重要。

网络和科学计算中使用的数据通常是非关系型的。因此,在这些领域中,灵活的数据模型是必不可少的。编程语言中使用的数据结构、分布式系统交换的消息、结构化文档等自然适用于嵌套表示。在网络规模上对这些数据进行规范化和重组通常是令人望而却步的。嵌套数据模型是 Google [21] 和其他主要网络公司大部分结构化数据处理的基础。

本文描述了一个名为 Dremel(Dremel 是一个电动工具品牌,主要依靠速度而不是扭矩。 我们仅将此名称用于内部项目。)的系统,该系统支持对商用机器共享集群上的超大型数据集进行交互式分析。与传统数据库不同,它能够对原位嵌套数据进行操作。原位是指“就地”访问数据的能力,例如,在分布式文件系统(如 GFS [14])或另一个存储层(例如,Bigtable [8])中。Dremel 可以对此类数据执行许多查询,这些查询通常需要一系列 MapReduce(MR [12])作业,但只需要一小部分执行时间。Dremel 并不打算作为 MR 的替代品,通常与其结合使用以分析 MR 流水线的输出或快速原型化更大的计算。

Dremel 自 2006 年开始投入生产环境,在 Google 内部拥有数千名用户。公司内部署了多个 Dremel 实例,节点数从数万到数千不等。 使用该系统的示例包括:

  • 对抓取的 Web 文档进行分析。
  • 跟踪 Android Market 上应用程序的安装数据。
  • Google 产品的崩溃报告。
  • 来自 Google Books 的 OCR 结果。
  • 垃圾邮件分析。
  • 调试 Google 地图上的地图图块。
  • 托管的 Bigtable 实例中的分片迁移。
  • 在 Google 的分布式构建系统上运行的测试结果。
  • 数十万个磁盘的磁盘 I/O 统计信息。
  • 对在 Google 数据中心运行的作业进行资源监控。
  • Google 代码库中的符号和依赖项。

Dremel 基于 Web 搜索和并行 DBMS 的想法建立。首先,它的架构借鉴了分布式搜索引擎 [11] 中使用的服务树的概念。就像网络搜索请求一样,查询被沿着树下推并在每一步都被重写。查询的结果是通过聚合从树的低层收到的回复来组装的。其次,Dremel 提供了一种高层的、类 SQL 的语言来表达即时查询。与 Pig [18] 和 Hive [16] 等的层次相比,它本地执行查询,而无需将它们转换为 MR 作业。

最后,也是很重要的一点,Dremel 使用列条带存储表示,这使它能够从二级存储读取更少的数据,并由于压缩成本更低而降低了 CPU 成本。列存储已被用于分析关系数据 [1],但据我们所知,尚未扩展到嵌套数据模型。Google 的许多数据处理工具都支持我们提出的列式存储格式,包括 MR、Sawzall [20] 和 FlumeJava [7]。

在本文中,我们做出了以下贡献:

  • 我们为嵌套数据定义了一种新颖的列式存储格式。我们提出了将嵌套记录分解为列并重新组装它们的算法(第 4 节)。
  • 我们概述了 Dremel 的查询语言和执行。两者都旨在对列条带嵌套数据进行有效操作,并且不需要重构嵌套记录(第 5 节)。
  • 我们展示了 Web 搜索系统中使用的执行树如何应用于数据库处理,并解释它们在有效解答聚合查询方面的优势(第 6 节)。
  • 我们展示了在 1000-4000 个节点上运行的系统实例上进行的万亿条记录、多 TB 数据集的实验(第 7 节)。

本文的结构如下。在第 2 节中,我们解释了 Dremel 如何结合其他数据管理工具用于数据分析。第 3 节介绍了它的数据模型。第 4-8 节介绍了上面列出的主要贡献。相关工作在第 9 节讨论。第 10 节是总结。

2. 背景

我们首先通过一个场景来说明交互式查询处理如何适应更广泛的数据管理生态系统。假设 Google 的工程师 Alice 想出了一个从网页中提取新型信号的新想法。她运行了一个 MR 作业,该作业通过输入数据生成一个包含新信号的数据集,存储在分布式文件系统中的数十亿条记录中。为了分析她的实验结果,她启动了 Dremel 并执行了几个交互式命令:

DEFINE TABLE t AS /path/to/data/*
SELECT TOP(signal1, 100), COUNT(*) FROM t

她的命令在几秒钟内执行完成。她运行了一些其他查询,以证明自己她的算法有效。她发现了信号 1 中的不规则性,并通过编写 FlumeJava [7] 程序进行更深入的挖掘,该程序对她的输出数据集执行更复杂的分析计算。一旦问题得到解决,她就会建立一个流水线来连续处理传入的输入数据。她制定了一些预先定制的 SQL 查询,将她的流水线的结果在各个维度上聚合起来,并将它们添加到交互式仪表盘中。最后,她将新数据集注册到目录中,以便其他工程师可以快速定位和查询。

上述场景需要查询处理器和其他数据管理工具之间的相互操作。第一个要素是通用存储层。Google 文件系统(GFS [14])就是公司广泛使用的一种分布式存储层。GFS 使用副本来保留数据,即使硬件出现故障,并在出现落后者的情况下实现快速的响应时间。高性能存储层对于原位数据管理至关重要。它允许在没有耗时的加载阶段情况下访问数据,加载阶段是分析数据处理 [13] 中数据库使用的主要障碍,在 DBMS 能够加载数据并执行单个查询之前分析数据处理通常可能需要运行很多个 MR 分析。作为一个额外的好处,可以使用标准工具方便地操作文件系统中的数据,例如,传输到另一个集群、更改访问权限或根据文件名识别数据子集进行分析。

构建可相互操作的数据管理组件的第二个要素是共享存储格式。事实证明,列式存储对于平面关系数据是成功的,但要使其在 Google 中适用,需要使其适应嵌套数据模型。图 1 说明了主要思想:嵌套字段(例如 A.B.C)的所有值都连续存储。因此,无需读取 A.EA.B.D 等即可检索 A.B.C。我们面临的挑战是如何保留所有结构信息并能够从字段的任意子集重建记录。接下来我们讨论我们的数据模型,然后转向算法和查询处理。

dremel论文图1
图 1:嵌套数据的行表示与列表示

3. 数据模型

在本节中,我们将介绍 Dremel 的数据模型并介绍一些稍后使用的术语。数据模型起源于分布式系统的上下文(这解释了它的名称,“Protocol Buffers”[21]),在 Google 被广泛使用,并作为开源实现提供。数据模型基于强类型嵌套记录。它的抽象语法由下式给出:

T = dom | < A1 : T[*|?],...,An : T[*|?]>|

其中 T 是原子类型或记录类型。dom 中的原子类型包括整数、浮点数、字符串等。记录由一个或多个字段组成。记录中的字段 i 具有名称 Ai 和可选的多重性标签。重复字段 (*) 可能在一条记录中出现多次。它们被解释为值列表,即记录中字段出现的顺序很重要。记录中的可选字段 (?)可能缺失。反之,如果一个字段是必需的,则必须正好出现一次。

为了说明这一点,请参考图 2。它描述了一个模式,该模式定义了一个记录类型 Document,表示一个 Web 文档。模式定义使用 [21] 中的具体语法。一个 Document 有一个必需的整型 DocId 和可选的 Links 字段,其中 Links 包含一个持有其他网页的 DocIds 的 Forward 和 Backward 条目的列表。一个文档可以有多个 Names,其是可以引用该文档的不同 URL。一个 Name 包含一系列 Code 和(可选的)Country 对。图 2 还显示了符合模式的两个示例记录 r1 和 r2。使用缩进来概述记录结构。我们将使用这些示例记录来解释下一节中的算法。模式中定义的字段形成树层次结构。嵌套字段的完整路径使用通常的点符号表示,例如 Name.Language.Code

嵌套数据模型支持平台中立的、可扩展的机制,用于序列化 Google 中的结构化数据。代码生成工具为 C++ 或 Java 等编程语言生成绑定。使用记录的标准二进制在线表示实现跨语言互操作性,其中字段值在记录中出现时按顺序排列。这样,用 Java 编写的 MR 程序可以使用来自通过 C++ 库生成的数据源的记录。因此,如果记录以列式表示存储,那么快速组装它们对于与 MR 和其他数据处理工具的互操作很重要。

dremel论文图2
图 2:两个示例嵌套记录及其模式

4.嵌套列式存储

如图 1 所示,我们的目标是连续存储给定字段的所有值以提高检索效率。在本节中,我们将解决以下挑战:列格式记录结构的无损表示(第 4.1 节)、快速编码(第 4.2 节)和高效的记录组装(第 4.3 节)。

4.1 重复和定义级别

值本身并不能表达记录的结构。给定重复字段的两个值,我们不知道该值在什么“级别”重复(例如,这些值是来自两个不同的记录,还是同一记录中的两个重复值)。同样,如果可选字段缺失了,我们不知道明确定义了哪些封闭记录。因此,我们引入了重复和定义级别的概念,其定义如下。作为参考,请参见图 3,其中总结了我们示例记录中所有原子字段的重复和定义级别。

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值