用户关系表 存储_列式存储系列(一)CStore

作者:辛庸,阿里巴巴计算平台事业部 EMR 技术专家。Apache Hadoop,Apache Spark commiter。对 Hadoop、Spark、Hive、Druid 等大数据组件有深入研究。目前从事大数据云化相关工作,专注于计算引擎、存储结构、数据库事务等内容。


本文是列式存储系列的第一篇。在这个系列中,我们将介绍几个典型的列式存储系统。这些列式系统的出现都有各自的时代背景。在介绍这些系统的同时,我们也尽量介绍一下它们的背景,以便大家有一个更宏观的认识,理解这个系统为什么会出现,它要解决的问题,以及它如何影响后来类似系统的发展。

列式存储不是一个新概念,它最早可以追溯到上个世纪 70 年代。在上个世纪六七十年代,数据库学者们的主题是如何定义一个数据模型,以便更好的存储、管理和使用数据。被提出的数据模型多种多样,其核心就是构造什么样的逻辑关系,设计什么样的存储结构和计算方法,满足人们存储、管理和使用数据的需求。在这种背景下,1970 年就诞生了我们后来熟知的关系型数据模型[1]。关系型数据模型是一种逻辑模型,只关心数据的组织方式,不关心底层的存储,也就是说,它只是定义了一个数据该如何被组织、被表现的接口,至于底层,它是不关心的。由于一个关系被组织成一张表,所以天然的想法就是按照多维数组的方式存储数据,这种存储模型称为 n-array 存储模型(也叫 NSM)。传统的 n-array 模型按照数据写入的方式,将数据一行一行的存储下来,形成一个行优先的表。这种存储模型对数据的插入、删除、更新友好,是 OLTP 工作负载的理想选择。1985 年,Copeland 和 Khoshafian 提出了一种称为 “Decomposition Storage Model” DSM 存储模型[2],在这种模型中,数据以属性(也就是列)的方式进行存储,每一行数据有一个代理主键,每个列存代理主键和该列的值。当用户查询时,系统从最底层的存储层取出相应的列,并通过一定的算法还原出用户想要的 row,并返回给用户。DSM 的数据模型大概是下面这个样子

6f755d877c14291c8540b5ef9a687822.png

DSM 模型的特点是数据按列存储,每列数据定长,易于压缩。由于数据是排序的,因此可以按照列偏移量进行读取。另外,读取时可以只读取涉及到的列,而不涉及的列则不参与计算。这些特点使得 DSM 对分析任务友好。引起了业界的关注,启发并产生了一些基于列式存储的商用分析系统,如 SyBase IQ[7]。不过在 90 年代,数据量还不是很大,所以更多的数据仓库的设计都是基于关系型数据库的,数据库提供商想用一套方案覆盖所有场景,称之为“One Size Fits All”[3]。这种“One Size Fits All”的尝试在 2000 年后变得不再适应时代,因为互联网的爆发使得数据量激增,用户分析数据的时间花费变得非常漫长。在这种背景下,业界不得不探索新的解决方案。现实需要直接结果就是推动了整个分析型时长的繁荣。也就是大约 2005 年以后,我们看到了各种针对大数据量的分析型引擎雨后春笋般出现了(Google 的 Bigtable[6] 论文发表于 2006 年)。

下图是 column store 的一个发展历史[8]。(columns store 是基于列式的数据库系统,和目前流行的 NoSql 概念上还不太一样,注意图中 “Re-birth” 一词的含义)

2696b2d12554bff46fc3c05aa59d1f27.png

C-Store 概述

今天要介绍的第一个列式存储系统为 C-Store。C-Store 不像其他大数据系统那样出名,但在分析型数据库历史中的地位还是非常高的。C-Store 的提出者是 Michael Stonebraker,是数据库领域四位图领奖获得者之一,也是著名的商用分析系统 Vertica、开源数据库 Postgresql 的发明者。Vertica 正式基于 C-Store 的原型开发的,由此也可见 C-Store 的地位。

