Druid:A Real-time Analytical Data Store(下篇)

4. 存储结构

Druid中的数据表(称为数据源)是时间戳事件的集合,并分割为一组segments,其中每个段通常为5-10万行。正式地,我们将段定义为跨越某个时间段的数据行的集合。段表示Druid中的基本存储单元,复制和分发都是在段级别完成的。

Druid总是需要一个时间戳列,用来简化数据分发策略,数据保留策略和第一级查询修剪。Druid数据源划分成定义良好的时间间隔(通常为一小时或一天),并且可以进一步对来自其他列的值进行分区,以实现所需的段大小。分割段的时间粒度是数据量和时间范围的函数。如果数据集中的时间戳遍布在一年里,则按天进行分区。如果数据集中的时间戳遍布在一天里,则按小时进行分区。

段由数据源标识符进行唯一标识,标识符包括数据的时间间隔以及新段被创建时增加的版本字符串。版本字符串可以识别出段数据的新鲜度;新版本的段具有较新的数据视图(在一些时间范围内)。该段元数据由系统用于并发控制; 读操作总是从具有该时间范围的最新版本标识符的段中访问特定时间范围内的数据。

Druid段用列式存储。鉴于Druid最适合用于事件流的聚合计算(所有进入Druid的数据必须有一个时间戳),所以将聚合信息存储为列而不是行的优势已有详细记录[1]。 列存储允许更高效的利用CPU,因为只有实际需要的才会被加载和扫描。在面向行的数据存储器系统中,与行相关联的所有列必须作为聚合的一部分进行扫描。额外的扫描时间可以引入明显的性能退化[1]。

Druid有多种列类型来表示各种数据格式。根据列类型不同,使用不同的压缩方法来降低在内存和磁盘上存储列的成本。在表1中给出的示例中,page、user、gender和city列仅包含字符串。直接存储字符串需要不必要的代价,可以用字典编码来代替。字典编码是压缩数据的常用方法,并已用于其他数据存储系统,如PowerDrill [17]。在表1的示例中,我们可以将每个page映射到唯一的整数标识符。



Justin Bieber -> 0
Ke$ha -> 1
此映射允许我们将page列表示为整数数组,其中数组索引对应于原始数据集的行。 对于page列,我们可以表示为:[0, 0, 1, 1]

生成的整数数组本身非常适合进行压缩。在编码之上的通用压缩算法在列存储中非常常见。Druid使用LZF [24]压缩算法。

类似的压缩方法可以应用于数字列。例如,表1中characters added和characters removed列也可以表示为单个数组:
Characters Added -> [1800, 2912, 1953, 3194]
Characters Removed -> [25, 42, 17, 170]

在这种情况下,我们压缩原始值,而不是它们的字典表示。

4.1 数据过滤索引

在许多现实世界的OLAP工作流中,针对满足某些维度条件的某些度量集合的聚合结果发出查询。比如一个查询示例是:“旧金山的男性用户进行了多少次维基百科编辑?”此查询基于维度值的布尔表达式(city=='San Francisco' and gender='Male')过滤表1中的维基百科数据集。在许多实际数据集中,维度列包含字符串,度量列包含数值。Druid为字符串列创建额外的查找索引,以便只扫描属于特定查询过滤器的那些行。

让我们考虑表1中的page列。对于表1中的每个唯一页面,可以使用一些标记来指明哪些行可以看到特定页面。我们可以将此信息存储在二进制数组中,其中数组索引表示我们的行。 如果在特定行中看到特定页面,则该数组索引被标记为1.例如
Justin Bieber -> rows [0, 1] -> [1][1][0][0]
Ke$ha -> rows [2, 3] -> [0][0][1][1]

Justin Bieber在行0和1中可以看到。列值到行索引的映射形成了一个倒排索引[39]。 要知道哪些行包含Justin Bieber或Ke$ha,我们可以对这两个数组进行OR运算。
[0][1][0][1] OR [1][0][1][0] = [1][1][1][1]

这种对大型bitmap数据集执行布尔运算的方法通常用于搜索引擎中。OLAP负载的位图索引在[32]中有详细描述。位图压缩算法是一个明确的研究领域[2,44,42],并且经常利用游标编码算法。Druid选择使用Concise算法[10]。 图7说明了使用整数数组进行Concise压缩的字节数。结果是在一个cc2.8xlarge系统生成的,其中使用了单线程,2G堆,512m年轻带,和每个运行之间的强制GC。数据集是从Twitter garden hose[41]数据流收集的一天的数据。 数据集包含2,272,295行和12个不同基数的维度。作为一个额外的比较,我们也对数据集行排序以做到最大化压缩。

在未排序的情况下,Concise压缩后大小为53,451,144字节,总整数数组大小为127,248,520字节。 总的来说,Concise压缩集比整数数组小42%。在排序的情况下,总Concise压缩大小为43,832,884字节,总的整数数组大小为127,248,520字节。 有趣的是,在排序后,全局压缩只增加了很小一部分。

4.2 存储引擎

Druid的持久化组件允许不同的存储引擎以插件的方式接入,类似于Dynamo。这些存储引擎可以将数据存储在一个完全的in-memory结构的引擎中,例如JVM heap,或者是存储于 memory-mapped 结构的存储中。Druid中存储引擎可配置更换的这个能力依赖于一个特定的应用规范。一个in-memory的存储引擎要比memory-mapped存储引擎的成本昂贵得多,但是如果对于性能特别敏感的话,in-memory存储引擎则是更好的选择。默认情况下使用的是memory-mapped存储引擎。
当使用一个memory-mapped存储引擎的时候,Druid依赖于操作系统来对segment在内存中进行换入和换出操作。因为只有当segment加载到内存中了才可以被查询,所以memory-mapped存储引擎允许将最近的segment保留在内存中,而那些不会再被查询的segment则被换出。使用memory-mapped的主要缺点是当一个查询需要更多的segment并且已经超出了节点的内存容量时,在这种情况下,查询性能将会因为不断的在在内存中进行segment的换入和换出而下降。

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

推荐阅读更多精彩内容