F1 Query: Declarative Querying at Scale

距离 Google 的上一篇 F1 论文,也就是 F1: A Distributed SQL Database That Scales 已经 5 年过去了,Google 在今年的 VLDB 上终于发布了 F1 的新版本 F1 Query: Declarative Querying at Scale,我们今天就来看一下这篇论文。

2013 年的 F1 是基于 Spanner,主要提供 OLTP 服务,而新的 F1 则定位则是大一统:旨在处理 OLTP/OLAP/ETL 等多种不同的 workload。但是这篇新的 F1 论文对 OLTP 的讨论则是少之又少,据八卦是 Spanner 开始原生支持之前 F1 的部分功能,导致 F1 对 OLTP 的领地被吞并了。下面看一下论文的具体内容,疏漏之处欢迎指正。

0. 摘要

F1 Query 是一个大一统的 SQL 查询处理平台,可以处理存储在 Google 内部不同存储介质(Bigtable, Spanner, Google Spreadsheet)上面的不同格式文件。简单来说,F1 Query 可以同时支持如下功能:OLTP 查询,低延迟 OLAP 查询,ETL 工作流。F1 Query 的特性包括:

  • 为不同数据源的数据提供统一视图
  • 利用数据中心的资源提供高吞吐和低延迟的查询
  • High Scalability
  • Extensibility

1. 背景

在 Google 内部的数据处理和分析的 use case 非常复杂,对很多方面都有不同的要求,比如数据大小、延迟、数据源以及业务逻辑支持。结果导致了许多数据处理系统都只 focus 在一个点上,比如事务式查询、OLAP 查询、ETL 工作流。这些不同的系统往往具有不同的特性,不管是使用还是开发上都会有极大的不便利。

F1 Query 就在这个背景下诞生了,用论文中的话说就是

we present F1 Query, an SQL query engine that is unique not because of its focus on doing one thing well, but instead because it aims to cover all corners of the requirements space for enterprise data processing and analysis.

F1 Query 旨在覆盖数据处理和分析的所有方面。F1 Query 在内部已经应用到了多个产品线,比如 Advertising, Shopping, Analytics 和 Payment。

在 F1 Query 的系统设计过程中,下面几点考量具有非常关键的作用。

  • Data Fragmentation: Google 内部的数据由于本身的特性不同,会被存储到不同的存储系统中。这样会导致一个应用程序依赖的数据可能横跨多个数据存储系统中,甚至以不同的文件格式。对于这个问题,F1 Query 对于这些数据提供一个统一的数据视图。
  • Datacenter Architecture: F1 Query 的目标是多数据中心,这个和传统的 shared nothing 架构的数据处理系统不同相同。传统的模式为了降低延迟,往往需要考虑 locality,也就是数据和计算越近越好。由于 Google 内部的网络环境优势,locality 的优势显得不是那么重要。所以 F1 Query 更强调计算和存储分离,这样计算节点和存储节点的扩展性(scalability)都会更好。毕竟 Google 内部的系统,scalability 才是第一法则。还有一点值得一提的是,由于使用了 GFS 的更强版本: Colossue File System,磁盘不会成为瓶颈。
  • Scalability: 在 F1 Query 中,short query 会在单个节点上执行,larger query 会以分布式的模式执行,largest query 以批处理 MapReduce 模式执行。对于这些模式,F1 Query 可以通过增加运算的并行度来优化。
  • Extensibility: 对于那些无法用 SQL 语义来表达的查询需求,F1 通过提供 user-defined functions (UDF)、user-defined aggregate functions (UDAs) 和 table-valued functions (TVF) 来支持。

2. 架构

F1 的架构图如下所示:

