在druid中删除数据个人感觉是一个非常麻烦的事情,主要是他不能直接编写sql进行删除,只能使用task的方式进行删除。
在druid中删除数据主要分为两个步骤,分别是:
1、该段必须首先标记为“未使用”。当用户通过协调器 API 手动禁用分段时会发生这种情况。 2、将段标记为“未使用”后,Kill Task 将从 Druid 的元数据存储和深度存储中删除任何“未使用”的段。
标记未使用
使用task进行删除的时候,我们还是只能根据段进行删除,这个段呢主要是以时间为基准的,总体的思路类似于mysql的:
delete from table where _time > xxxx and _time < xxxx
所以我们要删除数据的话,首先需要定义段,下面我们使用之前的users1表进行演示,咱们的需求是:
删除2010年的数据
所以首先我们查询一下users1表的2010年的数据,示例如下:
可以看到能查询出来2010年的数据,这里由于我们的_time是根据birthday转换出来的,所以这里我们要删除2010年的数据的话,那就要编写_time格式的2010年的数据,示例如下:
curl -X 'POST' -H 'Content-Type:application/json' -d '{ "interval" : "2010-01-01T00:00:00.000Z/2011-01-01T00:00:00.000Z" }' http://192.168.31.186:8888/druid/coordinator/v1/datasources/users1/markUnused
这里的主要语法是:
curl -X 'POST' -H 'Content-Type:application/json' -d '{ "interval" : "${start_time}/${end_time}" }' http://${ip:port}/druid/coordinator/v1/datasources/${datasource}/markUnused
我们主要是需要填写四个指标:
1、开始时间 2、结束时间 3、druid地址和端口 4、datasources
当我们执行的时候,会返回一个{"numChangedSegments":0}的结果,就代表我们已经把当前的数据标记为未使用了,如下图:
当标记玩不可用之后,我们就查询不出来这个时间段的数据了,示例图如下:
此时数据仅是在druid中进行禁用了,但是数据还是存储在druid的元数据及segment中的,所以还需要去删除。
kill task
接着我们需要去服务器上创建一个名称为deletion-kill.json的文件,然后在里面填写如下的内容:
{ "type": "kill", "dataSource": "users1", "interval" : "2010-01-01/2011-01-01" }
整段内容是一个json,主要是填写对应的dataSource和interval,这里的Interval就只需要填写到日期即可。接着我们去服务器执行如下的命令:
curl -X 'POST' -H 'Content-Type:application/json' -d @deletion-kill.json http://192.168.31.186:8081/druid/indexer/v1/task
这里的语法主要是:
curl -X 'POST' -H 'Content-Type:application/json' -d @${文件全路径名称} http://${ip:port}/druid/indexer/v1/task
执行之后我们可以看到返回了删除的任务信息,示例如下:
此时我们就可以看到想要删除部分的元数据和数据段都已经被物理删除掉了。
通过dashboard我们已经看到没有2010年的数据段了,然后查询其他的段都还在的,例如:
以上大家看这个删除操作是不是很麻烦。
到目前为止druid核心部分就在本系列结束了,介绍的比较少,因为我们也是用的比较少,局限性太大了,所以如果需要做olap场景的话,建议考虑考虑其他的框架,例如目前很多的Doris。
还没有评论,来说两句吧...