分析型数据仓库中读写分离的实现

数据仓库和传统的事务型数据库相比,一个很大的特点就是主要面向批量写和查询进行优化,可以不支持更新、事务这些高级特性。一些商用的数据仓库分析系统,例如Vertica,已经可以做到千亿级数据的秒级导入和秒级查询。本文主要探讨如何利用现有的开源组件实现分析型数据仓库当中的读写分离。

为什么要进行读写分离?

分析性数据仓库一般有下面几个特点:

  1. 面临着复杂的多维分析需求,需要能够进行任意维度的上卷下钻。
  2. 存储的数据维度一般比较多,所以是宽表,而且一般比较稀疏。
  3. 数据量比较大,一次写入,多次查询。

针对这样一些特点,分析性数据库一般选择列存储数据格式,例如Parquet等。优点是对于统计分析效率很高,而且对于稀疏的宽表具有很高的存储压缩比。所以我们可以认为列存储格式是一种面向读进行优化的存储格式,我们称为Read Optimized Store(ROS)。但是列存储格式还有一些缺点,这种格式的数据一旦生成,就很难进行修改,也很难往已有的数据文件当中插入新数据,只能增加新的数据文件。所以我们自然而然的想到,像Mysql这种传统的数据库当中使用的行存储文件格式是一种适合修改和插入的存储格式,我们可以认为这种行存储格式是面向写进行优化的存储格式,我们称为Write Optimized Store(WOS)。
综上所诉,要实现一个可以秒级导入、秒级查询的分析型数据库,如果我们只选用ROS,则很难支持大数据量的秒级导入。如果我们只选用WOS,则很难实现任意维度的秒级查询。所以我们需要进行读写分离。

读写分离的实现原理

数据仓库当中需要同时存在WOS和ROS,这样对于所有的写操作我们都是生成WOS型文件;同时对于所有的读操作,我们主要依赖于ROS文件,但也要查询少量的WOS文件。整体的示意图如下:


读写分离的原理图

如图所示,WOS文件需要定期的转换为ROS文件,同时因为ROS在数据仓库当中一般是分为多个partition存在,所以一个WOS可能需要转化为多个ROS。同时转化的过程需要是一个原子操作,因为对上层查询引擎来说,在同一时刻,同样的数据必须只能有一份。

开源方案的选择

上面简单介绍了读写分离方案的原理,在具体的工程实践过程中我们还面临着很多方案的选择和实践难点。下面简单说一下我们的实践选择和碰到的技术难点,以后有时间在单独写一篇介绍实现方案。ROS的选择比较简单,我们已经选择了Parquet + Impala的查询方案,同时结合我们的业务特点做了很多代码级别的优化。WOS的选择可能会比较多,例如我们可以选择常用的HDFS行存储文件格式,例如TextFile、SequenceFile、Avro等。以SequenceFile为例,我们在定义自己的Impala表的时候,可以指定一个特殊的partition指定文件存储格式为SequenceFile,同时其它的partition作为正常的按照日期partition的数据指定格式为Parquet。这种方式会简单一些,因为我们始终只有一个表。但是基于一些查询效率和以后的架构升级方面的考虑,我们最终选择了Kudu作为我们的WOS。架构实现示意图如下:

读写分离的实现图

如图所示,我们会建立三张物理表,其中两张Kudu表作为WOS。一张Paquet表作为ROS。所有的写操作都会写入到Ingesting状态的Kudu表中,当Ingesting表写到一定的大小之后,会自动转换为Staging状态。这时我们一方面生成一张新的Kudu表作为Ingesting表,另一方面会开始WOS到ROS的转换。我们有一个叫做Mover的task来执行这个操作,将Staging状态的Kudu表中的数据全部转换到对应partition的Parquet表当中。Staging状态的表转换完成且Ingesting状态的表写满时,会触发一个切表操作,需要更新元数据,告诉Impala使用新的数据进行查询,整个切表的操作是原子的。而且已经转化的Staging表还需要保留一段时间,避免切表之前发起的查询操作没有及时执行完成。对于查询请求来说我们会建立一个包含Staging表、Ingesting表和ROS表的虚拟表,即一个View。用户的查询始终查询始终指向的是一个View,但是下面的物理表会经常发生变化。这样就做到了既能查询到最新的数据,又能够对查询性能进行很好的优化。

在实现的过程中还有很多具体的工作,如果:如何对表进行加列曹组,保证各个表的结构一致;Parquet表中碎文件较多影响查询效率如何定期的合并等。限于篇幅,这里就不再具体介绍了。

写后感

这是在简书写的第二篇文章,没想到写完第一篇文章之后简书也成了我们的客户(当然不是因为我_)。现在对简书也更加亲切了,也我们一起实现数据驱动,哈哈。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,015评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,262评论 1 292
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,727评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,986评论 0 205
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,363评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,610评论 1 219
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,871评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,582评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,297评论 1 242
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,551评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,053评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,385评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,035评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,079评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,841评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,648评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,550评论 2 270

推荐阅读更多精彩内容