Colume2
Colume3
.....
K1
1340109000000
?
?
?
?
K1
1340112900000
?
?
?
?
K1
1340115300000
?
?
?
?
K1
1340117880000
?
?
?
?
K2
1340111400000
?
?
?
?
K2
1340117700000
?
?
?
?
K3
1340109600000
?
?
?
?
K3
1340113500000
?
?
?
?
K3
1340117100000
?
?
?
?
...
...
?
?
?
?
?
PKT 格式(即 PARTITION-KEY-TIMESTAMP 格式) —— 该格式首先按照时间分区分组排序(其中partition可选择小时、天、月、年等时间单位,其类似传统数据库中的分区概念),在组内首先按照KEY排序,相同KEY再按照事件时间排序。具体 Layout 见表 6.3
分区单位-小时
表6.3
| Parttion |
Key |
Timestamp |
Colume1 |
Colume2 |
Colume3 |
Colume4 |
| 13401072 |
K1 |
1340109000000 |
? |
? |
? |
? |
| 13401072 |
K3 |
1340109600000 |
? |
? |
? |
? |
| 13401108 |
K1 |
1340112900000 |
? |
? |
? |
? |
| 13401108 |
K2 |
1340111400000 |
? |
? |
? |
? |
| 13401108 |
K3 |
1340113500000 |
? |
? |
? |
? |
| 13401144 |
K1 |
1340115300000 |
? |
? |
? |
? |
| 13401144 |
K1 |
1340117880000 |
? |
? |
? |
? |
| 13401144 |
K2 |
1340117700000 |
? |
? |
? |
? |
| 13401144 |
K3 |
1340117100000 |
? |
? |
? |
? |
| ... |
... |
? |
? |
? |
? |
? |
?
?
?
?
?
?
?
?
?
?
?
?
?
上述的数据存储格式核心目的都是为了让时序数据在磁盘上“有序存储”,从而按区间扫描时磁头可保证高速顺序移动,并且遍历的数据尽可能少。如果理解了这个准则,那么自然可知上述时序数据格式各自的优缺点了:
TK格式对于区间内无key检索性能最优,而对于给定key查询则有所浪费 —— 因为TK
格式中未按KEY聚集数据,所以检索给定KEY需要扫描给定时段内全部数据。
KT格式对于给定key检索性能最优,如果区间内无key查询则是麻烦 —— 因为KT格式下要统计给定时段则必须扫描全部数据。
PKT格式对于区间内无key查询效率比TK格式稍差 —— 因为需要扫描完时段所跨分区的全部数据;PKT格式对于给定key检索效率比KT稍差 —— 因为需要在时段所跨越的每个分区内,依次扫描该给定key的对应数据。但PKT格式能兼顾两类查询,且性能损失不大。
为了能在多种场景下都能提供最佳处理性能,我们对同一数据的不同副本可选择不同数据格式存储,在查询时根据查询条件“智能”选择最佳数据格式所在的分片实施查询,从而确保蜂鸟在各时序场景下都能提供最佳性能(见图2)。

?
图2
?
7. 重要特性和优势
蜂鸟系统的数据存储格式和体系架构决定了蜂鸟系统的最重要的几个特性:
面向时序检索和分析优化 ?
分布式存储和计算
高可用性
支持SQL,并扩充时序分析SQL
上述特性将为用户处理大规模时序数据带来显著好处,具体如下。
7.1. 读写性能突出
数据导入速度高 :蜂鸟集群中单机单盘能提供40M/s的写入速度,因此不存在数据无法及时入库的烦恼。
数据更新速度高 :蜂鸟实现了列(列族)存储结构,因此很合适需要大规模按列(列族)更新的场景。
数据扫描速度高 :配备8SATA磁盘的PC服务器,能提供约2-4G/s的数据扫描速度,确保时间断面上统计(或者说上钻)性能。
按列计算速度高 :蜂鸟具备列存结构,因此能保证快速在给定列上进行分析计算(无需读取全行)。
时间排序查询速度高 :由于我们时序数据存储遵循时间排序(还有key排序),因此对于按时间排序的检索操作非常高效 —— 比如逆序/正序检索:如,order by timestamp desc/asc limit 100 ;或时间滑动窗口上的计算:如,计算股票MACD等指标。
7.2. 恒时检索(Constant Query Time)
恒时体现数据检索速度不随数据总量而变,只与“命中(touched data)”的数据量相关。具体表现在两个方面:
当给定key检索时,性能只和该key对应的数据多少相关,而与共有多少个key无关(比如,城市车里从100万辆涨到1000万辆后,检索给定车辆的速度不会改变)。
当无key检索时,性能只和时间段数据量相关,而与总数据量无关(比如,只积累一年数据和积累十年数据情况下,统计某个月数据则响应时间不变)
?
7.3. 实时数据获取(ingest data in real time)
蜂鸟支持数据实时流式灌入,无须等待,及刻便能被查询到。这种实时性是在线时序数据处理系统的关键需求。(而使用impala,shark等基于HDFS存储的系统都无法做到数据实时获取)。
7.4. 支持面向时序的SQL查询
蜂鸟针对时序数据在插值、时间聚合、Join、递增指标计算等方面对标准SQL进行了扩充,目的是使用户能更直观、方便的对时序数据进行分析处理。
?
| 时序SQL扩充项 |
语法 |
作用 |
举例 |
| 时间聚合 |
Group by time(number,‘s|m|h|d’ |
按照给定时间进行rollup 聚合计算 |
监控工厂设备运行状态,需要计算是每5分钟内的某项指标的偏差: select deviation(x) from table group by (5,‘m’); |
| 插值 |
Nullpolcation()/prepolcation() |
对于空白时段按照空值或前值进行填充 |
为了绘制每5分钟的时间内的数据偏离值,对于采集盲区,需给进行“前值”插值补充: select prepolcation(x) from table group by (5,‘m’); |
| Join |
time join |
对于多个时序数据进行合并,用于产生新时序(用于分析因果,或计算等) |
观察用电量消耗时序表和天气温度变化时序表之间的因果关系: select * from energy time join temperature ? ? ? |
| 递增指标求增量变化 |
Delta() |
对于递增计数指标 |
计算用电量费用变化趋势—— 用电量属于单调递增指标。假设电量时序表为table1,电价时序表为table2,两个表的值都按时间变换。 select table1.timestamp, delta(table1.mount)*table2.price group by table1 time join table2 |
?
比如group by语义在蜂鸟中不仅仅作用于给定字段上,而且也可按照任意时间粒度进行聚合 —— select count(type) from events group by time(10m) —— 该功能特别适合于趋势统计(为了方便可视化,蜂鸟还支持对于未有结果的聚集区间进行差值(如填写0/前值等)。 另外蜂鸟也还支持group by count(1