Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/379.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何使用Avro和Flink解码卡夫卡信息_Java_Apache Kafka_Avro_Apache Flink - Fatal编程技术网

Java 如何使用Avro和Flink解码卡夫卡信息

Java 如何使用Avro和Flink解码卡夫卡信息,java,apache-kafka,avro,apache-flink,Java,Apache Kafka,Avro,Apache Flink,我正在尝试使用Flink1.0.3从Kafka主题中读取AVRO数据 我只知道这个特别的卡夫卡主题有一个AVRO编码的消息,我有一个AVRO模式文件 我的弗林克密码: 这里是上传到github的文件 AvroDeserializationSchema.java 我认为我的反序列化代码不正确。有人知道我做错了什么吗?这是使用Flink从Kafka读取AVRO数据的方法还是有更好的方法?尝试以下代码来反序列化AVRO记录: Schema a; //Your Avro schema DatumRead

我正在尝试使用
Flink
1.0.3从
Kafka
主题中读取
AVRO
数据

我只知道这个特别的卡夫卡主题有一个AVRO编码的消息,我有一个AVRO模式文件

我的弗林克密码:

这里是上传到github的文件

AvroDeserializationSchema.java


我认为我的反序列化代码不正确。有人知道我做错了什么吗?这是使用Flink从Kafka读取AVRO数据的方法还是有更好的方法?

尝试以下代码来反序列化AVRO记录:

Schema a; //Your Avro schema
DatumReader<GenericData.Record> reader = new GenericDatumReader<GenericData.Record>(a);
GenericData.Record a = reader.read(null, DecoderFactory.get().binaryDecoder(bytes, null));
Schema a//您的Avro模式
DatumReader=新的通用DatumReader(a);
GenericData.Record a=reader.read(null,DecoderFactory.get().binaryDecoder(bytes,null));

根据我的问题,我发布的任何代码都非常有效


问题在于发送到卡夫卡主题的数据,JSON和AVRO格式的数据都发送到了那个里。我订阅了一个不同的卡夫卡主题,其中数据仅在AVRO中,我的代码运行良好。