在 C-Store 的论文中,作者明确了写优化与读优化两种系统的工作场景,并把前者行优先的存储方式称为 row-store,而列的方式称为 column-store(不知道 column store 一词是否由此而来)。作者指出了row-store 类型的系统在进行分析任务时运行低效的问题,并给出了 C-Store 如何解决这些问题的。同时,针对 column-store 不擅长的数据更新,作者也给出了自己的解决方案。这些 argue point 简要列在下面:

  • 需要额外精力处理内存对齐。CPU 运算速率以摩尔定律增长,而相应的主存存取速率却增长有限。一次性的主存访问大约需要几百个 CPU 周期。在这种情况下,数据库实现者需要仔细考虑内存对齐,以避免数据跨越边界,造成处理一次数据需要两次访问内存的情况。C-Store 不存在这个情况,因为列的长度都是固定的,一次可以处理 N 条数据,使得 N 条数据恰好填满一个数据块。

  • 一般的数据块使用 B-tree 进行索引。索引键一般是主键。对于其他列,往往通过创建二次索引来进行快速检索。二次索引在进行点查时需要读取完数据才知道该条数据符不符合要求。因此为了增加查询性能,数据库系统需要引入对读友好的其他存储结构,比如 bit-map 索引,交叉表索引以及物化视图等等。C-Store 的处理方式有些不同。它将一个表的一个到多个列组成一个 projection,多个 projections 的并集为该表,且每个列可能属于多个 projections。Projection 可以按照某个列进行排序,这样一个列可能有多个排序方式。在查询时选择合适的 projection 就能达到一个比较好的效果。

  • C-Store 的 projection 带来了额外的好处。在集群环境下,存储成本很低,数据往往存在多份拷贝。但是没有必要为所有数据进行一模一样的拷贝备份。C-Store 将列分开存储,涉及查询频繁的列可以存放多份拷贝,并且存放在不同的 projection 里,使用不同的 sort order。这样 C-Store 在高性能和 HA 两方面取得了很好的平衡

  • 插入删除更新。虽然数据仓库更多的使用方式是批量的导入,很少的更新,但是更新也是有必要的。而且,发展趋势则是使数据流式地进入系统,甚至在线更新数据仓库中的数据。针对这样的需求,C-Store 设计了一个两层的架构,上层是一个面向写的 Writeable Store(WS),下层有一个面向读的 Read-Optimized Store(RS),中间运行一个 Tuple Mover 不断地将数据从 WS 移至 RS:

a85ffdece0d720532e235b4a73e08fd4.png

在支持事务方面,C-Store 使用基于快照的事务方案,用于避免额外的锁开销。

数据模型

C-Store 的核心是 projection。一个 projection 就是一个或多个列的“部分表”,多个 projections 可以合成一张表,同时,一个表的一个列也可以出现在多个 projection 当中。一个 projection 中也可以包含其他表的列,前提是该 projection 所属(原文称 anchor,即锚表)表含有该其他表列的外键。一个 projection 有一个 sort key,用于确定该 projection 数据的排列方式。下面是一张逻辑表,以及几个可能的 projections:

e438fb5d627dafaedfd08f6312387582.png

其中 projection 括号中竖线后边的键为 sort key。另外,一个 projection 可以被按列拆分成多个分区,称为 segments,存放在不同的节点上。

有了 projections,一个核心问题是如何通过 projections 构建原表(这是所有列式系统共同的问题)。C-Store 的工具有两个:

  • Storage Keys(SK): C-Store 为每个 segment 中的每个列赋予一个 SK,SK 对应原逻辑表中对应列的位置。

  • Join Indices: Join Indices 用于关联不同 projections,下图是一个例子:

39cc767c61168e4d9ae32ab28601f15e.png

可以看到,EMP1 和 EMP3 通过一个 Join Indices 相联系,从而构造出 (Name, Salary, Age) 这个 tuple。值得注意的是,这个 join indices 是单向的。为了构造出整张表,C-Store 需要在多个 projections 的 join indices 中找到一条能够构造出整张表的path(在上面的例子中,至少需要两个合理的 join indices,比如从 EMP3 到 EMP1 再到 EMP2,才能构造出原表)。C-Store 的这套 join indices 也有不足,即维护成本很高。所以作者建议一个列最好保存在多个 projections 中,也就是说,尽量避免一个 projection 仅包含一个列这样琐碎,以减少 join indices 的数量。如果 projection 包含的列很多,存储成本会相应加大,但是性能会提升,反之存储成本下降,性能也下降,这是一个权衡的因素。

WS 和 RS

