kafkaStream = KafkaUtils.createStream(
ssc,
'zookeeperserver1.sys.net:2181,zookeeperserver2.sys.net:2181,zookeeperserver3.sys.net:2181,zookeeperserver4.sys.net:2181,zookeeperserver5.sys.net:2181,zookeeperserver6.sys.net:2181',
'spark-streaming23',
{'topic-name':3})
lines = kafkaStream.map(lambda x: x[1])
lines.pprint()
ssc.start()
ssc.awaitTermination()
文件“/usr/lib64/python2.7/encodings/utf_8.py”,第16行,在解码中返回codecs.utf_8_decode(输入,错误,True)UnicodeDecodeError:'utf8'编解码器无法解码字节0xff位置0:无效的起始字节
答案 0 :(得分:2)
看起来键或值都不是UTF-8编码的。 createStream
和createDirectStream
都需要另外两个参数:
- keyDecoder - 用于解码密钥的函数(默认为utf8_decoder)
- valueDecoder - 用于解码值的函数(默认为utf8_decoder)
如您所见,两者都默认为utf8_decoder
。如果
您知道其中一个或两个都不是有效的UTF-8字符串,您可以提供自己的解码器,或只使用身份函数来获取原始输入:
KafkaUtils.createStream(
ssc, ..., keyDecoder=lambda x: x, valueDecoder=lambda x: x
)
如果您怀疑某些格式错误的条目存在问题,则可以将现有的decoder
替换为一个处理解码异常的问题。围绕这些线的东西应该可以解决问题:
from pyspark.streaming.kafka import utf8_decoder
def safe_utf8_decode(s):
try:
return utf8_decoder(s)
except UnicodeDecodeError:
pass
话虽如此,除非您寻找更高级的应用程序,DStreams
仍然无法替代,否则我建议Structured Streaming。