下面的方框里面是每个 Datacenter 一套。关于各个组件的介绍如下:

  • 用户通过 client libary 和 F1 Server 交互
  • F1 Master 负责 query 的状态的运行时监控和其他组件的管理
  • F1 Server 收到用户请求,对于 short query 直接单机执行查询;对于 larger query 转发到多台 worker 上并行执行查询。最后再汇总结果返回给 client。
  • F1 Worker 负责具体查询执行
  • F1 Server 和 Worker 都是无状态的,方便扩展

2.1 query 执行

用户通过 client libary 提交 query 到 F1 Server 上,F1 Server 首先解析和分析 SQL,然后将涉及到的数据源提取出来,如果某些数据源在当前 datacenter 不存在,则直接将 query 返回给 client 并告知哪些 F1 Server 距离哪些数据源更近。这里直接将请求返回给业务层,由业务层去 retry,设计的也是非常的简单。尽管前面说到要将存储和计算分离,但是这个地方的设计还是考虑到了 locality,datacenter 级别的 locality,毕竟 locality 对查询延迟的影响还是巨大的。

F1 Server 将 query 解析并优化成 DAG,然后由执行层来执行,具体执行模式(interactive 还是 batch)由用户指定。原文是: Based on a client- specified execution mode preference, F1 Query executes queries on F1 servers and workers in an interactive mode or in a batch mode.

对于交互式查询模式(interactive mode)有单节点集中执行模式和多节点分布式执行模式,query 优化会根据启发式的算法来决定采用哪种模式。集中式下,F1 Server 解析分析 query,然后在当前节点上直接执行并接收查询结果。分布式下,接收 query 的 F1 Server 充当一个 query coordinator 的角色,将 query 拆解并下发给 worker。交互式查询在数据量不太大的情况下往往具有不错的性能和高效的资源利用率。

除了交互式查询还有一种模式是批处理模式(batch mode)。批处理模式使用 MapReduce 框架异步提交执行执行,相比交互式这种 long-running 方式,批处理模式的可靠性(reliabitly)更高。

2.2 数据源

数据查询支持跨 datacenter。存储计算分离模式使得多数据源的支持更加简单,比如 Spanner, Bigtable, CSV, columnar file 等。为了支持多数据源,F1 Query 在他们之上抽象出了一层,让数据看起来都是存储在关系型表里面。而各个数据源的元数据就存储在 catalog service 里面。

对于没有存储到 catalog service 里面的表数据,只要提供一个DEFINE TABLE即可查询。

DEFINE TABLE People(format = ‘csv’,path = ‘/path/to/peoplefile’,columns = ‘name:STRING,DateOfBirth:DATE’);SELECT Name, DateOfBirth FROM PeopleWHERE Name = ‘John Doe’;

论文中没有提到的是单看这个 DEFINE TABLE 可以表现力不够,所说这些信息并不足以表现出数据的行为:

  • 是否支持 partition?
  • 是否支持 逻辑下推?
  • 是否支持索引?
  • 是否支持多种 扫描模式?
  • 对于新数据源的支持可以通过 Table-Valued Function (TVF) 的方式来支持。

2.3 Data Sink

query 的结果可以直接返回给 client,也可以插入到另外一个表里面。

2.4 SQL

SQL 2011。之所以是 2011 是因为其他老的系统使用的是 2011。

3. 交互式查询

交互式查询模式是默认的查询模式。如前所述,交互式查询有集中式和分布式,具体使用哪种由优化器分析 client 的 query 然后决定。

3.1 Single Threaded Execution Kernel

集中式的查询如下图所示,是一种 pull-based 的单线程执行方式。

3.2 Distributed Execution

如前所述,由优化器分析完 query 决定是否采用分布式模式。在分布式这种模式下接收到 query 的 F1 Server 充当一个 coordinator 的角色,将执行 plan 推给 worker。worker 是多线程的,可以并发执行单个 query 的无依赖的 fragment。Fragment 是执行计划切分出来的执行计划片段,非常像 MR 或者 Spark 中的 stage。Fragment 之间通过 Exchange Operator (数据重分布) 连接。

