如果我在这里发布的内容不正确,请告诉我。 (注意:KairosDB位于Cassandra之上。使用Hector)。
我正在使用KairosDB Java客户端将大量样本数据转储到数据存储区中。我目前倾销了600万,现在正试图用以下方法删除所有这些:
public static void purgeData(String metricsType, HttpClient c, int num, TimeUnit units){
try {
System.out.println("Beginning method");
c = new HttpClient("http://localhost:8080/api/v1/datapoints/delete");
QueryBuilder builder = QueryBuilder.getInstance();
System.out.println("Preparing to delete info");
builder.setStart(20, TimeUnit.MONTHS).setEnd(1, TimeUnit.SECONDS).addMetric(metricsType);
System.out.println("Attempted to delete info");
QueryResponse response = c.query(builder);
//System.out.println("JSON: " + response.getJson());
} catch (Exception e) {
System.out.println("Adding data points produced an error");
e.printStackTrace();
}
}
请注意,我删除了时间间隔参数,只是尝试一次删除所有数据。
执行此方法时,似乎没有任何点被删除。我选择使用数据的JSON形式卷曲查询,并收到HectorException,指出“所有主机池都已标记为down。重试负载推送到客户端”。
我个人的结论是600万太多不能一次删除。我一直在考虑删除部分,但我不知道如何限制从KDB Java客户端删除的行数。我知道KairosDB用于生产。人们如何使用Java客户端有效地删除大量数据?
非常感谢您的时间!
答案 0 :(得分:0)
您可以使用cqlsh或cassandra-cli截断KairosDBs表(data_points,row_key_index,string_index)。我对KairosDB不太熟悉,知道这是否会导致问题。
> truncate {your keyspace}.data_points;
可能需要几秒钟才能完成。
答案 1 :(得分:0)
一次删除600万个数据点不应该有任何问题。
这个例外很奇怪,它完全意味着赫克托尔无法与卡桑德拉交流。您是否检查过KairosDB和cassandra日志文件的所有内容?群集的kairosdb.properties中的所有已配置协调器是否都处于活动状态?
如果不是因为cassandra,我建议在KairosDB github上解决问题,将查询的JSON与KairosDB的日志相关联。
有两种方法可以删除kairosDB中的数据。
A)如果您需要删除给定指标的所有数据点,您可以使用删除指标API,它在后台调用相同的方法,因此请求相同的结果。但是它会更快,因为您确保从Cassandra而不是单个单元格中删除所有匹配的行。
B)如果您只需删除一个指标的某些数据点,那么您已经在使用正确的方法。
在进一步讨论之前,我发现您没有在删除查询中定义标记,因此您会在时间间隔内删除该指标的所有系列的所有数据点...这是您想要做的吗?
最后,为了回答您的问题,我们正在对大量数据执行删除操作(批量重新插入数百万个样本,我们删除所有匹配的系列,然后重新插入)。我们的操作处理大量指标(数千个),因此删除查询非常大但工作得很好,我们没有处理同一指标上的数百万个点,但除非你真的只有一个系列,否则结果应该是同样的。
如果要删除的数百万个样本似乎是问题(我对此表示怀疑),您可以尝试以下操作:将您的删除查询拆分几个时间间隔(在删除查询中将相同的指标放置几次,但总数的一小部分)时间间隔),因此您可以减少一批中要删除的样本数量。
我希望这会有所帮助。
卢瓦克