【问题标题】:KairosDB in Java - using the client to delete high volumes of dataJava 中的 KairosDB - 使用客户端删除大量数据
【发布时间】:2015-10-14 09:22:24
【问题描述】:

如果我发布的内容有误,请在此处告知我。 (注意: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,说明“所有主机池都标记为已关闭。重试负担推给客户端”。

我个人的结论是,600 万太多了,无法一次删除。我正在考虑一次删除部分,但我不知道如何限制从 KDB Java 客户端删除的行数。我知道 KairosDB 用于生产。人们如何使用 Java Client 有效地删除大量数据?

非常感谢您的宝贵时间!

【问题讨论】:

    标签: java rest cassandra kairosdb


    【解决方案1】:

    您可以使用 cqlsh 或 cassandra-cli 截断 KairosDBs 表(data_points、row_key_index、string_index)。我对 KairosDB 不够熟悉,不知道这是否会导致问题。

    > truncate {your keyspace}.data_points;
    

    可能需要几秒钟才能完成。

    【讨论】:

    • 感谢您的回复!不幸的是,我需要从 Java 文件中执行此操作,因为它将依赖于从不同服务提供的参数。 Java 客户端有什么想法吗?
    • 如果您使用的是 cql 驱动程序,您可以执行上面的截断 session.execute("truncate keyspace.data_points");像您使用的查询生成器也有支持
    • 非常感谢!我会调查一下。
    【解决方案2】:

    一次删除 600 万个数据点应该不会有任何问题。

    这个异常很奇怪,它最终意味着 Hector 无法与 cassandra 通信。您检查过 KairosDB 和 cassandra 日志文件是否一切正常?集群的 kairosdb.properties 中配置的所有协调器都还活着吗?

    如果不是因为 cassandra,我建议在 KairosDB github 上针对您的问题提出一个问题,将查询的 JSON 与 KairosDB 的日志相关联。

    kairosDB有两种删除数据的方法。

    A) 如果您需要删除给定指标的所有数据点,您可以只使用删除指标 API,它在后台调用相同的方法,因此期望相同的结果。但是它会更快,因为您确保从 Cassandra 中删除所有匹配的行而不是单个单元格。

    B) 如果您只需要删除一个指标的一些数据点,那么您已经使用了正确的方法。

    在继续之前,我发现您没有在删除查询中定义标签,因此您将在时间间隔内删除此指标的所有系列的所有数据点...这是您想要做的吗?

    最后,为了回答您的问题,我们正在对大量数据进行删除操作(批量重新插入数百万个样本,我们删除时间间隔内所有匹配的序列,然后重新插入)。我们的操作处理大量指标(数千个),因此删除查询非常大但效果很好,我们没有在同一指标上处理数百万个点,但除非你真的只有一个系列,否则结果应该是一样的。

    如果要删除的数百万个样本似乎是问题(我对此表示怀疑),您可以尝试以下操作:将删除查询按几个时间间隔拆分(在删除查询中放置多次相同的指标,但占总数的一小部分时间间隔),因此您可以减少一批中要删除的样本量。

    我希望这会有所帮助。

    洛伊克

    【讨论】:

    • 我实现了你提到的方式(批处理时间间隔)并且它正在工作。谢谢!我仍然对为什么删除这么多被证明是一个问题感到困惑。你知道 Cassandra 中是否有内部可访问的时间戳,所以我可以在那里执行删除吗?
    • 通常一次删除所有数据要快得多,因为行是从 Cassandra 删除的,而不是在数百万个单独的单元格上放置墓碑。所以我也很困惑,调查起来很有趣。我看到你删除了20个月前到1秒前的数据,请问你为什么输入这些值?你知道在这个时间间隔内你有多少个在这个指标名称下的系列?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-16
    • 2016-06-13
    • 1970-01-01
    • 2012-08-30
    • 2022-01-20
    相关资源
    最近更新 更多