Fragment 的切分过程如下:优化器使用一种基于数据分布依赖的 bottom-up 策略。具体来说每个算子对于输入数据的分布都有要求,比如 hash 或者依赖其他字段的分布。典型的例子有 group by key 和 hash join。如果当前的数据分布满足前后两个算子的要求,则两个算子就被放到一个 Fragment 里面,否则就被分到两个 Fragment 里面,然后通过 Exchange Operator 来连接。

下一步就是计算每个 Fragment 的并行度,Fragment 之间并行度互相独立。叶子节点的 Fragment 的底层 table scan 决定最初的并行度,然后上层通过 width calculator 逐步计算。比如 hash-join 的底层两个 Fragment 分别是 100-worker 和 50-worker,则 hash-join 这个 Fragment 会使用 100-worker 的并行度。下面是一个具体的例子。

SELECT Clicks.Region, COUNT(*) ClickCountFROM Ads JOIN Clicks USING (AdId)WHERE Ads.StartDate > ‘2018-05-14’ ANDClicks.OS = ‘Chrome OS’GROUP BY Clicks.RegionORDER BY ClickCount DESC;

上面 SQL 对应的 Fragment 和一种可能 worker 并行度如下图所示:

3.3 Partitioning Strategy

数据重分布也就是 Fragment 之间的 Exchange Operator,对于每条数据,数据发送者通过分区函数来计算数据的目的分区数,每个分区数对应一个 worker。Exchange Operator 通过 RPC 调用,扩展可以支持到每个 Fragment 千级的 partion 并发。要求再高就需要使用 batch mode。

查询优化器将 scan 操作作为执行计划的叶子节点和 N 个 worker 节点并发。为了并发执行 scan 操作,数据必须要被并发分布,然后由所有 worker 一起产生输出结果。有时候数据的 partition 会超过 N,而 scan 并发度为 N,多余的 partition 就交由空闲的 worker 去处理,这样可以避免数据倾斜。

3.4 Performance Considerations

F1 Query 的主要性能问题在于数据倾斜和访问模式不佳。Hash join 对于 hot key 尤为敏感。当 hot key 被 worker 载入到内存的时候可能会因为数据量太大而写入磁盘,从而导致性能下降。

论文中举了一个 lookup join 的例子,这里不打算详述了。

对于这种数据倾斜的问题,F1 Query 的解决方案是 Dynamic Key Range,但是论文中对其描述还是不够详细。

F1 Query 对于交互式查询采用存内存计算,而且没有 check point。因为是内存计算,所以速度非常的快,但是由于没有 checkpoint 等 failover 的机制,只能依赖于业务层的重试。

4. 批处理

像 ETL,都是通过 Batch Mode 来处理的。Google 以前都是通过 MapReduce 或者 FlumeJava 来开发的,开发成本一般比较高。相比 SQL 这种方式,不能有效复用 SQL 优化,所以 F1 Query 选择使用 SQL 来做。

如前所述,交互式查询不适合处理 worker failure,而 batch mode,也就是批处理这种模式特别适合处理 failover(每一个 stage 结果落盘)。批处理模式复用交互式 SQL query 的一些特性,比如 query 优化,执行计划生成。交互式模式和批处理模式的核心区别在于调度方式不同:交互式模式是同步的,而批处理模式是异步的。

4.1 Batch Execution Framework

批处理使用的框架是 MapReduce,Fragment 被抽象成 MapReduce 中的 stage,stage 的输出结果被存储到 Colossus file system (GFS 二代)。

在 Fragment 映射有一点值得注意的是严格来说,Fragment 的 DAG 映射到 mr 是 map-reduce-reduce,对这种模式做一个简单的变通变成:map-reduce-map<identity>-reduce,如下图:

关于 MapReduce 的更详细信息可以参考 Google 03 年那篇论文。

4.2 Batch Service Framework

