janusgraph - Janusgraph 0.3.0 Tinkerpop 3.3.3 java - 使用 GryoMessageSerializerV3d0 添加 Edge 后出现序列化错误
问题描述
在 Java 中添加边后出现以下错误:
16:40:44.267 [gremlin-driver-loop-1] WARN org.apache.tinkerpop.gremlin.driver.MessageSerializer - 响应 [PooledUnsafeDirectByteBuf(ridx: 98, widx: 98, cap: 98)] 无法被 org 反序列化.apache.tinkerpop.gremlin.driver.ser.AbstractGryoMessageSerializerV3d0。org.apache.tinkerpop.shaded.kryo.KryoException:遇到未注册的类 ID:65536 序列化跟踪:org.apache.tinkerpop.gremlin.structure 的 id (org.apache.tinkerpop.gremlin.structure.util.reference.ReferenceEdge)。 io.gryo.AbstractGryoClassResolver.readClass(AbstractGryoClassResolver.java:148)
Janusgraph版本为0.3.0,Tinkerpop版本为3.3.3,Janusgraph序列化配置如下:
> 序列化程序:- { className:org.apache.tinkerpop.gremlin.driver.ser.GryoMessageSerializerV3d0,配置:{ ioRegistries:[org.janusgraph.graphdb.tinkerpop.JanusGraphIoRegistry] }} - { className:org.apache.tinkerpop.gremlin .driver.ser.GryoMessageSerializerV3d0,配置:{serializeResultToString:真}} - {类名:org.apache.tinkerpop.gremlin.driver.ser.GraphSONMessageSerializerV3d0,配置:{ioRegistries:[org.janusgraph.graphdb.tinkerpop.JanusGraphIoRegistry]} } # 用于向后兼容的旧序列化版本: - { className: org.apache.tinkerpop.gremlin.driver.ser.GryoMessageSerializerV1d0, config: { ioRegistries: [org.janusgraph.graphdb.tinkerpop.JanusGraphIoRegistry] }} - { className: org .apache.tinkerpop.gremlin.driver.ser.GryoLiteMessageSerializerV1d0,配置:{ioRegistries:[org.janusgraph。graphdb.tinkerpop.JanusGraphIoRegistry] }} - { className:org.apache.tinkerpop.gremlin.driver.ser.GryoMessageSerializerV1d0,配置:{ serializeResultToString:true }} - { className:org.apache.tinkerpop.gremlin.driver.ser。 GraphSONMessageSerializerGremlinV2d0,配置:{ioRegistries:[org.janusgraph.graphdb.tinkerpop.JanusGraphIoRegistry]}} - {类名:org.apache.tinkerpop.gremlin.driver.ser.GraphSONMessageSerializerGremlinV1d0,配置:{ioRegistries:[org.janusgraph.graphdb. tinkerpop.JanusGraphIoRegistryV1d0] }} - {类名:org.apache.tinkerpop.gremlin.driver.ser.GraphSONMessageSerializerV1d0,配置:{ ioRegistries:[org.janusgraph.graphdb.tinkerpop.JanusGraphIoRegistryV1d0] }}{ serializeResultToString: true }} - { className: org.apache.tinkerpop.gremlin.driver.ser.GraphSONMessageSerializerGremlinV2d0,配置:{ ioRegistries: [org.janusgraph.graphdb.tinkerpop.JanusGraphIoRegistry] }} - { className: org.apache。 tinkerpop.gremlin.driver.ser.GraphSONMessageSerializerGremlinV1d0,配置:{ioRegistries:[org.janusgraph.graphdb.tinkerpop.JanusGraphIoRegistryV1d0]}} - {类名:org.apache.tinkerpop.gremlin.driver.ser.GraphSONMessageSerializerV1d0,配置:{ioRegistries : [org.janusgraph.graphdb.tinkerpop.JanusGraphIoRegistryV1d0] }}{ serializeResultToString: true }} - { className: org.apache.tinkerpop.gremlin.driver.ser.GraphSONMessageSerializerGremlinV2d0,配置:{ ioRegistries: [org.janusgraph.graphdb.tinkerpop.JanusGraphIoRegistry] }} - { className: org.apache。 tinkerpop.gremlin.driver.ser.GraphSONMessageSerializerGremlinV1d0,配置:{ioRegistries:[org.janusgraph.graphdb.tinkerpop.JanusGraphIoRegistryV1d0]}} - {类名:org.apache.tinkerpop.gremlin.driver.ser.GraphSONMessageSerializerV1d0,配置:{ioRegistries : [org.janusgraph.graphdb.tinkerpop.JanusGraphIoRegistryV1d0] }}GraphSONMessageSerializerGremlinV1d0,配置:{ioRegistries:[org.janusgraph.graphdb.tinkerpop.JanusGraphIoRegistryV1d0]}} - {类名:org.apache.tinkerpop.gremlin.driver.ser.GraphSONMessageSerializerV1d0,配置:{ioRegistries:[org.janusgraph.graphdb。 tinkerpop.JanusGraphIoRegistryV1d0] }}GraphSONMessageSerializerGremlinV1d0,配置:{ioRegistries:[org.janusgraph.graphdb.tinkerpop.JanusGraphIoRegistryV1d0]}} - {类名:org.apache.tinkerpop.gremlin.driver.ser.GraphSONMessageSerializerV1d0,配置:{ioRegistries:[org.janusgraph.graphdb。 tinkerpop.JanusGraphIoRegistryV1d0] }}
大约同时在服务器上记录了以下错误,并且似乎是相关的:
> 105869 2018-11-08 06:10:44,659 [gremlin-server-worker-1] 警告 io.netty.channel.DefaultChannelPipeline - 触发了 exceptionCaught() 事件,它到达了管道的尾部。这通常意味着管道中的最后一个处理程序没有处理异常。java.io.IOException:连接由 sun.nio.ch.FileDispatcherImpl.read0 处的对等方重置(本机方法)
据我所见,我的鸭子在匹配的序列化程序版本方面排成一列,但显然一定错过了一些东西。非常感谢任何帮助!
代码可以在这里看到: https ://gist.github.com/ptclarke/45472fa5c268a6e8441e4c35615194aa
解决方案
我认为您需要JanusGraphIoRegistry
在客户端注册:
GryoMapper.Builder builder = GryoMapper.build().
addRegistry(JanusGraphIoRegistry.getInstance());
GryoMessageSerializerV3d0 serializer = new GryoMessageSerializerV3d0(builder);
Cluster cluster = Cluster.build().
addContactPoint(host).
port(port).
serializer(serializer).
create();
作为对您的代码的一些额外建议。考虑避免大量像这样的小更新:
public void updateVertex(Vertex v, Map<Object, Object> propertyMap) {
for(Entry<Object, Object> e : propertyMap.entrySet()) {
g.V(v).property(e.getKey(), e.getValue()).next();
}
}
而是这样做:
public void updateVertex(Vertex v, Map<Object, Object> propertyMap) {
GraphTraversal<Vertex,Vertex> t = g.V(v);
for(Entry<Object, Object> e : propertyMap.entrySet()) {
t = t.property(e.getKey(), e.getValue());
}
t.iterate();
}
您还可以简化“添加边缘”代码:
public Edge addEdge(String label, Vertex from, Vertex to) {
return g.V(from).addE(label).to(to).next();
}
推荐阅读
- matlab - 读取大量数据的最佳方式
- c# - 按子字符串将字符串列表排序到Excel工作表中
- c - 如何在 Linux 中定义具有非默认返回类型的系统调用?
- python-3.x - 如何指定 gspread 在运行 import_csv 函数以分隔字段时使用的分隔符?
- select - 如何使用 yq 根据子键值选择所有 YAML 键?
- python - 将什么 python 集合发送到 winrt `Windows.Storage.Streams.DataReader` readbytes() 方法?
- reactjs - Google Analytics/React GA:History 对象随着每次位置变化发送越来越多的点击
- python - 使用计算机视觉进行距离测量
- python - 不确定 CSV 文件是否使用 csv.writer 编码为 utf-8
- javascript - NodeJS 14.x - 原生 AWS Lambda 导入/导出支持