尝试使用dsbulk从AWS密钥空间卸载数据或对数据进行计数时出错。
错误:
Operation COUNT_20221021-192729-813222 failed: Token metadata not present.
命令列:
$ dsbulk count/unload -k my_best_storage -t book_awards -f ./dsbulk_keyspaces.conf
设定:
datastax-java-driver {
basic.contact-points = [ "cassandra.us-east-2.amazonaws.com:9142"]
advanced.auth-provider {
class = PlainTextAuthProvider
username = "aw.keyspaces-at-XXX"
password = "XXXX"
}
basic.load-balancing-policy {
local-datacenter = "us-east-2"
}
basic.request {
consistency = LOCAL_QUORUM
default-idempotence = true
}
advanced {
request{
log-warnings = true
}
ssl-engine-factory {
class = DefaultSslEngineFactory
truststore-path = "./cassandra_truststore.jks"
truststore-password = "XXX"
hostname-validation = false
}
metadata {
token-map.enabled = false
}
}
}
dsbulk load -加载操作员工作正常...
1条答案
按热度按时间cyvaqqii1#
我怀疑这里的问题是你的集群使用了专有的
com.amazonaws.cassandra.DefaultPartitioner
分区程序,大多数开源工具和驱动程序都不识别它。DataStax Bulk Loader(DSBulk)工具在后台使用Cassandra Java driver连接到Cassandra群集。Java驱动程序使用分区程序确定哪些节点拥有令牌[范围]。仅支持以下Cassandra分区程序:
Murmur3Partitioner
个RandomPartitioner
ByteOrderedPartitioner
由于Java驱动程序不知道
DefaultPartitioner
,因此它没有令牌范围所有者的Map(令牌元数据),因此无法确定如何“拆分”Cassandra环以查询节点。正如您已经发现的,这不会影响
load
命令,因为它只是将写操作发送给协调器,并让协调器确定数据是如何分区的。但是对于需要读操作的unload
和count
命令,Java驱动程序无法确定使用不受支持的分区器为子范围查询选择哪个协调器。作为一种解决方法,您可以尝试使用以下命令禁用令牌感知:
但是我没有可以测试的AWS Keyspaces集群,我怀疑它是否能工作。无论如何,欢迎您尝试。
有一个未完成的DSBulk功能请求提供完全禁用令牌感知的能力(内部票证IDDAT-622),但在编写时尚未分配,因此我无法提供任何关于何时将优先考虑它的期望。干杯!