【发布时间】:2015-11-01 12:54:59
【问题描述】:
我有一个在早期 Cassandra 版本中创建和定义的 Cassandra 进程。到目前为止,我们使用了一个 hector 驱动程序来连接它。我正在将驱动程序更改为 DataStax 以享受 CQL 的新功能并允许异步访问。
我在进行过渡的过程中遇到了一些问题。我已经阅读了this upgrade guide,尽管我仍然遇到一些问题,但它提供了一些启示。
最大的问题是我无法使用大于 1 的协议版本访问密钥空间。当我尝试以下 python 代码时:
cass4 = Cluster(['MyIp'])
cass4.protocol_version = 2
session = cass4.connect('myKeySpace')
此代码产生以下错误和警告:
ERROR:cassandra.connection:Closing connection <AsyncoreConnection(4849045328) IP:9042> due to protocol error: code=000a [Protocol error] message="Invalid or unsupported protocol version: 2"
WARNING:cassandra.cluster:Downgrading core protocol version from 2 to 1 for IP
WARNING:cassandra.metadata:Building table metadata with no column meta for keyspace
使用 Java 驱动程序,如果我尝试使用大于 1 的协议版本进行连接,我只会收到 NoHostAvailableException: All host(s) tried for query failed 连接错误。
这个连接问题让我在构建合适的 Java DAO 时遇到了很多麻烦。例如,如果我尝试进行批量更新,例如:
BatchStatment batch = new BatchStatement()
batch.add(somePreparedStatement)
cqlSession.executeAsync(batch)
我收到以下错误:
com.datastax.driver.core.exceptions.UnsupportedFeatureException: Unsupported feature with the native protocol version 1 (which is currently in use): Protocol level batching is not supported
使用 cqlsh 直接在集群节点上运行“BEGIN BATCH..”操作是可行的,所以我知道这个 CQL 命令可以执行,但我不知道如何在 Java 中准备它并使用协议版本 1 执行它。另外,集群中的 cassandra 和 CQL 版本似乎很合适:
[cqlsh 3.1.7 | Cassandra 1.2.13.2 | CQL spec 3.0.0 | Thrift protocol 19.36.2]
所以,问题是:
- 为什么会这样?
- 我可以使用大于 1 的协议版本连接到该密钥空间吗?
- 如果没有,我可以绕过这个批量更新问题吗?
【问题讨论】:
-
这是否适用于全新的键空间?您使用的是哪个 Cassandra 版本?
-
我正在使用 Cassandra 1.2.13.2。我会在一个全新的键空间上尝试代码并让你知道..
标签: java python cassandra cql datastax