Druid入门指南 合并段文件


Druid里的每一个数据段都会占用内存,因此在合适的情况下减少段数是有必要的。

本教程将演示如何将现有段合并。

1 加载初始数据

本教程将使用安装包中自带的wikipedia示例数据。其中,摄取任务的规范将在输入数据中每小时创建1-3个数据段文件。

数据摄取规范位于quickstart/tutorial/compaction-init-index.json,提交这个任务规范将创建一个名称为compaction-tutorial的数据源:

bin/post-index-task --file quickstart/tutorial/compaction-init-index.json --url http://localhost:8081
Copy

注意:摄取规范中的maxRowsPerSegment设置为1000,是为了每小时生成多个段,不建议在实际工作中设置。

摄取任务完成后,可以到http://localhost:8888/unified-console.html#datasourcesDruid控制台查看新的数据源。

Druid,Druid段文件,Druid合并数据,Druid合并操作

点击compaction-tutorial数据源中“Fully Available”旁边51 Segments链接来查看数据源段的更多信息。

该数据源有51个段文件,每小时分别有1-3个输入数据段。

Druid,Druid段文件,Druid合并数据,Druid合并操作

对该数据源执行COUNT(*)查询可以看到所有的39244行数据:

dsql> select count(*) from "compaction-tutorial";
┌────────┐
│ EXPR$0 │
├────────┤
│  39244 │
└────────┘
Retrieved 1 row in 1.38s.

2 合并数据

接下来将这51个数据段进行合并。

quickstart/tutorial/compaction-keep-granularity.json文件中包含了一个本教程数据源的合并任务规范。

{
  "type": "compact",
  "dataSource": "compaction-tutorial",
  "interval": "2015-09-12/2015-09-13",
  "tuningConfig" : {
    "type" : "index_parallel",
    "maxRowsPerSegment" : 5000000,
    "maxRowsInMemory" : 25000
  }
}

该任务会合并2015-09-12/2015-09-13时间范围内的所有compaction-tutorial数据段。(tuningConfig中的参数用于控制合并后的段文件集合中有多少个段。)

在本教程示例中,每小时只创建一个合并段。

现在提交这个任务:

bin/post-index-task --file quickstart/tutorial/compaction-keep-granularity.json --url http://localhost:8081

任务运行结束后刷新Segments视图。

最初的51个段被Coordinator标记为“未使用”并移除,最后保留新的合并段

默认情况下,在Coordinator启动至少15分钟之前,Druid Coordinator不会将段标记为未使用,因此您可以在Druid控制台中同时看到旧数据段集合新合并集,即共有75个段:

Druid,Druid段文件,Druid合并数据,Druid合并操作

Druid,Druid段文件,Druid合并数据,Druid合并操作

注意:即使两类数据段都显示在Druid控制台中,查询也只能从新的合并段中读取。

我们再次在compaction-tutorial数据源执行COUNT(*)查询可以看到,行数仍然是39244

dsql> select count(*) from "compaction-tutorial";
┌────────┐
│ EXPR$0 │
├────────┤
│  39244 │
└────────┘
Retrieved 1 row in 1.30s.

Coordinator运行15分钟后,此时的“Segments”视图显示有24个数据分段,每小时一个:

Druid,Druid段文件,Druid合并数据,Druid合并操作

Druid,Druid段文件,Druid合并数据,Druid合并操作

3 用新的段粒度合并数据

合并段文件功能还可以用于合并不同颗粒度的输入数据段。

quickstart/tutorial/compaction-day-granularity.json文件中包含用于创建DAY粒度的合并任务摄取规范:

{
  "type": "compact",
  "dataSource": "compaction-tutorial",
  "interval": "2015-09-12/2015-09-13",
  "segmentGranularity": "DAY",
  "tuningConfig" : {
    "type" : "index_parallel",
    "maxRowsPerSegment" : 5000000,
    "maxRowsInMemory" : 25000,
    "forceExtendableShardSpecs" : true
  }
}

注意:这个合并任务规范中segmentGranularity配置项设置为了DAY现在提交这个任务:

bin/post-index-task --file quickstart/tutorial/compaction-day-granularity.json --url http://localhost:8081

同样,Coordinator需要一些时间来将数据段标记为“未使用”,因此您会看到总共有25个段的临时状态。任务执行结束后则只会存在一个时间颗粒度为“天”的数据段。

Druid,Druid段文件,Druid合并数据,Druid合并操作

Druid,Druid段文件,Druid合并数据,Druid合并操作