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

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

你可能感兴趣的:(Druid原理分析之Segment的存储结构)