RS 的主要功能是保存 projections 以及相应的 join indices。为了和 RS 保持一致,减轻 Tuple Mover 的额外开销,WS 中也保存了同样的 projections 和 join indices,只不过,WS 中经过了优化,以适应大量的写:首先 WS 中的 projections 并没有被压缩,其次,WS 中使用 B-tree 而不是直接排序来保证存储的顺序。WS 中的列按照 (v, sk) 的方式进行存储,其中 v 是属性的值,sk 是该列的 storage key,并且按照 B-tree 索引。对于 sort key,(v, sk) 就简化为 (s, sk),其中 s 就是 sort key。在进行基于 sort key 的查询时,首先根据 (s, sk) 找到 sk,然后再根据 sk 和 (v, sk) 获得其他列的值。

WS 和 RS 通过 Tuple Mover 相联系。Tuple Mover 使用一个类似于 LSM 的结构将 WS 中的数据持久化,并发往 RS 进行存储。

事务

C-Store 提供快照隔离的机制包保证事务。具体地说,当记录被插入时,其获得一个时间戳,如果查询某一个快照 S,那么时间戳大于 S 对于时间戳的那些记录将会被忽略。同时,update 操作也不是原地更新,而是被分成了 delete 和 insert 两个动作,delete 的 record 会被记录一个删除标记。这一点和 Hive ACID-2.0 是一样的(但是 C-Store 是 05 年的系统)。与 HIVE ACID-2.0 有点不一样的是,HIVE 使用了WriteId 来跟踪事务的顺序,WriteId 由中心化的 Metastore 产生。WriteId 跟 TransactionId 之间有些关联,当一个 Transaction 完成后,相应的 WriteId 就被持久化到 Metasotre,之后的读就可以读该 WriteId 及之前的记录了。C-Store 则使用类似的概念,称为“水位(Water Mark)”,水位有高水位和低水位,只有那些位于两者之间的记录才能被读取。C-Store 的水位用“时间戳”来标识,但这个时间戳不是真正的时间戳,而叫做 epoch。C-Store 引入了一个中心化的 Time Authority TA 节点,它在启动时将 epoch 设置为 0,此后周期性的将 epoch 加 1,并发送给其他节点。epoch 是时间的最小粒度。epoch 的工作原理如下图所示,当某个 epoch 结束开始一个新的 epoch 时,TA 发送 end of epoch 给各个节点。各个节点等待在此次 epoch 内的事务(包括之前未完成的事务)完成后发送 Epoch complete 到 TA。等 TA 收集到所有节点的 Epoch complete 事件后,TA 将水位更新。

c444d0c299f8f69ad911f54c26a09610.png

对于事务的并发控制,C-Store 采用严格的两阶段封锁协议。在事务的提交方面,它使用省略了 PREPARE 阶段的两阶段提交协议来实现。

性能

C-Store 论文里给了它与传统数据库以及和其他 Columns based 的数据库的性能对比,第一个表格为数据体积,第二个表格为 TPC-H 中 7 个query 的性能

ea6b080ebb7b71e5ea895b4425ddf9c3.png

C-Store 论文里特别提到了它对于数据无解压处理的能力,并称这是其性能优异的一个很重要的因素。

总结

本文介绍了 C-Store 系统,它提出了一种混合架构,上层提供了面向写的 Write store,下层是面向读的 Read store。其核心设计点为 projections,一种基于列的存储结构。C-Store 面向列的设计使得其对于分析有着优秀的性能表现。此外,C-Store 还提供了基于快照隔离的事务功能。

参考文献

[1] E. F. CODD. A Relational Model of Data for Large Shared Data Banks
[2] George P. Copeland, Setrag N. Khoshafian. A decomposition storage model
[3] Michael Stonebraker, Ugur Cetintemel. "One Size Fits All": An Idea Whose Time Has Come and Gone
[4] Clark D. French. One Size Fits All Database Architectures Do Not Work for DSS
[5] Mike Stonebraker, et,al. C-store: a column-oriented DBMS
[6] Fay Chang, Jeffrey Dean, et,al. Bigtable: A Distributed Storage System for Structured Data
[7] http://www.sybase.com/products/databaseservers/sybaseiq
[8] Column_Store_Tutorial_VLDB09()

声明

限于本人水平,文中内容仅供参考。更加详情请阅读原论文。同时欢迎读者批评指正,共同探讨。

443dd5f61846460ce7d60706407a3616.png

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

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

相关文章

装修月记第一弹,硬装篇

