Druid原理分析之Segment的存储结构

Segment是Druid中最基本的数据存储单元,采用列式的方式存储某一个时间间隔(interval)内某一个数据源(dataSource)的部分数据所对应的所有维度值、度量值、时间维度以及索引。

Segment的逻辑名称结构为:<dataSource>_<intervalStart>_<intervalEnd>_<version>_<partitionNum>

其中:

  • dataSource:为在Druid中定义的该Segment所属的数据源或者叫表;
  • intervalStart、intervalEnd:该Segment段的时间间隔,使用ISO-8601格式,表示存的是那个时间段内的聚合数据;
  • version:版本号,用于区分多次加载同一数据对应的Segment;
  • partitionNum:分区编号,在每个时间间隔内,根据数据量的大小,一个Segment内部可能会有多个partition,官方推荐通过控制时间间隔粒度或者partition的个数来保证每个partition的大小在300Mb-700Mb之间,从而获得最优的加载与查询性能。

上图中给出了Segments在HDFS上的物理存储路径。我们可以看到Segment的路径格式为:

/druid/segments/<dataSource>/<intervalStart>_<intervalEnd>/<segmentGenerateTime>/<shardNum>/

该目录下包括两个文件:

  • descriptor.json
  • index.zip

其中:

descriptor.json是这个Segment的描述文件,其内容也保存在Druid集群的元数据的druid_segments表中。其内容如下:

{
	"dataSource": "AD_active_user",
	"interval": "2018-04-01T00:00:00.000+08:00/2018-04-02T00:00:00.000+08:00",
	"version": "2018-04-01T00:04:07.022+08:00",
	"loadSpec": {
		"type": "hdfs",
		"path": "/druid/segments/AD_active_user/20180401T000000.000+0800_20180402T000000.000+0800/2018-04-01T00_04_07.022+08_00/1/index.zip"
	},
	"dimensions": "appkey,spreadid,pkgid",
	"metrics": "myMetrics,count,offsetHyperLogLog",
	"shardSpec": {
		"type": "numbered",
		"partitionNum": 1,
		"partitions": 0
	},
	"binaryVersion": 9,
	"size": 168627,
	"identifier": "AD_active_user_2018-04-01T00:00:00.000+08:00_2018-04-02T00:00:00.000+08:00_2018-04-01T00:04:07.022+08:00_1"
}

index.zip文件中包括了该segment中的数据。它包含了以下三类文件:

  • version.bin:Segment内部标识的版本号,标识为v9. 内容为00000009。
  • xxxxx.smoosh:xxxxx从0开始编号,最大为2G,是为了满足Java内存文件映射MapperByteBuffer限制。在segment生成阶段,Druid会为每列数据生成对应的索引,并将压缩后的聚合数据以及索引存入到以列命名的drd文件中(比如上segment的__time.drd,index.drd,appkey.drd...)。所有的*drd文件最终被合并成*.smoosh文件。其中压缩编码后的每列原始数据包含两部分1)使用Jackson序列化的ColumnDescriptor,包含列数据的元信息,比如数据的类型,是否包含multi-value。。。2)其余部分为编码以后的二进制数据。
  • meta.smoosh: 该文件用于记录该segment数据的元信息。文件格式为csv。包含两部分:

第一行为文件头:


其中v1代表segment的版本号,2147483647(2GB)为xxxxx.smoosh文件的最大大小。1表示分片数量,即index.zip文件中xxxxx.smoosh文件的个数。
从第二行开始为文件体:

每行都是4列,column表示列名,smooshid表示分片编号,从0开始编号,对于包含多个xxxxx.smoosh文件的index.zip,meta.smooth文件会记载多个xxxxx.smoosh文件中每列的元信息。startPos为该列在第smooshid分片中的开始位置,endPos为其结束位置。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值