如何在其中具有blob数据类型的复合分区键的getendpoints

问题描述:

我有一个选择查询是超时,所以我试图使用一致性查询使用跟踪启用,以便read_repair将修复它,但没有帮助很大,并保持一致,所有我在9中得到3个回应;所以我决定识别分区并对其进行修复,但是当我在具有blob数据类型的复合分区键上运行getendpoints时,它引发异常“java.lang.NumberFormatException:非十六进制字符”我也尝试使用cql中的标记选择也超时的语句。我如何识别分区并修复它?如何在其中具有blob数据类型的复合分区键的getendpoints

如果你只是运行修复所有分区将被修复。要修复一个单独的分区,只需使用CL.ALL来读取它,并阅读修复将修复任何差异。

这就是说。

nodetool getendpoints需要令牌不是分区键。 murmur3分区器需要一个很长的标记,所以一个大的blob不会工作。你可以用CQL获得类似于

select token(k1, k2 ...) from table where ... 

它会给你一个令牌。另外,你可以从大多数驱动程序(java驱动程序:cluster.getMetadata().newToken(string))或从Cassandra的java api本身获取令牌(new Murmur3Partitioner().getToken(bytebuffer)

+0

我试过问题陈述中提到的cql,但查询超时。看起来唯一能够通过的方法是从驱动程序获取,但是当查询该分区的select语句时,它自己看到超时的驱动程序会尝试并查看是否有帮助。 – user6288321

+0

它超时更可能是由于是一个广泛的分区或太多的墓碑fwiw,不太可能修复它会有所帮助。尝试与'TRACING ON'查询 –

+0

是的我怀疑是一样的,但问题是因为查询超时甚至启用跟踪没有太大的帮助。 – user6288321