如何禁用或正确配置JanusGraph连接Cassandra的表压缩?
在Kubernetes环境中运行JanusGraph 1.0.0,连接Cassandra 5.0.0-jammy集群,两台Cassandra节点运行正常,但JanusGraph容器启动时抛出压缩配置相关错误。遍查Cassandra、JanusGraph及Gremlin Server文档,未找到compression.class属性的相关说明,仅找到Cassandra表压缩的相关参考。
尝试了以下多种表压缩相关配置组合,均无效:
V1
storage.cql.compression=false storage.cql.compression-type=
V2
root.storage.cql.compression=false root.storage.cql.compression-type=
V3
storage.cql.compression=true storage.cql.compression-type=LZ4Compressor
V4
root.storage.cql.compression=true root.storage.cql.compression-type=LZ4Compressor
抛出的错误
Caused by:
com.datastax.oss.driver.api.core.servererrors.InvalidConfigurationInQueryException:
Missing sub-option 'class' for the 'compression' option. at
com.datastax.oss.driver.api.core.servererrors.InvalidConfigurationInQueryException.copy(InvalidConfigurationInQueryException.java:52)
~[java-driver-core-4.17.0.jar:?] at
com.datastax.oss.driver.internal.core.util.concurrent.CompletableFutures.getUninterruptibly(CompletableFutures.java:149)
~[java-driver-core-4.17.0.jar:?] at
com.datastax.oss.driver.internal.core.cql.CqlRequestSyncProcessor.process(CqlRequestSyncProcessor.java:53)
~[java-driver-core-4.17.0.jar:?] at
com.datastax.oss.driver.internal.core.cql.CqlRequestSyncProcessor.process(CqlRequestSyncProcessor.java:30)
~[java-driver-core-4.17.0.jar:?] at
com.datastax.oss.driver.internal.core.session.DefaultSession.execute(DefaultSession.java:230)
~[java-driver-core-4.17.0.jar:?] at
com.datastax.oss.driver.api.core.cql.SyncCqlSession.execute(SyncCqlSession.java:54)
~[java-driver-core-4.17.0.jar:?] at
org.janusgraph.diskstorage.cql.CQLKeyColumnValueStore.initializeTable(CQLKeyColumnValueStore.java:311)
~[janusgraph-cql-1.0.0.jar:?] at
org.janusgraph.diskstorage.cql.CQLKeyColumnValueStore.(CQLKeyColumnValueStore.java:189)
~[janusgraph-cql-1.0.0.jar:?] at
org.janusgraph.diskstorage.cql.CQLStoreManager.lambda$openDatabase$7(CQLStoreManager.java:308)
~[janusgraph-cql-1.0.0.jar:?] at
java.util.concurrent.ConcurrentHashMap.computeIfAbsent(Unknown Source)
~[?:?] at
org.janusgraph.diskstorage.cql.CQLStoreManager.openDatabase(CQLStoreManager.java:308)
~[janusgraph-cql-1.0.0.jar:?]
相关配置文件
janusgraph-gremlin-server.yaml
host: 0.0.0.0 port: 8182 evaluationTimeout: 30000 channelizer: org.apache.tinkerpop.gremlin.server.channel.WebSocketChannelizer graphManager: org.janusgraph.graphdb.management.JanusGraphManager graphs: { ConfigurationManagementGraph: /etc/opt/janusgraph/janusgraph.properties } scriptEngines: { gremlin-groovy: { plugins: { org.janusgraph.graphdb.tinkerpop.plugin.JanusGraphGremlinPlugin: {}, org.apache.tinkerpop.gremlin.server.jsr223.GremlinServerGremlinPlugin: {}, org.apache.tinkerpop.gremlin.tinkergraph.jsr223.TinkerGraphGremlinPlugin: {}, org.apache.tinkerpop.gremlin.jsr223.ImportGremlinPlugin: {classImports: [java.lang.Math], methodImports: [java.lang.Math#*]}, org.apache.tinkerpop.gremlin.jsr223.ScriptFileGremlinPlugin: {files: []}}}} serializers: - { className: org.apache.tinkerpop.gremlin.util.ser.GraphBinaryMessageSerializerV1, config: { ioRegistries: [org.janusgraph.graphdb.tinkerpop.JanusGraphIoRegistry] }} - { className: org.apache.tinkerpop.gremlin.util.ser.GraphBinaryMessageSerializerV1, config: { serializeResultToString: true }} - { className: org.apache.tinkerpop.gremlin.util.ser.GraphSONMessageSerializerV3, config: { ioRegistries: [org.janusgraph.graphdb.tinkerpop.JanusGraphIoRegistry] }} processors: - { className: org.apache.tinkerpop.gremlin.server.op.session.SessionOpProcessor, config: { sessionTimeout: 28800000 }} - { className: org.apache.tinkerpop.gremlin.server.op.traversal.TraversalOpProcessor, config: { cacheExpirationTime: 600000, cacheMaxSize: 1000 }}
janusgraph.properties文件
gremlin.graph=org.janusgraph.core.ConfiguredGraphFactory graph.graphname=ConfigurationManagementGraph storage.backend=cql storage.hostname=cassandra storage.cql.local-datacenter=DC1 cache.db-cache=true cache.db-cache-clean-wait=20 cache.db-cache-time=191000 cache.db-cache-size=0.5
解决方案
这个错误的核心原因是JanusGraph 1.0.0使用的DataStax Java Driver(4.17.0)与Cassandra 5.0的压缩配置语法不兼容。Cassandra 5.0修改了表压缩的配置语法,要求必须显式指定class子选项,而JanusGraph默认生成的建表CQL语句没有适配这个新语法。
提供以下三种解决思路:
降级Cassandra版本:将Cassandra集群降级到4.x版本,JanusGraph 1.0.0对Cassandra 4.x的兼容性经过验证,不会出现此类语法适配问题,这是最快捷的解决方式。
指定完整压缩配置参数:在
janusgraph.properties中使用storage.cql.compression-options替代旧的storage.cql.compression和storage.cql.compression-type配置,传递符合Cassandra 5.0要求的完整压缩配置,示例:
storage.cql.compression-options={"class": "LZ4Compressor"}
注意需确保JanusGraph能正确解析该配置并生成合法的CQL语句。
- 修改JanusGraph源码适配:如果需要保留Cassandra 5.0版本,可修改JanusGraph的CQL存储模块(
CQLKeyColumnValueStore.java)中初始化表的逻辑,手动调整建表语句的压缩配置部分,添加class指定,之后重新编译打包JanusGraph。
内容的提问来源于stack exchange,提问作者gph