硬装完成进入配饰阶段,特此记录。 房屋位置: 首先是入户这个地方,由于没有设计生活阳台(靠,有入户没生活阳台,有生活阳台没入户,真是很FT,FT的蓝光)所以热水器和气表放在…

FileUpload之单个文件上传

拖一个FileUpload控件,设计如图: 查看源&#xff1a; <body> <form id"form1" runat"server"> <div> <asp:FileUpload ID"UploadFile" runat"server" /> <br /> <asp:Bu…

excel可以处理html吗,处理包含XML/HTML元素的Excel文件

在Excel文件中包含大量HTML元素时&#xff0c;会带来以下问题&#xff1a;1.字数分析不准确&#xff1b;2.HTML元素和内容混杂在一起&#xff0c;翻译员需要处理这些元素&#xff0c;在处理过程中&#xff0c;可能会更改、丢失HTML元素&#xff0c;这可能会给客户造成影响&…

spring 动态代理_分析动态代理给 Spring 事务埋下的坑

前言Spring的声明式事务让我们不在编写获得连接、关闭连接、开启事务、提交事务、回滚事务等代码&#xff0c;通过一个简单的Transactional注解&#xff0c;就让我们轻松进行事务处理。我们知道Spring事务基于AOP&#xff0c;采用动态代理实现&#xff0c;虽然使用简单&#xf…

计算机的网络功能不包括下面项,计算机网络中,防火墙的功能不包括

摘要&#xff1a;害的通意在城展预中健康教育外伤防交市开&#xff0c;计算机网行A人员、管政策驾驶影响因素安全不系理与带的分析是进。人E人核好年儿年D骨结童B、防火婴幼儿青少青壮、老、成发于。菌血以下清学对真的认试验识&#xff0c;不包新型检测菌、结合菌B、检隐球不能…

sql server 千万级大数据sql更新_医疗SQL每日实例6数据更新大法

Update Day数据更新大法生/命/不/止/SQL/不/休01更新数据的铁规所有数据在被更新之前&#xff0c;必须先查询出数据结果&#xff0c;确认无误&#xff0c;再复制整行到下两行。将select * 更改为upate ,然后选择整个UPDATE 语句后&#xff0c;再执行命令。否则一旦出问题&#…

react中引入html文件,在react中怎么引用js

在react中怎么引用js推荐两种引入的方法&#xff0c;当然也可以自己编写一个JS类(ES6语法)实现动态插入JS到页面&#xff0c;然后在React项目引入。第一种&#xff1a;使用插件 react-load-script如果没有安装可以使用 yarn add react-load-script 或者 npm install react-load…

计算机无法访问桌面,桌面无法显示_电脑桌面显示:无法访问,你可能没有权限使用网络......

电脑桌面图标不能显示是什么原因&#xff1f;电脑桌面图片不显示有以下几种原因:一、在桌面点击右键&#xff0c;然后选择查看&#xff0c;显示桌面图标按钮。勾选按钮后桌面突变便可以显示出来。如果是开机不能操作是死机了&#xff0c;重启一下电脑试试&#xff0c;还是不行开…

信息系统项目管理师论文_「高项论文」谨防信息系统项目管理师论文12个写作丢分点...

2020年上半年信息系统项目管理师论文怎么写才能得高分&#xff1f;有些时候洋洋洒洒写下一大篇&#xff0c;自我感觉良好&#xff0c;结果分数不如意。这可能是你触到了丢分点而不自知。慧翔天地给你提供信息系统项目管理师12个论文写作丢分点以及对应解决方法&#xff0c;供你…

武汉科技大学计算机生命与科学周海,湖北双胞胎周海周洋:为了母亲,一个放弃清华,一人放弃中科院...

“你要相信命运给你一个比常人较低的出发点&#xff0c;是希望你用一生去奋斗出一个柳暗花明的故事”。人的命运就是这样&#xff0c;从来没有真正“完美”的样子&#xff0c;奋斗和努力是改变命运的最重要力量。高考对于贫困山区或农村的孩子来说&#xff1a;这就是命运转折点…

循环左移和循环右移指令_运用 移位、循环移位指令 实现流水灯

具体要求用 I0.0 控制接在 QB0 上的8个彩灯是否移位&#xff0c;每 2s 左移 1 位。用 I0.1 控制左移&#xff0c;I0.2控制右移&#xff0c;首次扫描时将彩灯的初始值设置为 16#1 &#xff0c;设计出梯形图程序。先来讲解一下&#xff0c;移位指令和循环移位指令。移位指令这里的…

