Segment是Druid中最基本的数据存储单元,采用列式的方式存储某一个时间间隔(interval)内某一个数据源(dataSource)的部分数据所对应的所有维度值、度量值、时间维度以及索引。
Segment的逻辑名称结构为:
其中:
dataSource:为在Druid中定义的该Segment所属的数据源或者叫表;
intervalStart、intervalEnd:该Segment段的时间间隔,使用ISO-8601格式,表示存的是那个时间段内的聚合数据;
version:版本号,用于区分多次加载同一数据对应的Segment;
partitionNum:分区编号,在每个时间间隔内,根据数据量的大小,一个Segment内部可能会有多个partition,官方推荐通过控制时间间隔粒度或者partition的个数来保证每个partition的大小在300Mb-700Mb之间,从而获得最优的加载与查询性能。
上图中给出了Segments在HDFS上的物理存储路径。我们可以看到Segment的路径格式为:
/druid/segments/
该目录下包括两个文件:
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。包含两部分:
参考资料:https://blog.csdn.net/mytobaby00/article/details/79801425