java.io.IOException: org.apache.thrift.protocol.Исключение TProtocolException: не удается записать настройку без установленного значения

#java #hadoop #input #thrift #apache-kafka

#java #hadoop #входные данные #бережливость #апачи-кафка

Вопрос:

Я использую Thrift scheme для хранения пакетов Thrift в виде файла pail в кластере hadoop. Кажется, все работает правильно. Пакет Thrift создается без каких-либо ошибок.

Хотя я использую kafka для отправки пакета, и во время сериализации функция serializer преобразует пакет в массив байтов.На данный момент я получаю вышеупомянутую ошибку. Зачем кафке искать объект bundle для преобразования в байтовый массив. Или есть какой-нибудь способ, чтобы я мог безопасно преобразовать любой объект в байтовый массив.Если да, то не могли бы вы, пожалуйста, предоставить его.Ошибка :

 java.io.IOException: org.apache.thrift.protocol.TProtocolException: Cannot write a TUnion with no set value!
 

ниже приведена функция writeObject, которая выдает ошибку

 private void writeObject(java.io.ObjectOutputStream out)
        throws java.io.IOException {
    try {
        write(new org.apache.thrift.protocol.TCompactProtocol(
                new org.apache.thrift.transport.TIOStreamTransport(out)));
    } catch (org.apache.thrift.TException te) {
        throw new java.io.IOException(te);
    }
}
 

Ответ №1:

Сообщение совершенно ясно: где union -то есть объект, для которого не задано значение. Для объединений Thrift должно быть установлено ровно одно значение.

Пример объединения Thrift см. В вашем файле *.thrift:

 union Foo {
  1: string bar
  2: bool baz
}
 

Это условие, вызвавшее ошибку:

 public void write(TProtocol oprot, TUnion struct) throws TException {
  if (struct.getSetField() == null || struct.getFieldValue() == null) {
    throw new TProtocolException("Cannot write a TUnion with no set value!");
  }

  // ... more code ...
}
 

Не могу определить, что это за объект, из вашего данного кода, вы слишком глубоко в стеке. Посмотрите на вызывающий код writeObject() , затем перейдите вверх. В каком-то месте вашего кода некоторые данные заданы не так, как должны, или значение установлено в null значение, что является незаконным для Thrift. Если вам нужен индикатор для null значений в вашем случае использования, рассмотрите дополнительный логический флаг.

Комментарии:

1. Ошибка возникает не для каждого пакета. Это происходит случайным образом для некоторого случайного пакета. Я также просмотрел данные, сгенерированные во время этой ошибки, и в данных заданы все необходимые переменные.

2. Нет .. я еще не нашел никаких решений. В настоящее время я тестирую его, отправляя json с установкой для каждой требуемой переменной значения null и проверяя источник ошибки!

3. Нет. Я еще не нашел никакого решения. В настоящее время я проверяю, устанавливая требуемые переменные null и пытаясь получить источник ошибки. Любые другие рекомендации будут высоко оценены.

4. @JenG Мне жаль, что я неправильно понял проблему. Пакет Thrift создается без каких-либо ошибок. Хотя я использую kafka для отправки пакета, и во время сериализации функция сериализатора преобразует пакет в массив байтов. На данный момент я получаю вышеупомянутую ошибку. Зачем кафке искать объект bundle для преобразования в массив байтов. Или есть какой-нибудь способ, чтобы я мог безопасно преобразовать любой объект в байтовый массив. Если да, не могли бы вы предоставить его. Большое вам спасибо 🙂

5. Извините, я мало что знаю о Кафке.