尝试在远程会话中的两个顶点之间创建边时,引发NegativeArraySizeException错误

时间:2019-04-01 14:17:20

标签: scala gremlin janusgraph

我正在尝试使用连接到远程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

工作正常。

1 个答案:

答案 0 :(得分:0)

此问题通常指向与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-通常仅对返回子图有用。如果这些方法都不能解决问题,那么我的唯一建议就是大幅简化:从Gremlin Server配置中删除所有序列化程序配置(除了正在使用的配置程序之外),请确保可以使用一些简单的脚本连接到该序列化程序,而只需使用Gremlin Console,并记下该配置是什么使连接起作用,以便您可以将配置移植到Gremlin Scala。

我看到您目前已将问题隔离到:

val edge = g.V(paris).as("a").V(london).addE("test").iterate()

请注意,由于以下几个原因,此代码无法完全满足我的要求:

  1. 如果想要边缘退回,则需要next()而不是iterate()
  2. 这并没有在“巴黎”和“伦敦”之间添加边-在“伦敦”上添加了自引用边。您需要在from()之后指定to()addE()

我希望那里有帮助。