KryoException:缓冲区太小

时间:2016-05-25 08:47:59

标签: graph titan gremlin tinkerpop tinkerpop3

我使用Gremlin 3.0.2和Titan 1.0.0。

我发送给Gremlin Server的请求将返回节点列表及其属性。实际上,它是以下项目的列表:

[coverurl:[https://lh3.googleusercontent.com/RYb-duneinq8ClWVLVKknkIx1jOKm64LjreziFApEnkKME8j9tHNDRi9NMA6PK4PTXO7], appname:[Slack], pkgid:[com.Slack]]

在一种情况下,请求将返回38项,如上所述,一切都很好。在另一种情况下,列表将包含56个这些项目,我得到以下例外:

WARN  org.apache.tinkerpop.gremlin.driver.MessageSerializer  - Response [PooledUnsafeDirectByteBuf(ridx: 0, widx: 0, cap: 0)] could not be deserialized by org.apache.tinkerpop.gremlin.driver.ser.GryoMessageSerializerV1d0.
ERROR org.apache.tinkerpop.gremlin.driver.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: Buffer too small: capacity: 0, required: 1
at io.netty.handler.codec.MessageToMessageDecoder.channelRead(MessageToMessageDecoder.java:99)
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:308)
at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:294)

去年已经讨论过这个问题here。但是,对于Titan的不同版本以及将数据写入Titan,而不是像这样的情况下阅读。

我没有看到任何编程方式来调整(De)序列化程序的缓冲区大小,那么处理这个问题的首选方法是什么?另外,将一些限制(哪个?,哪里?)设置为更高的值只能是一个临时解决方案,因为我从来不知道请求将返回多少数据。

无论如何 - 我收到的数据量相当小(可能略高于8500字节)。我很惊讶这个例外被抛出了吗?

1 个答案:

答案 0 :(得分:2)

Titan 1.0基于TinkerPop 3.0.1 ......你是在自己构建Titan吗?

TINKERPOP-817引入了一个允许配置bufferSize参数的修复程序。斯蒂芬在评论中提到:

  

kryo缓冲区大小默认为4096,那些会抛出那个   “缓冲区太小”异常

修复程序进入TinkerPop 3.0.2并记录在案here

为了使用它,您需要将Titan Server升级为使用TinkerPop 3.0.2运行,最好在修改Titan pom.xml中的tinkerpop.version后从源代码重新编译。找到Titan构建方向here。或者,您可以考虑为最新的可用修补程序和TinkerPop 3.1.1(Hadoop 2支持!)构建titan11分支。

接下来,您需要在gremlin-server.yaml配置中的相应序列化程序上配置bufferSize。我认为您不能仅使用客户端配置解决此问题。

serializers:
  - { className: org.apache.tinkerpop.gremlin.driver.ser.GryoMessageSerializerV1d0, config: { bufferSize: 8192, useMapperFromGraph: graph }}       # application/vnd.gremlin-v1.0+gryo

由于你有一个Java客户端而且你希望直接使用Vertex个对象,也许你可以考虑直接连接到Titan并完全避免这种序列化。