【问题标题】:Hash value from keys on CassandraCassandra 上键的哈希值
【发布时间】:2013-11-25 06:30:24
【问题描述】:

我正在使用 Hector 为 Cassandra 开发一种机制。 我现在需要的是知道哪些是键的哈希值,以查看存储了哪个节点(查看每个令牌),并直接向该节点询问该值。我的理解是,根据 Cassandra 使用的分区器,这些值独立于一个分区器存储到另一个分区器。那么,所有键的哈希值是否存储在任何表中?如果不是,我如何实现一个通用类,一旦我从 System Keyspace 读取使用 Cassandra 的分区器,这个类可能是它的一个实例,而无需根据分区器修改代码?我需要它来调用 getToken 方法来计算给定键的哈希值。

【问题讨论】:

  • 我不明白您要做什么 - Cassandra 使用分区程序在内部处理所有哈希值。你想对他们做什么?

标签: hash cassandra key hector partitioner


【解决方案1】:

Hector 的 CqlQuery 支持很差,而且有问题。您应该改用本机 Java CQL 驱动程序:https://github.com/datastax/java-driver

【讨论】:

  • 对于那些看到这个和 jbellis 对这个问题的另一个答案的人:这些重复出现是因为我将另一个问题合并到这个问题中。
【解决方案2】:

您可以重用 Cassandra 中定义的分区器:https://github.com/apache/cassandra/tree/trunk/src/java/org/apache/cassandra/dht,然后使用令牌范围进行路由。

【讨论】:

    【解决方案3】:

    CQL driver 提供开箱即用的令牌感知路由。我会使用它而不是尝试在 Hector 中重新发明轮子,特别是因为 Hector 使用旧版 Thrift API 而不是 CQL

    【讨论】:

    • 对于那些看到这个和 jbellis 对这个问题的另一个答案的人:这些重复出现是因为我将另一个问题合并到这个问题中。
    【解决方案4】:

    最后在测试了不同的实现之后,我找到了使用下一个代码获取分区器的方法:

                CqlQuery<String, String, String> cqlQuery = new CqlQuery<String, String, String>(
                ksp, StringSerializer.get(), StringSerializer.get(),   StringSerializer.get());
                cqlQuery.setQuery("select partitioner from local");
                QueryResult<CqlRows<String, String, String>> result = cqlQuery.execute();
                CqlRows rows = result.get();
                for (int i = 0; i < rows.getCount(); i++) {
                    RowImpl<String, String, String> row = (RowImpl<String, String, String>) rows
                    .getList().get(i);
                    List<HColumn<String, String>> column = row.getColumnSlice().getColumns();
                    for (HColumn<String , String> c: column) {
                        System.out.println(c.getValue());
                }
    
        } 
    

    【讨论】:

      猜你喜欢
      • 2019-05-02
      • 1970-01-01
      • 2011-06-30
      • 2015-11-12
      • 2013-03-22
      • 2021-12-15
      • 1970-01-01
      相关资源
      最近更新 更多