Framework 会对 batch mode query 的执行进行编排。具体包括:query 注册,query 分发,调度已经监控 mr 作业的执行。当 F1 Server 接收到一个 batch mode query,它会先生成执行计划并将 query 注册到 Query Registry,全局唯一的 Spanner db,用来 track batch mode query。Query Distributor 然后将 query 分发给 datacenter。Query Scheduler 会定期从 Registry 拿到 query,然后生成执行计划并交给 Query Executor 来处理。

Service Framework 的健壮性非常好:Query Distributor 是选主(master-elect)模式;Query Scheduler 在每个 datacenter 有多个。query 的所有执行状态都是保存在 Query Registry,这就保证其他的组件是无状态的。容错处理:MapReduce 的 stage 会被重试,如果 datacenter 出问题,query 会被分配到新的 datacenter 上重新执行。

5. 优化器

SQL 优化器类似 Spark Catalyst,架构如下图,不细说了。

6. EXTENSIBILITY

对于很多复杂业务逻辑无法用 SQL 来描述,F1 针对这种情况提供了一种用户自定义函数的方法,包括 UDF (user-define functions),UDA (aggrega- tion functions) 和 TVF (table-valued functions)。对于简单的UDF需求,通常直接以SQL或者LUA的形式作为query的一部分;对于更复杂或者性能要求高的UDF需求,则可以用其它高级语言以UDF Server的形式实现。

UDF Server 和 F1 Query 是 RPC 调用关系,有 client 单独部署在同一个 datacenter。udf server 完全有 client 来控制,无状态,基本可以无限扩展。

6.1 Scalar Functions

UDF 并不是新的概念,UDF Server 这种部署方式看上去还算新颖一点。但是 UDF Server 这种单独部署模式一个可能的问题是延迟问题,这里通过批量流水线的方式来减少延迟。下面是 UDF 的一个例子。

local function string2unixtime(value)local y,m,d = match("(%d+)%-(%d+)%-(%d+)")return os.time({year=y, month=m, day=d})
end

6.2 Aggregate Functions

UDA 是对多行输入产生一个单一的输出,要实现 UDA,用户需要实现算子 Initialize, Accumulate, and Finalize。另外如要要对多个 UDA 的子聚合结果进行再聚合,用户可以实现 Reaccumulate。

6.3 Table-Valued Functions

TVF 的输入是一个 table,输出是另外一个 table。这种在机器学习的模型训练场景下比较有用。下面是论文中的具体的一个例子:EventsFromPastDays 就是一个 TVF。

SELECT * FROM EventsFromPastDays(3, TABLE Clicks);

当然 TVF 也支持用 SQL 来描述,如下。

CREATE TABLE FUNCTION EventsFromPastDays(num_days INT64, events ANY TABLE) ASSELECT * FROM eventsWHERE date >= DATE_SUB(CURRENT_DATE(),INTERVAL num_days DAY);

7. Production Metric

下面是 F1 Query 在 Production 环境下的几个 metrics。

8. 总结

回过头来看 F1 Query 最新的这篇论文给人最大的启发就是大一统的思想,这个很有可能是行业发展趋势。回想一下 MapReduce 论文由 Google 于 2003 年发表,开源实现 Hadoop 于 2005 问世。不妨期待了一下未来的 3 到 5 年的 F1 Query 的开源产品。


原文链接
本文为阿里云原创内容,未经允许不得转载。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/516949.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

openoffice 安装windows 环境

文章目录一、安装配置启动1. 下载软件2. 安装3. 启动一、安装配置启动 1. 下载软件 https://www.openoffice.org/download/ 4.1.11版本 下载链接 2. 安装 一路下一步安装即可 安装完毕后&#xff0c;在桌面上会有一个openoffice图标 3. 启动 soffice -headless -accept“…

在线看大会!就来云栖号!

