在开发过程中,由于刚刚使用druid.io时,数据量比较小,所以如果按照小时来存储结果,发现每个segments只有几兆的大小,这种大量的小文件不适合在HDFS集群上进行深度存储,同时也会降低查询性能等等,所以迫切需要一种方案对segment进行数据合并,在查询druid.io的配置参数时,发现druid.io的协调节点上可以开启参数
druid.coordinator.merge.on
每隔一点时间,会向druid的协调节点上提交一个mege_task的任务,对新增的segments进行合并(当然在实际只用中,该参数还需要结合一些其他的参数一起)
那么这个参数开启后,会发现一个问题,这个参数只对开启参数之后的新增的segments进行合并,那么如果需要对历史上已经存在的segments进行合并,改如何处理呢,这就是我们今天的主题,druid.io手动调用segement合并任务
(一)segment合并任务(过时)
追加合并Task:将一个list集合的段落合并到一个单独的segments(一个接一个的合并)
{
"type": "append",
"id": <task_id>,
"dataSource": <task_datasource>,
"segments": <JSON list of DataSegment objects to append>,
"aggregations": <optional list of aggregators>,
"context": <task context>
}
合并Task:(将一个集合的list合并到一起,并且相同的时间戳的数据也会聚合,如果摄入的部分被删除,相通的时间是不会参与聚合的,并且这个记录会被单独重新记录)
{
"type": "merge",
"id": <task_id>,
"dataSource": <task_datasource>,
"aggregations": <list of aggregators>,
"rollup": <whether or not to rollup data during a merge>,
"segments": <JSON list of DataSegment objects to merge>,
"context": <task context>
}
(二)按照Intervals数据进行数据聚合
改方式是segments合并的一个捷径,所有在这个intervals的数据都将会被聚合
{
"type": "same_interval_merge",
"id": <task_id>,
"dataSource": <task_datasource>,
"aggregations": <list of aggregators>,
"rollup": <whether or not to rollup data during a merge>,
"interval": <DataSegment objects in this interval are going to be merged>,
"context": <task context>
}
实例:
http://druid.ip :18090/druid/indexer/v1/task
{
"type": "same_interval_merge",
"dataSource": "TEST-CTI-PT30M-PT1H",
"aggregations":[
{
"type": "longSum",
"name": "readyNum",
"fieldName": "readyNum",
"expression": null
},
{
"type": "longSum",
"name": "notReadyNum",
"fieldName": "notReadyNum",
"expression": null
}],
"rollup":true,
"interval":"2019-01-01/2019-02-01",
"context":{}
}