尝试在远程会话中的两个顶点之间创建边时引发 NegativeArraySizeException 错误
NegativeArraySizeException error is raised when trying to create an edge between two vertexes in remote session
我正在尝试使用连接到远程 JanusGraph 服务器的 gremlin scala 框架在两个顶点之间添加一条边。创建此边缘时,我仍然收到 "org.apache.tinkerpop.shaded.kryo.KryoException: java.lang.NegativeArraySizeException" 错误异常
确实创建了边和顶点,但仍然抛出错误,我无法捕捉到它。
我正在使用 JanusGraph 0.3.1,并尝试使用不同版本的 scala gremlin(3.3、3.4),所有这些都会导致相同的错误。
val serializer = new GryoMessageSerializerV3d0(GryoMapper.build.addRegistry(TinkerIoRegistryV3d0.instance))
val cluster = Cluster.build.addContactPoint("localhost").port(8182).serializer(serializer).create
implicit val graph: ScalaGraph = EmptyGraph.instance.asScala.configure(_.withRemote(DriverRemoteConnection.using(cluster)))
val Founded = Key[String]("founded")
val Distance = Key[Int]("distance")
// create labelled vertex
val paris = graph + "Paris"
// create vertex with typed properties
val london = graph + ("London", Founded -> "43 AD")
// create labelled edges
paris --- ("OneWayRoad", Distance -> 495) --> london
cluster.close()
运行时抛出错误信息
15:34:02.704 [gremlin-driver-loop-1] WARN o.a.t.g.driver.MessageSerializer - Response [PooledUnsafeDirectByteBuf(ridx: 92, widx: 92, cap: 92)] could not be deserialized by org.apache.tinkerpop.gremlin.driver.ser.AbstractGryoMessageSerializerV3d0.
org.apache.tinkerpop.shaded.kryo.KryoException: java.lang.NegativeArraySizeException
Serialization trace:
id (org.apache.tinkerpop.gremlin.structure.util.reference.ReferenceEdge)
at org.apache.tinkerpop.shaded.kryo.serializers.ObjectField.read(ObjectField.java:144)
at org.apache.tinkerpop.shaded.kryo.serializers.FieldSerializer.read(FieldSerializer.java:557)
...
Caused by: java.lang.NegativeArraySizeException: null
at org.apache.tinkerpop.shaded.kryo.io.Input.readBytes(Input.java:325)
[...]
15:34:02.705 [gremlin-driver-loop-1] ERROR o.a.t.g.d.Handler$GremlinResponseHandler - Could not process the response
io.netty.handler.codec.DecoderException: org.apache.tinkerpop.gremlin.driver.ser.SerializationException: org.apache.tinkerpop.shaded.kryo.KryoException: java.lang.NegativeArraySizeException
Serialization trace:
id (org.apache.tinkerpop.gremlin.structure.util.reference.ReferenceEdge)
at io.netty.handler.codec.MessageToMessageDecoder.channelRead(MessageToMessageDecoder.java:98)
[...]
Caused by: org.apache.tinkerpop.gremlin.driver.ser.SerializationException: org.apache.tinkerpop.shaded.kryo.KryoException: java.lang.NegativeArraySizeException
Serialization trace:
id (org.apache.tinkerpop.gremlin.structure.util.reference.ReferenceEdge)
at org.apache.tinkerpop.gremlin.driver.ser.AbstractGryoMessageSerializerV3d0.deserializeResponse(AbstractGryoMessageSerializerV3d0.java:159)
[...]
Caused by: org.apache.tinkerpop.shaded.kryo.KryoException: java.lang.NegativeArraySizeException
Serialization trace:
id (org.apache.tinkerpop.gremlin.structure.util.reference.ReferenceEdge)
at org.apache.tinkerpop.shaded.kryo.serializers.ObjectField.read(ObjectField.java:144)
[...]
Caused by: java.lang.NegativeArraySizeException: null
at org.apache.tinkerpop.shaded.kryo.io.Input.readBytes(Input.java:325)
[...]
调试器告诉我创建边时抛出错误。使用
val edge = g.V(paris).as("a").V(london).addE("test").iterate()
导致同样的错误。
这是我的 gremlin-server.yaml 配置文件
host: 0.0.0.0
port: 8182
scriptEvaluationTimeout: 180000
channelizer: org.apache.tinkerpop.gremlin.server.channel.WebSocketChannelizer
graphs: {
graph: conf/gremlin-server/janusgraph-cql-es-server.properties,
ConfigurationManagementGraph: conf/janusgraph-cql-configurationgraph.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: [scripts/empty-sample.groovy]}}}}
serializers:
- { className: org.apache.tinkerpop.gremlin.driver.ser.GryoMessageSerializerV3d0, config: { ioRegistries: [org.janusgraph.graphdb.tinkerpop.JanusGraphIoRegistry] }}
- { className: org.apache.tinkerpop.gremlin.driver.ser.GryoMessageSerializerV3d0, config: { serializeResultToString: true }}
- { className: org.apache.tinkerpop.gremlin.driver.ser.GraphSONMessageSerializerV3d0, config: { ioRegistries: [org.janusgraph.graphdb.tinkerpop.JanusGraphIoRegistry] }}
# Older serialization versions for backwards compatibility:
- { className: org.apache.tinkerpop.gremlin.driver.ser.GryoMessageSerializerV1d0, config: { ioRegistries: [org.janusgraph.graphdb.tinkerpop.JanusGraphIoRegistry] }}
- { className: org.apache.tinkerpop.gremlin.driver.ser.GryoLiteMessageSerializerV1d0, config: {ioRegistries: [org.janusgraph.graphdb.tinkerpop.JanusGraphIoRegistry] }}
- { className: org.apache.tinkerpop.gremlin.driver.ser.GryoMessageSerializerV1d0, config: { serializeResultToString: true }}
- { className: org.apache.tinkerpop.gremlin.driver.ser.GraphSONMessageSerializerGremlinV2d0, config: { ioRegistries: [org.janusgraph.graphdb.tinkerpop.JanusGraphIoRegistry] }}
- { className: org.apache.tinkerpop.gremlin.driver.ser.GraphSONMessageSerializerGremlinV1d0, config: { ioRegistries: [org.janusgraph.graphdb.tinkerpop.JanusGraphIoRegistryV1d0] }}
- { className: org.apache.tinkerpop.gremlin.driver.ser.GraphSONMessageSerializerV1d0, config: { ioRegistries: [org.janusgraph.graphdb.tinkerpop.JanusGraphIoRegistryV1d0] }}
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 }}
metrics: {
consoleReporter: {enabled: true, interval: 180000},
csvReporter: {enabled: true, interval: 180000, fileName: /tmp/gremlin-server-metrics.csv},
jmxReporter: {enabled: true},
slf4jReporter: {enabled: true, interval: 180000},
gangliaReporter: {enabled: false, interval: 180000, addressingMode: MULTICAST},
graphiteReporter: {enabled: false, interval: 180000}}
maxInitialLineLength: 4096
maxHeaderSize: 8192
maxChunkSize: 8192
maxContentLength: 65536
maxAccumulationBufferComponents: 1024
resultIterationBatchSize: 64
writeBufferLowWaterMark: 32768
writeBufferHighWaterMark: 65536
不使用远程服务器工作时不会出现错误:
implicit val graph: ScalaGraph = EmptyGraph.instance
工作正常。
此问题通常指向与 Gryo 的兼容性问题,该问题通常在 TinkerPop 版本混合时暴露。在大多数情况下,Gryo 倾向于跨版本向后兼容,因此来自 3.3.3 的 Gryo 1.0 将适用于 3.3.4,但在某些情况下并不总是如此(例如,在格式的核心中发现了一个错误并且需要进行重大更改。)
TinkerPop 建议在使用 Gryo 时,将服务器上的 TinkerPop 版本与客户端保持一致。所以 JanusGraph 0.3.1,使用 TinkerPop 3.3.3,因此你的 Gremlin Scala 版本应该是 3.3.3.x(我很确定 Gremlin Scala 将他们的前三个版本号绑定到 TinkerPop 的)。看来你已经试过了,那我们接下来考虑一下你的配置。
我注意到您已经添加了 TinkerIoRegistryV3d0
但由于您使用的是 JanusGraph,您可能还需要添加他们的自定义 IoRegistry
:
GryoMessageSerializerV3d0(GryoMapper.build.addRegistry(JanusGraphIoRegistry.getInstance()))
如果您的用例需要,您可以添加 TinkerIoRegistryV3d0
- 通常仅对返回子图有用。如果 none 解决了问题,那么我唯一的建议是大幅简化:从 Gremlin 服务器配置中删除所有序列化程序配置,除了您正在使用的配置,确保您可以通过一些简单的脚本配置连接到它您的驱动程序仅使用 Gremlin 控制台并记下使连接正常工作的配置,以便您可以将配置移植到 Gremlin Scala。
我看到您目前已将问题隔离到:
val edge = g.V(paris).as("a").V(london).addE("test").iterate()
请注意,由于以下几个原因,此代码并未完全按照我的想法执行:
- 如果你想要边缘回来,你需要
next()
而不是 iterate()
- 这不是在 "paris" 和 "london" 之间添加边 - 它是在 "london" 中添加自引用边。您需要在
addE()
. 之后指定 from()
或 to()
我希望其中的内容有所帮助。
我正在尝试使用连接到远程 JanusGraph 服务器的 gremlin scala 框架在两个顶点之间添加一条边。创建此边缘时,我仍然收到 "org.apache.tinkerpop.shaded.kryo.KryoException: java.lang.NegativeArraySizeException" 错误异常
确实创建了边和顶点,但仍然抛出错误,我无法捕捉到它。 我正在使用 JanusGraph 0.3.1,并尝试使用不同版本的 scala gremlin(3.3、3.4),所有这些都会导致相同的错误。
val serializer = new GryoMessageSerializerV3d0(GryoMapper.build.addRegistry(TinkerIoRegistryV3d0.instance))
val cluster = Cluster.build.addContactPoint("localhost").port(8182).serializer(serializer).create
implicit val graph: ScalaGraph = EmptyGraph.instance.asScala.configure(_.withRemote(DriverRemoteConnection.using(cluster)))
val Founded = Key[String]("founded")
val Distance = Key[Int]("distance")
// create labelled vertex
val paris = graph + "Paris"
// create vertex with typed properties
val london = graph + ("London", Founded -> "43 AD")
// create labelled edges
paris --- ("OneWayRoad", Distance -> 495) --> london
cluster.close()
运行时抛出错误信息
15:34:02.704 [gremlin-driver-loop-1] WARN o.a.t.g.driver.MessageSerializer - Response [PooledUnsafeDirectByteBuf(ridx: 92, widx: 92, cap: 92)] could not be deserialized by org.apache.tinkerpop.gremlin.driver.ser.AbstractGryoMessageSerializerV3d0.
org.apache.tinkerpop.shaded.kryo.KryoException: java.lang.NegativeArraySizeException
Serialization trace:
id (org.apache.tinkerpop.gremlin.structure.util.reference.ReferenceEdge)
at org.apache.tinkerpop.shaded.kryo.serializers.ObjectField.read(ObjectField.java:144)
at org.apache.tinkerpop.shaded.kryo.serializers.FieldSerializer.read(FieldSerializer.java:557)
...
Caused by: java.lang.NegativeArraySizeException: null
at org.apache.tinkerpop.shaded.kryo.io.Input.readBytes(Input.java:325)
[...]
15:34:02.705 [gremlin-driver-loop-1] ERROR o.a.t.g.d.Handler$GremlinResponseHandler - Could not process the response
io.netty.handler.codec.DecoderException: org.apache.tinkerpop.gremlin.driver.ser.SerializationException: org.apache.tinkerpop.shaded.kryo.KryoException: java.lang.NegativeArraySizeException
Serialization trace:
id (org.apache.tinkerpop.gremlin.structure.util.reference.ReferenceEdge)
at io.netty.handler.codec.MessageToMessageDecoder.channelRead(MessageToMessageDecoder.java:98)
[...]
Caused by: org.apache.tinkerpop.gremlin.driver.ser.SerializationException: org.apache.tinkerpop.shaded.kryo.KryoException: java.lang.NegativeArraySizeException
Serialization trace:
id (org.apache.tinkerpop.gremlin.structure.util.reference.ReferenceEdge)
at org.apache.tinkerpop.gremlin.driver.ser.AbstractGryoMessageSerializerV3d0.deserializeResponse(AbstractGryoMessageSerializerV3d0.java:159)
[...]
Caused by: org.apache.tinkerpop.shaded.kryo.KryoException: java.lang.NegativeArraySizeException
Serialization trace:
id (org.apache.tinkerpop.gremlin.structure.util.reference.ReferenceEdge)
at org.apache.tinkerpop.shaded.kryo.serializers.ObjectField.read(ObjectField.java:144)
[...]
Caused by: java.lang.NegativeArraySizeException: null
at org.apache.tinkerpop.shaded.kryo.io.Input.readBytes(Input.java:325)
[...]
调试器告诉我创建边时抛出错误。使用
val edge = g.V(paris).as("a").V(london).addE("test").iterate()
导致同样的错误。 这是我的 gremlin-server.yaml 配置文件
host: 0.0.0.0
port: 8182
scriptEvaluationTimeout: 180000
channelizer: org.apache.tinkerpop.gremlin.server.channel.WebSocketChannelizer
graphs: {
graph: conf/gremlin-server/janusgraph-cql-es-server.properties,
ConfigurationManagementGraph: conf/janusgraph-cql-configurationgraph.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: [scripts/empty-sample.groovy]}}}}
serializers:
- { className: org.apache.tinkerpop.gremlin.driver.ser.GryoMessageSerializerV3d0, config: { ioRegistries: [org.janusgraph.graphdb.tinkerpop.JanusGraphIoRegistry] }}
- { className: org.apache.tinkerpop.gremlin.driver.ser.GryoMessageSerializerV3d0, config: { serializeResultToString: true }}
- { className: org.apache.tinkerpop.gremlin.driver.ser.GraphSONMessageSerializerV3d0, config: { ioRegistries: [org.janusgraph.graphdb.tinkerpop.JanusGraphIoRegistry] }}
# Older serialization versions for backwards compatibility:
- { className: org.apache.tinkerpop.gremlin.driver.ser.GryoMessageSerializerV1d0, config: { ioRegistries: [org.janusgraph.graphdb.tinkerpop.JanusGraphIoRegistry] }}
- { className: org.apache.tinkerpop.gremlin.driver.ser.GryoLiteMessageSerializerV1d0, config: {ioRegistries: [org.janusgraph.graphdb.tinkerpop.JanusGraphIoRegistry] }}
- { className: org.apache.tinkerpop.gremlin.driver.ser.GryoMessageSerializerV1d0, config: { serializeResultToString: true }}
- { className: org.apache.tinkerpop.gremlin.driver.ser.GraphSONMessageSerializerGremlinV2d0, config: { ioRegistries: [org.janusgraph.graphdb.tinkerpop.JanusGraphIoRegistry] }}
- { className: org.apache.tinkerpop.gremlin.driver.ser.GraphSONMessageSerializerGremlinV1d0, config: { ioRegistries: [org.janusgraph.graphdb.tinkerpop.JanusGraphIoRegistryV1d0] }}
- { className: org.apache.tinkerpop.gremlin.driver.ser.GraphSONMessageSerializerV1d0, config: { ioRegistries: [org.janusgraph.graphdb.tinkerpop.JanusGraphIoRegistryV1d0] }}
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 }}
metrics: {
consoleReporter: {enabled: true, interval: 180000},
csvReporter: {enabled: true, interval: 180000, fileName: /tmp/gremlin-server-metrics.csv},
jmxReporter: {enabled: true},
slf4jReporter: {enabled: true, interval: 180000},
gangliaReporter: {enabled: false, interval: 180000, addressingMode: MULTICAST},
graphiteReporter: {enabled: false, interval: 180000}}
maxInitialLineLength: 4096
maxHeaderSize: 8192
maxChunkSize: 8192
maxContentLength: 65536
maxAccumulationBufferComponents: 1024
resultIterationBatchSize: 64
writeBufferLowWaterMark: 32768
writeBufferHighWaterMark: 65536
不使用远程服务器工作时不会出现错误:
implicit val graph: ScalaGraph = EmptyGraph.instance
工作正常。
此问题通常指向与 Gryo 的兼容性问题,该问题通常在 TinkerPop 版本混合时暴露。在大多数情况下,Gryo 倾向于跨版本向后兼容,因此来自 3.3.3 的 Gryo 1.0 将适用于 3.3.4,但在某些情况下并不总是如此(例如,在格式的核心中发现了一个错误并且需要进行重大更改。)
TinkerPop 建议在使用 Gryo 时,将服务器上的 TinkerPop 版本与客户端保持一致。所以 JanusGraph 0.3.1,使用 TinkerPop 3.3.3,因此你的 Gremlin Scala 版本应该是 3.3.3.x(我很确定 Gremlin Scala 将他们的前三个版本号绑定到 TinkerPop 的)。看来你已经试过了,那我们接下来考虑一下你的配置。
我注意到您已经添加了 TinkerIoRegistryV3d0
但由于您使用的是 JanusGraph,您可能还需要添加他们的自定义 IoRegistry
:
GryoMessageSerializerV3d0(GryoMapper.build.addRegistry(JanusGraphIoRegistry.getInstance()))
如果您的用例需要,您可以添加 TinkerIoRegistryV3d0
- 通常仅对返回子图有用。如果 none 解决了问题,那么我唯一的建议是大幅简化:从 Gremlin 服务器配置中删除所有序列化程序配置,除了您正在使用的配置,确保您可以通过一些简单的脚本配置连接到它您的驱动程序仅使用 Gremlin 控制台并记下使连接正常工作的配置,以便您可以将配置移植到 Gremlin Scala。
我看到您目前已将问题隔离到:
val edge = g.V(paris).as("a").V(london).addE("test").iterate()
请注意,由于以下几个原因,此代码并未完全按照我的想法执行:
- 如果你想要边缘回来,你需要
next()
而不是iterate()
- 这不是在 "paris" 和 "london" 之间添加边 - 它是在 "london" 中添加自引用边。您需要在
addE()
. 之后指定
from()
或 to()
我希望其中的内容有所帮助。