背景 抗击2019新型冠状病毒&#xff08;2019-nCoV冠状病毒&#xff09;成了全国人民的头等大事。截至2020年2月7日&#xff0c;中国确诊新型冠状病毒感染者逾3万人。为抗击预防新型冠状病毒&#xff0c;武汉采取封城措施&#xff0c;钟南山院士提倡全家在家不出门隔断病源&…

我为什么放弃Java,却选择Python?

不可否认的是&#xff0c;Python 凭借超广泛的应用方向&#xff0c;已成为了最受欢迎的编程语言。不过&#xff0c;真正让我喜欢上 Python 的原因&#xff0c;是我发现做同样功能的代码&#xff0c;从 Java 换成 Python 以后&#xff0c;代码量直接从 2000 行减少到 200 行。甚…

三大场景,对象存储OSS带你快速上云

本文介绍对象存储OSS的主要应用场景。 图片和音视频等应用的海量存储 OSS可用于图片、音视频、日志等海量文件的存储。各种终端设备、Web网站程序、移动应用可以直接向OSS写入或读取数据。OSS支持流式写入和文件写入两种方式。 网页或者移动应用的静态和动态资源分离 利用海…

word、excel、ppt 办公文件 在线预览

如果想要免费的&#xff0c;可以用 openoffice&#xff0c;实现原理就是&#xff1a; 通过第三方工具openoffice&#xff0c;将word、excel、ppt、txt等文件转换为pdf文件流&#xff1b;当然如果装了Adobe Reader XI&#xff0c;那把pdf直接拖到浏览器页面就可以直接打开预览&a…

生成PDF乱码问题

文章目录1. 准备字体2. 安装字体3. 重启服务器1. 准备字体 将Windows下的Fonts&#xff0c;如&#xff1a;C:\Windows\Fonts&#xff0c;压缩成Fonts.zip压缩包 2. 安装字体 将压缩包拷贝到Linux目录下&#xff0c;执行如下命令即可&#xff1a; unzip Fonts.zip mkdir /u…

30 年开源老兵,10 年躬耕 OpenStack,开源 1000 万行核心代码

受访者 | Jonathan Bryce记者 | 伍杏玲出品 | CSDN&#xff08;ID&#xff1a;CSDNnews&#xff09;万物互联时代下&#xff0c;我们的一切都在依赖计算基础设施&#xff0c;科学、金融、政府、教育、通信和医疗保健依赖现代云基础设施来运行和改进。而开源是让全世界大多数人获…

力展物流公司上云 低成本、实例资源使用效率提升

公司介绍 我们公司是成都力展供应链管理有限公司&#xff0c;于2019年4月注册&#xff0c;注册资金1000万&#xff0c;并于2019年6月投资了四川力展物流有限责任公司和成都力展鸿翔物流有限公司&#xff0c;分别入股900W和400W。业务痛点 我们公司成立不久&#xff0c;但动作频…

OpenOffice+JodConverter实现Office文件到PDF的转换

文章目录1. OpenOffice 下载、安装、启动2. JodConverter下载3. 文件转化4. 中文乱码5. 解决中文乱码1. OpenOffice 下载、安装、启动 openoffice 安装 linux环境 2. JodConverter下载 JodConverter是一款利用OpenOffice进行转化的工具&#xff0c;可以在Office文件和OpenOff…

OpenInfra Days China 2020大会议程已上线!

距离OpenInfra Days China 2020线上活动开幕还有不到半个月的时间&#xff0c;议题征集与筛选工作已于七月底正式结束&#xff0c;目前大会议程已正式公布&#xff01; 本次OpenInfra Days China主题演讲由OpenStack基金会执行董事Jonathan Bryce&#xff0c;中国电子技术标准化…

阿里云高校“在家实践”计划,免费提供2.68亿小时算力!

计划简介 新冠肺炎疫情防控阻击战持续推进&#xff0c;为全力配合教育部延期开学&#xff0c;高校在线上课共同抗击疫情&#xff0c;阿里云弹性计算联合开发者社区紧急上线高校师生“在家实践”计划&#xff0c;向全国高校学生、教师免费提供2.68亿小时云服务器ECS算力&#xf…

