Apache Atlas对接CosmosDB Cassandra API启动触发空指针异常排查
问题描述
尝试搭建Apache Atlas与CosmosDB Cassandra API的对接环境,设置默认一致性级别为Strong。启动约10秒后触发空指针异常,日志如下:
2023-12-19 08:23:29,335 DEBUG - [main:] ~ ==> AtlasTypeRegistry.addTypesWithNoRefResolve(length=0) (AtlasTypeRegistry$AtlasTransientTypeRegistry:789) 2023-12-19 08:23:29,335 DEBUG - [main:] ~ <== AtlasTypeRegistry.addTypesWithNoRefResolve(length=0) (AtlasTypeRegistry$AtlasTransientTypeRegistry:800) 2023-12-19 08:23:29,336 DEBUG - [main:] ~ <== lockTypeRegistryForUpdate() (AtlasTypeRegistry$TypeRegistryUpdateSynchronizer:981) 2023-12-19 08:23:29,338 DEBUG - [main:] ~ ==> AtlasEnumDefStoreV2.getAll() (AtlasEnumDefStoreV2:99) 2023-12-19 08:23:29,345 DEBUG - [main:] ~ Executing: OrCondition [andExprs=AndExpr [predicates=[HasTerm [propertyName=__type, op=EQUAL, value=typeSystem], HasTerm [propertyName=__type.category, op=EQUAL, value=ENUM]]]] (TinkerpopGraphQuery:129) 2023-12-19 08:23:29,443 ERROR - [main:] ~ !!! error while getting AtlasEnumDef (AtlasEnumDefStoreV2:111) java.lang.NullPointerException at org.janusgraph.graphdb.transaction.StandardJanusGraphTx.verifyAttribute(StandardJanusGraphTx.java:636) at org.janusgraph.graphdb.query.QueryUtil.addConstraint(QueryUtil.java:329) at org.janusgraph.graphdb.query.QueryUtil.constraints2QNF(QueryUtil.java:233) at org.janusgraph.graphdb.query.graph.GraphCentricQueryBuilder.constructQueryWithoutProfile(GraphCentricQueryBuilder.java:271) at org.janusgraph.graphdb.query.graph.GraphCentricQueryBuilder.constructQuery(GraphCentricQueryBuilder.java:255) at org.janusgraph.graphdb.query.graph.GraphCentricQueryBuilder.vertices(GraphCentricQueryBuilder.java:225) at org.apache.atlas.repository.graphdb.janus.query.NativeJanusGraphQuery.vertices(NativeJanusGraphQuery.java:65) at org.apache.atlas.repository.graphdb.tinkerpop.query.TinkerpopGraphQuery.vertices(TinkerpopGraphQuery.java:137) at org.apache.atlas.repository.store.graph.v2.AtlasTypeDefGraphStoreV2.findTypeVerticesByCategory(AtlasTypeDefGraphStoreV2.java:164) at org.apache.atlas.repository.store.graph.v2.AtlasEnumDefStoreV2.getAll(AtlasEnumDefStoreV2.java:102) at org.apache.atlas.repository.store.graph.AtlasTypeDefGraphStore.init(AtlasTypeDefGraphStore.java:102) at org.apache.atlas.repository.store.graph.v2.AtlasTypeDefGraphStoreV2.init(AtlasTypeDefGraphStoreV2.java:118)
CosmosDB Cassandra Explorer中可见部分表已创建,但使用普通Cassandra实例时环境可正常运行。
异常原因
- 一致性级别不兼容:CosmosDB Cassandra API的
Strong一致性与JanusGraph(Atlas底层依赖的图数据库)的查询逻辑存在冲突。JanusGraph查询元数据时依赖Cassandra的底层特性,而CosmosDB强一致性模式下,部分元数据加载逻辑未正确初始化,导致属性验证时触发空指针。 - 元数据同步延迟:CosmosDB的表创建是异步的,虽然Explorer显示表已存在,但实际元数据未完全同步到JanusGraph的查询上下文,查询时无法找到对应属性定义,引发
verifyAttribute方法空指针。 - 适配性问题:普通Cassandra是原生实现,而CosmosDB是兼容Cassandra API的托管服务,JanusGraph的部分底层查询逻辑未适配CosmosDB特性,比如属性约束处理在CosmosDB环境下返回空值。
解决方法
- 调整一致性级别:将CosmosDB Cassandra API的默认一致性级别从
Strong改为Session或LocalQuorum,既保证数据一致性,又兼容JanusGraph查询逻辑。 - 添加JanusGraph适配配置:在Atlas的
janusgraph.properties文件中添加以下配置:janusgraph.storage.cassandra.consistency-level=LOCAL_QUORUM janusgraph.storage.cassandra.read-consistency-level=LOCAL_QUORUM janusgraph.storage.cassandra.write-consistency-level=LOCAL_QUORUM janusgraph.storage.cassandra.skip-schema-validation=true - 延迟Atlas启动:修改Atlas启动脚本,在启动前先执行简单的Cassandra查询(如查询系统表)验证CosmosDB表元数据是否完全同步,确认可用后再启动Atlas。
- 清理残留表结构:删除CosmosDB中已创建的JanusGraph相关表,重新启动Atlas,让JanusGraph重新初始化完整的表结构,避免残留的不完整元数据引发问题。
内容的提问来源于stack exchange,提问作者Kumar Sambhav
相关产品推荐
相关产品推荐