不,不工作。同样的错误。创建模式的人:
schema schema=new schema.Parser().parse(新文件(“./src/main/resources/rocana.avsc”)如果数据仅为Avro编码,则此操作应有效。你能检查一下你是如何把数据输入卡夫卡的吗。如果您正在使用某个库,那么请阅读相同的编码器。问题是发送到kafka主题的数据,JSON和AVRO格式的数据都发送到了那里。我订阅了一个不同的卡夫卡主题,其中数据仅在AVRO中,我的代码运行良好。@Zeeshan您已经整理好了,请回答您自己的问题好吗?谢谢你确定卡夫卡中的数据是用完全相同的模式版本编码的吗?通过创建
新的SpecificDatumReader(avroType)
您告诉数据读取器
avroType
的模式是读写器模式,我相信如果事实上最初使用不同版本的模式对消息进行编码,您可能会遇到此类异常。是的,模式文件是正确的,我在
logstash
中使用了相同的
schema文件
kafka主题
,它工作得非常完美。
java -jar /path/to/avro-tools-1.8.1.jar compile schema rocana.avsc
import org.apache.avro.io.BinaryDecoder;
import org.apache.avro.io.DatumReader;
import org.apache.avro.io.DecoderFactory;
import org.apache.avro.reflect.ReflectDatumReader;
import org.apache.avro.specific.SpecificDatumReader;
import org.apache.flink.api.common.typeinfo.TypeInformation;
import org.apache.flink.api.java.typeutils.TypeExtractor;
import org.apache.flink.streaming.util.serialization.DeserializationSchema;

public class AvroDeserializationSchema<T> implements DeserializationSchema<T> {

    private static final long serialVersionUID = 4330538776656642778L;

    private final Class<T> avroType;
    private transient DatumReader<T> reader;
    private transient BinaryDecoder decoder;

    public AvroDeserializationSchema(Class<T> avroType) {
        this.avroType = avroType;
    }

    @Override
    public T deserialize(byte[] message) {
        ensureInitialized();
        try {
            decoder = DecoderFactory.get().binaryDecoder(message, decoder);
            return reader.read(null, decoder);
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }

    @Override
    public boolean isEndOfStream(T nextElement) {
        return false;
    }

    @Override
    public TypeInformation<T> getProducedType() {
        return TypeExtractor.getForClass(avroType);
    }

    private void ensureInitialized() {
        if (reader == null) {
            if (org.apache.avro.specific.SpecificRecordBase.class.isAssignableFrom(avroType)) {
                reader = new SpecificDatumReader<T>(avroType);
            } else {
                reader = new ReflectDatumReader<T>(avroType);
            }
        }
    }
}
17:25:30,759 INFO  org.apache.zookeeper.ZooKeeper                                - Session: 0x356350cb9001857 closed
17:25:30,759 INFO  org.apache.zookeeper.ClientCnxn                               - EventThread shut down
17:25:30,761 INFO  org.apache.flink.runtime.taskmanager.Task                     - Source: Custom Source (3/4) switched to FAILED with exception.
java.lang.Exception: 2
    at org.apache.flink.streaming.connectors.kafka.internals.LegacyFetcher.run(LegacyFetcher.java:222)
    at org.apache.flink.streaming.connectors.kafka.FlinkKafkaConsumer08.run(FlinkKafkaConsumer08.java:316)
    at org.apache.flink.streaming.api.operators.StreamSource.run(StreamSource.java:78)
    at org.apache.flink.streaming.runtime.tasks.SourceStreamTask.run(SourceStreamTask.java:56)
    at org.apache.flink.streaming.runtime.tasks.StreamTask.invoke(StreamTask.java:225)
    at org.apache.flink.runtime.taskmanager.Task.run(Task.java:559)
    at java.lang.Thread.run(Unknown Source)
Caused by: java.lang.ArrayIndexOutOfBoundsException: 2
    at org.apache.avro.io.parsing.Symbol$Alternative.getSymbol(Symbol.java:402)
    at org.apache.avro.io.ResolvingDecoder.doAction(ResolvingDecoder.java:290)
    at org.apache.avro.io.parsing.Parser.advance(Parser.java:88)
    at org.apache.avro.io.ResolvingDecoder.readIndex(ResolvingDecoder.java:267)
    at org.apache.avro.generic.GenericDatumReader.read(GenericDatumReader.java:155)
    at org.apache.avro.generic.GenericDatumReader.readField(GenericDatumReader.java:193)
    at org.apache.avro.reflect.ReflectDatumReader.readField(ReflectDatumReader.java:230)
    at org.apache.avro.generic.GenericDatumReader.readRecord(GenericDatumReader.java:183)
    at org.apache.avro.generic.GenericDatumReader.read(GenericDatumReader.java:151)
    at org.apache.avro.generic.GenericDatumReader.read(GenericDatumReader.java:142)
    at com.google.cloud.dataflow.sdk.coders.AvroCoder.decode(AvroCoder.java:274)
    at org.fmr.flink.AvroDeserializationSchema.deserialize(AvroDeserializationSchema.java:52)
    at org.apache.flink.streaming.util.serialization.KeyedDeserializationSchemaWrapper.deserialize(KeyedDeserializationSchemaWrapper.java:39)
    at org.apache.flink.streaming.connectors.kafka.internals.LegacyFetcher$SimpleConsumerThread.run(LegacyFetcher.java:657)
17:25:30,769 INFO  org.apache.flink.runtime.taskmanager.Task                     - Freeing task resources for Source: Custom Source (3/4)
17:25:30,776 INFO  org.apache.flink.runtime.taskmanager.Task                     - Sink: Unnamed (1/4) switched
Schema a; //Your Avro schema
DatumReader<GenericData.Record> reader = new GenericDatumReader<GenericData.Record>(a);
GenericData.Record a = reader.read(null, DecoderFactory.get().binaryDecoder(bytes, null));