【问题标题】:Astyanax cannot read some column familiesAstyanax 无法读取某些列族
【发布时间】:2019-03-08 23:53:29
【问题描述】:

我正在尝试使用 Astyanax 驱动程序列出 Cassandra 中的列族。它列出了正确的键空间,但输出中缺少许多列族。

我有一个简单的程序:

import com.netflix.astyanax.AstyanaxContext;
import com.netflix.astyanax.Cluster;
import com.netflix.astyanax.connectionpool.impl.ConnectionPoolConfigurationImpl;
import com.netflix.astyanax.connectionpool.impl.CountingConnectionPoolMonitor;
import com.netflix.astyanax.ddl.ColumnFamilyDefinition;
import com.netflix.astyanax.ddl.KeyspaceDefinition;
import com.netflix.astyanax.impl.AstyanaxConfigurationImpl;
import com.netflix.astyanax.thrift.ThriftFamilyFactory;

public class App {

  public static void main(String[] args) throws Exception {

    ConnectionPoolConfigurationImpl cpool = new ConnectionPoolConfigurationImpl("ConnectionPool")
        .setPort(9160)
        .setSeeds("localhost");

    AstyanaxConfigurationImpl astyanaxConfiguration = new AstyanaxConfigurationImpl();
    AstyanaxContext.Builder ctxBuilder = new AstyanaxContext.Builder();
    ctxBuilder.forCluster("Cluster")
        .withAstyanaxConfiguration(astyanaxConfiguration)
        .withConnectionPoolConfiguration(cpool)
        .withConnectionPoolMonitor(new CountingConnectionPoolMonitor());

    AstyanaxContext<Cluster> clusterContext = ctxBuilder.buildCluster(ThriftFamilyFactory.getInstance());
    clusterContext.start();
    Cluster cluster = clusterContext.getClient();

    for (KeyspaceDefinition ksDef : cluster.describeKeyspaces()) {
      List<ColumnFamilyDefinition> cfDefList = ksDef.getColumnFamilyList();
      System.out.println("there are " + cfDefList.size() + " column families in keyspace " + ksDef.getName());
      for (ColumnFamilyDefinition cfDef : cfDefList) System.out.println(" - " + cfDef.getName());
    }

它可以列出键空间,但缺少许多列族。这是输出。可以看到很多默认的keyspace都存在,但是很多column family都缺失了。

there are 0 column families in keyspace system_distributed
there are 3 column families in keyspace system
- hints
- schema_keyspaces
- IndexInfo
there are 2 column families in keyspace system_auth
- role_members
- resource_role_permissons_index
there are 0 column families in keyspace system_traces

我可以使用 cqlsh 来确认列族确实存在

cqlsh> DESCRIBE COLUMNFAMILIES

Keyspace system_traces
----------------------
events  sessions

Keyspace system_auth
--------------------
resource_role_permissons_index  role_permissions  role_members  roles

Keyspace system
---------------
available_ranges  size_estimates    schema_usertypes    compactions_in_progress
range_xfers       peers             paxos               schema_aggregates
schema_keyspaces  schema_triggers   batchlog            schema_columnfamilies
schema_columns    sstable_activity  schema_functions    local
"IndexInfo"       peer_events       compaction_history  hints

Keyspace system_distributed
---------------------------
repair_history  parent_repair_history

上面的输出使用的是 cassandra 2.2,但我已经确认了其他版本的 cassandra 和 scylla 中的行为。

【问题讨论】:

    标签: java cassandra thrift astyanax scylla


    【解决方案1】:

    默认情况下,Cassandra 已弃用并且不再启用 Thrift。您需要启用它才能使用它。请记住,在 Cassandra 的下一个版本中,它甚至不存在。很有可能即使启用它并使用它也可能无法正常工作。没有什么真正使用它了,也没有那么多的测试使用它。表的存储和检索方式在版本之间发生了变化,因此驱动程序必须意识到这一点。由于 Astyanax 没有得到维护,它可能不会正确。

    Astyanax 已停用,仅适用于较旧的应用程序。您真的应该使用java driver(与 Astyanax 页面上的建议相同)。

    【讨论】:

    • 嗨,克里斯。谢谢,是的,我听说节俭正在被贬低。我实际上正在使用另一个使用 cassandra 作为存储解决方案的数据库(janusgraph)。他们的一些代码使用 thrift API 与数据库通信。我编写的程序是由我从该代码库中提取的 sn-ps 组成的。
    • 我尝试使用旧版本的 Cassandra(2.0 和 2.2),它与 astyanax 驱动程序几乎同时维护,并且具有相同的行为
    • Astyanax 真的是像 cassandra 1.0、1.1 或 1.2 一样使用。我认为 2.0 支持处于测试阶段,当它基本上停止尝试跟上 netflix 迁移到 java 驱动程序时。尝试 1.2 但老实说,期望值很低。如果他们使用 cassnadra,我确信 janusgraph 有某种 cql 支持。
    【解决方案2】:

    我记得在 Cassandra 0.8.8 - 1.1 和 1.2 中使用 Astyanax。曾经有一段时间,我们会将所有数据(列)作为 blob 放入一个分区(启用更快的写入),然后我们会从节俭的胖客户端解析数据(据称 Cassandra 此时读取速度很慢)。我们必须跟踪模式,然后在反序列化来自 thrift 客户端的输出时,我们将根据所有单独列的数据类型进行解析。在引入 CQL 之后,所有这些都发生了变化,正如 Chris 所指出的,这是使用 c* 的推荐方式。

    【讨论】:

      【解决方案3】:

      您尝试过哪些版本的 Scylla?尽管 Cassandra 已弃用 Thrift,但 Scylla 仍支持 Thrift。

      【讨论】:

      • 嗨,彼得,感谢您的跟进。我用 Scylla 2.1.0 和 2.1.3 试过这个
      • 有趣!它在 Scylla 2.3(当前版本)上显示了相同的结果吗? (这可能会导致同样令人失望的结果,但最好排除已修复的错误。)如果您不满意,请考虑发布到组 groups.google.com/forum/#!forum/scylladb-users
      • 嘿彼得。我们发现了发生了什么。我们使用 CQL 创建表,然后尝试使用 thrift 将它们作为列族读取。一旦我们将它交换到 init 以使用 CQL 创建列族,它就可以正常工作
      • 哇!很高兴知道!谢谢。
      猜你喜欢
      • 2018-12-22
      • 2014-02-27
      • 2018-12-05
      • 2021-11-23
      • 2015-04-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-10-21
      相关资源
      最近更新 更多