我对流编程非常陌生。我们有使用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,是否是上述错误?如果是我该如何指定呢?
答案 0 :(得分:2)
正确,问题在于流的反序列化。您可以使用confluent-kafka-python库并在:
中指定 valueDecoderfrom 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)`
解决方案提供的积分
答案 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);