2016-05-25 5 views
1

Я использую Gremlin 3.0.2 вместе с Titan 1.0.0.KryoException: буфер слишком маленький

Запрос, отправляемый на сервер Gremlin, вернет список узлов и их свойств. По сути, это список предметов, как следующие:

[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), так что это лучший способ справиться с этой проблемой? Кроме того, установка некоторого ограничения (который ?, где?) На некоторое более высокое значение может быть только временным решением, так как я никогда не знаю, сколько данных будет возвращено запросу.

Anyways - количество данных, которое я получаю, довольно мало (вероятно, чуть больше 8500 байт). Я удивлен, что это исключение вообще брошено?

ответ

2

Titan 1.0 основан на TinkerPop 3.0.1 ... вы строите Титан самостоятельно?

TINKERPOP-817 вводит исправление, которое позволяет настроить параметр bufferSize. Как Стивен упомянул в комментариях:

Kryo размера буфер был дефолт 4096 и будет тем, что проливает «Буфер слишком мало» исключение

Исправление вошло в TinkerPop 3.0.2 и документально here.

Для этого вам необходимо обновить Titan Server для работы с TinkerPop 3.0.2, и лучше было бы перекомпилировать исходный код после изменения в Titan pom.xml. Найдите направления построения Титана here. В качестве альтернативы вы можете рассмотреть возможность построения ветки titan11 для последних доступных исправлений и TinkerPop 3.1.1 (поддержка Hadoop 2!).

Далее вам необходимо настроить bufferSize на соответствующий сериализатор в конфигурации gremlin-server.yaml. Я не думаю, что вы не можете решить эту проблему только с помощью конфигурации клиента.

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

Поскольку у вас есть клиент Java и вы ждете, чтобы работать непосредственно с Vertex объектов, возможно, вы могли бы рассмотреть возможность прямого подключения к Титану и избежать этого сериализации полностью.

+0

Итак, для полноты, как бы настроить это правильно? В моем коде Kotlin (который легко переводится на Java) у меня есть 'val kryo = GryoMapper.build(). AddRegistry (TitanIoRegistry.INSTANCE) .create(); val ser = GryoMessageSerializerV1d0 (крио); val conf = HashMap (); conf.put (TOKEN_BUFFER_SIZE, serializerBufferSize); ser.configure (conf, null) 'где' var TOKEN_BUFFER_SIZE = "bufferSize" и 'var serializerBufferSize = 8192'. По-видимому, это не имеет никакого эффекта. –

+0

обновил мой ответ –