【问题标题】:Error when using cql3 with Astyanax将 cql3 与 Astyanax 一起使用时出错
【发布时间】:2013-06-26 14:53:37
【问题描述】:

我试图用 Astyanax 运行一个简单的 Cql3 查询,但我不断收到错误。

目的是通过 Astyanax 使用 cql3 创建一个简单的表。

public class SomeTest {

private AstyanaxContext<Keyspace> astyanaxContext;
private Keyspace keyspace;

private static String CREATE_TABLE_QUERY = "CREATE TABLE top_items (\n" +
        "  categoryName varchar,\n" +
        "  type varchar,\n" +
        "  baseItemId int,\n" +
        "  margin float,\n" +
        "  ds timestamp,\n" +
        "  PRIMARY KEY (categoryName, ds)\n" +
        ");";

@Before
public void setUp() {
    try {
        this.astyanaxContext = new AstyanaxContext.Builder()
                .forCluster("ClusterName")
                .forKeyspace("new_examples")
                .withAstyanaxConfiguration(new AstyanaxConfigurationImpl().setDiscoveryType(NodeDiscoveryType.NONE).setCqlVersion("3.0.0"))
                .withConnectionPoolConfiguration(
                        new ConnectionPoolConfigurationImpl("MyConnectionPool").setMaxConnsPerHost(1).setPort(9160)
                                .setSeeds("localhost:9160")).withConnectionPoolMonitor(new CountingConnectionPoolMonitor())
                .buildKeyspace(ThriftFamilyFactory.getInstance());

        this.astyanaxContext.start();
        this.keyspace = this.astyanaxContext.getEntity();
        // Using simple strategy
        keyspace.createKeyspace(ImmutableMap.<String, Object>builder()
                .put("strategy_options", ImmutableMap.<String, Object>builder()
                        .put("replication_factor", "1")
                        .build())
                .put("strategy_class",     "SimpleStrategy")
                .build()
        );

        // test the connection
        this.keyspace.describeKeyspace();
    } catch (Throwable e) {
        throw new RuntimeException("Failed to prepare CassandraBolt", e);
    }
}

@Test
public void testWrite() throws ConnectionException {
    ColumnFamily<String, String> CQL3_CF = ColumnFamily.newColumnFamily(
            "Cql3CF",
            StringSerializer.get(),
            StringSerializer.get());

    OperationResult<CqlResult<String, String>> result;
    result = keyspace
            .prepareQuery(CQL3_CF)
            .withCql(CREATE_TABLE_QUERY)
            .execute();
}
}

当我运行测试时,我得到了这个堆栈跟踪

java.lang.NoSuchMethodError: org.apache.thrift.meta_data.FieldValueMetaData.<init>(BZ)V
at org.apache.cassandra.thrift.Cassandra$execute_cql_query_args.<clinit>(Cassandra.java:32588)
at org.apache.cassandra.thrift.Cassandra$Client.send_execute_cql_query(Cassandra.java:1393)
at org.apache.cassandra.thrift.Cassandra$Client.execute_cql_query(Cassandra.java:1387)
at com.netflix.astyanax.thrift.ThriftColumnFamilyQueryImpl$6$1.internalExecute(ThriftColumnFamilyQueryImpl.java:699)
at com.netflix.astyanax.thrift.ThriftColumnFamilyQueryImpl$6$1.internalExecute(ThriftColumnFamilyQueryImpl.java:696)
at com.netflix.astyanax.thrift.AbstractOperationImpl.execute(AbstractOperationImpl.java:55)
at com.netflix.astyanax.thrift.AbstractOperationImpl.execute(AbstractOperationImpl.java:27)
at com.netflix.astyanax.thrift.ThriftSyncConnectionFactoryImpl$1.execute(ThriftSyncConnectionFactoryImpl.java:136)
at com.netflix.astyanax.connectionpool.impl.AbstractExecuteWithFailoverImpl.tryOperation(AbstractExecuteWithFailoverImpl.java:69)
at com.netflix.astyanax.connectionpool.impl.AbstractHostPartitionConnectionPool.executeWithFailover(AbstractHostPartitionConnectionPool.java:248)
at com.netflix.astyanax.thrift.ThriftColumnFamilyQueryImpl$6.execute(ThriftColumnFamilyQueryImpl.java:694)
at storage.cassandra.daos.SomeTest.testWrite(SomeTest.java:76)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:44)
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15)
at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:41)
at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:20)
at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:28)
at org.junit.runners.BlockJUnit4ClassRunner.runNotIgnored(BlockJUnit4ClassRunner.java:79)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:71)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:49)
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:193)
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:52)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:191)
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:42)
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:184)
at org.junit.runners.ParentRunner.run(ParentRunner.java:236)
at org.junit.runner.JUnitCore.run(JUnitCore.java:157)
at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:76)
at com.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:195)
at com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:63)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at com.intellij.rt.execution.application.AppMain.main(AppMain.java:120)

我正在使用“com.netflix.astyanax”%“astyanax”%“1.56.18”。

请帮忙。

【问题讨论】:

  • 您可以尝试使用更新的版本。最新的是 1.56.23。我正在使用这个没有任何问题。
  • 156.23 适用于 Cassandra 1.2,但不适用于 Cassandra 1.2.1

标签: astyanax cql3


【解决方案1】:

看起来 Astyanax 没有正确支持 Cassandra 1.2 或 1.2.1(甚至 1.56.24,7 天前发布......)。你可以试试 java-driver 。它尚未发布,但据我测试,它工作正常。 https://github.com/datastax/java-driver

【讨论】:

  • 你是如何让它工作的?我的驱动程序有问题...我有这个 Cassandra 初始化程序:gist.github.com/shehaaz/5279566 如果我什至尝试使用 new Cassandra();它打破了。它是否与具有默认端口的协议选项有关:9042。在我的机器上它是 9160。为什么驱动程序不让我输入自己的端口?或者,也许我做的一切都是错的。谢谢@bitover
  • 为了使用端口 9042,您必须在 cassandra.yaml 中启用本机传输
  • 谢谢!我只是设置了 start_native_transport: true...我可以在服务器中看到“开始在 /127.0.0.1:9042 上侦听 CQL 客户端...”...但是我发布的要点中的驱动程序仍然给出“异常在 Cluster.java:230 的线程 "main" java.lang.NoClassDefFoundError: org/apache/cassandra/transport/FrameCompressor" 你有我可以查看的工作版本吗?谢谢@bitlover
  • 如果您在 ant/grails/sbt 中使用 Maven 或等效项,则必须在 pom.xml 中添加对 cassandra-all 包的依赖
  • 不幸的是,我没有在我的项目中使用 Maven 或 ant...但是我使用 maven 构建了 java-driver 然后导入了外部库...我认为这很简单...这很奇怪代码没有抱怨......这是一个运行时错误
猜你喜欢
  • 2013-04-11
  • 1970-01-01
  • 2013-01-12
  • 2013-04-04
  • 2014-03-09
  • 2016-11-05
  • 2021-12-06
  • 2015-07-15
  • 2016-05-04
相关资源
最近更新 更多