Spark Stream-'utf8'编解码器无法解码字节

时间:2018-10-08 12:32:34

标签: python apache-spark pyspark spark-streaming

我对流编程非常陌生。我们有使用Avro的Kafka流。

我想将Kafka Stream连接到Spark Stream。我使用了波纹管代码。

kvs = KafkaUtils.createDirectStream(ssc, [topic], {"metadata.broker.list": brokers})
lines = kvs.map(lambda x: x[1]) 

我遇到了以下错误

  

返回s.decode('utf-8')     文件“ /usr/lib64/python2.7/encodings/utf_8.py”,第16行,在解码中       返回codecs.utf_8_decode(input,errors,True)   UnicodeDecodeError:“ utf8”编解码器无法解码位置57-58中的字节:无效的连续字节

我是否需要指定Kafka使用Avro,是否是上述错误?如果是我该如何指定呢?

2 个答案:

答案 0 :(得分:2)

正确,问题在于流的反序列化。您可以使用confluent-kafka-python库并在:

中指定 valueDecoder
from confluent_kafka.avro.cached_schema_registry_client import CachedSchemaRegistryClient`
from confluent_kafka.avro.serializer.message_serializer import MessageSerializer

kvs = KafkaUtils.createDirectStream(ssc, [topic], {"metadata.broker.list": brokers}, valueDecoder=MessageSerializer.decode_message)`

https://stackoverflow.com/a/49179186/6336337

解决方案提供的积分

答案 1 :(得分:0)

是的,您应该指定它。

使用Java:

创建流:

final JavaInputDStream<ConsumerRecord<String, avroType>> stream =
                KafkaUtils.createDirectStream(
                        jssc,
                        LocationStrategies.PreferConsistent(),
                        ConsumerStrategies.Subscribe(topics, kafkaParams));

在kafka使用者配置中:

kafkaParams.put("key.deserializer", org.apache.kafka.common.serialization.StringDeserializer.class);
        kafkaParams.put("value.deserializer", SpecificAvroDeserializer.class);