#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. Извините, я мало что знаю о Кафке.