当前计算机无法连接,win7系统无法连接wifi提示此计算机当前已将连接限制为xxx的解决方法...

许多win7系统用户在工作中经常会遇到win7系统无法连接wifi提示此计算机当前已将连接限制为xxx的情况&#xff0c;比如近日有用户到本站反映说win7系统无法连接wifi提示此计算机当前已将连接限制为xxx的问题&#xff0c;但是却不知道要怎么解决win7系统无法连接wifi提示此计算机…

js能订阅mq吗_测试工程师,必须了解的MQ知识!

什么是消息中间件&#xff1f;通过提供某种规范实现在不同系统之间传递语义准确的消息。专注于数据的发送和接收&#xff0c;利用高效可靠的异步消息传递机制的集成分布式系统。什么是MQ?MQ全称为Message Queue, 消息队列(MQ)是应用程序“对”应用程序的通信方法&#xff0c;也…

98k计算机版教程,绝地求生正式版八倍镜98k瞄准教程 新版98K怎么用?

《绝地求生大逃杀》正式版已经更新&#xff0c;新版本中官方对原有的四倍镜和八倍镜进行了不小的改动。正式版98K怎么用&#xff1f;接下来就为大家带来新版八倍镜98k瞄准教程&#xff0c;感兴趣的玩家一起来看看吧&#xff01;教程&#xff1a;新版本的八倍镜更新了新的瞄准样…

csv中包含多余换行符_Python3爬虫之猫眼电影TOP100(requests、lxml、Xpath、CSV)

点击关注&#xff0c;我们共同每天进步一点点&#xff01;【1x00】循环爬取网页模块观察猫眼电影TOP100榜&#xff0c;请求地址为&#xff1a;https://maoyan.com/board/4每页展示10条电影信息&#xff0c;翻页观察 url 变化&#xff1a;第一页&#xff1a;https://maoyan.com/…

创新品类,N次方的市场爆炸力

一、品类的诱惑力 可乐&#xff1a;一种碳酸饮料&#xff1b;营养快线&#xff1a;一种牛奶果汁&#xff1b;饮养高层&#xff1a;一种高端饮养品&#xff1b;防电墙热水器&#xff1a;一种有安全装置的电热水器&#xff1b;香飘飘&#xff1a;一种可以即冲泡饮的杯装奶茶……这…

计蒜客可以做计算机编程吗,如果你的编程能力不足以支撑你成为工程师的野心,不妨到计蒜客上学学看...

在人才招聘领域存在这样一个怪圈&#xff0c;高校每年都说是最难就业年、人才过剩&#xff0c;而对于企业HR来说永远都招不到称心如意的人才。这个怪圈在“计蒜客”创始人俞昊然看来&#xff0c;主要是因为当今高校的教学资源太过陈旧&#xff0c;没有跟上业内发展的需求&#…

百善计算机学习,党建引领学做合一,志愿服务助力乡村振兴——计算机工程学院开展“百善孝为先”主题宣传文化墙墙绘涂鸦活动...

为充分发挥党员的先锋模范作用和当代大学生学做合一的品质&#xff0c;用实际行动助力乡村振兴&#xff0c;2019年5月18日&#xff0c;计算机工程学院党员服务站组织学生党员及第57期党校积极分子赴郫都区郫筒街道长乐村开展“百善孝为先”主题宣传文化墙墙绘涂鸦活动,为乡村振…

计算机里的东西不小心删除如何恢复,原先在电脑界面上的文件不小心删除了怎么恢复,谢谢了...

那就得看看删除的方式是哪种的了&#xff0c;如果是普通删除的文件&#xff0c;可以打开回收站查看是否有想文件的存在&#xff0c;如果有的话进行还原的操作&#xff0c;如果未发现的话&#xff0c;可以参考下述的恢复教程进行文件的恢复工作&#xff1a;步骤一&#xff1a;到…

我的处女作《设计模式之禅》——前言

终于可以写前言了&#xff0c;这说明本书已经基本完成&#xff0c;可以长嘘一口气了。 为什么写这本书 为什么写这本书&#xff1f;今年5月份&#xff0c;我在JavaEye上发了一个帖子&#xff0c;其中提到自己已经工作9年了&#xff0c;总觉得这9年不应该就这么荒废了&#xff0…