启迪公交上云助力北京公交二维码乘车业务系统顺利上线

公司介绍 我们公司是国内领先的公交出行服务提供商&#xff0c;通过承接公交信息化和智慧化项目建设&#xff0c;应用最先进的互联网商业模式&#xff0c;将“人、车、线、站”的大数据资源及相关配套资源进行商业化转换&#xff0c;实现行业引领&#xff0c;提升公交系统的创新…

MVC与MVVM的区别

MVC与MVVM MVC是Model-View- Controller的简写&#xff1a;模型(model) 视图(view) 控制器(controller) ​ Model&#xff08;模型&#xff09;&#xff1a;是应用程序中用于处理应用程序数据逻辑的部分。 ​ View&#xff08;视图&#xff09;&#xff1a;是应用程序中处理…

项目 接入 在线预览

文章目录1. 项目链接2. 克隆项目3. 接入规范4. 项目接入测试5. 参考案例1. 项目链接 https://gitee.com/kekingcn/file-online-preview 2. 克隆项目 git clone gitgitee.com:kekingcn/file-online-preview.git3. 接入规范 # 如果你的项目需要接入文件预览项目&#xff0c;…

阿里技术文档:Redis+Nginx+Spring全家桶+Dubbo精选

最近花了很长的时间去搜罗整理Java核心技术好文&#xff0c;我把每个Java核心技术的优选文章都整理成了一个又一个的文档。今天就把这些东西分享给老铁们&#xff0c;也能为老铁们省去不少麻烦&#xff0c;想学什么技能了&#xff0c;遇到哪方面的问题了 直接打开文档学一学就好…

入门云监控部署业务

云监控概览为您提供了云服务资源使用概览、报警概览、重要事件概览和资源使用情况概览。 您可以实时了解各云服务的资源保有、使用水位和报警情况。 云服务概览 云服务概览提供主机&#xff08;包括云服务器 ECS 和安装云监控插件的非ECS 机器&#xff09;、负载均衡、弹性公…

游戏行业应该如何建设数据中台?

责编 | 晋兆雨来源 |智领云科技封图 | CSDN 下载自视觉中国随着网络世界的迅猛发展&#xff0c;“游戏”进入了前所未有的蓬勃发展期。根据Newzoo数据显示&#xff0c;2019年全球游戏市场规模约为1521亿美元&#xff0c;2015-2019年复合增长率达到13.4%&#xff0c;预计2020年全…

中台架构详解(上) | 大咖说中台

作者 | 耿立超责编 | 晋兆雨来源 | 《大数据平台架构与原型实现&#xff1a;数据中台建设实战》中台打破了应用系统的壁垒&#xff0c;从企业全局梳理和规划业务程&#xff0c;重构了组织架构、业务架构与IT 架构。 在梳理了企业的IT 现状并回顾了SOA 的历史之后&#xff0c;我…

入门云虚拟主机,为你的业务快速实现数据备份和数据恢复

备份方式 虚拟主机的备份分手工备份与自动备份两种。备份存储到单独系统提供的存储空间&#xff0c;不占用虚拟主机的网页空间和数据库空间。 手工备份 手工备份是指用户在控制台主动发起的备份操作&#xff0c;备份完毕后可随时下载和恢复。除非备份被主动删除&#xff0c;…

Web 前端自学很苦?来,手把手教你,拿下前端!

今年受经济下行与疫情叠加的影响&#xff0c;毕业生有800多万&#xff0c;就业形势十分严峻&#xff0c;但即便如此&#xff0c;Web前端人才在软件开发行业的就业市场中依旧供小于求&#xff0c;目前&#xff0c;全国总缺口每年大约为近百万人。行业对前端需求量持续增加&#…