我有一个应用程序将序列化的Twitter数据发送到Kafka主题。到目前为止一切都很好。
使用者应用程序应该读取数据并对其进行反序列化。现在,当我调用KafkaUtils.createDirectStream
时,我认为我输入了正确的参数(正如您将在抛出的错误中看到的那样),所以我无法理解为什么它不起作用。
方法createDirectStream(JavaStreamingContext,Class -K-, 类-V-,类-KD-,类-VD-,Map -String,String-,Set -String-)in 类型KafkaUtils不适用于参数 (JavaStreamingContext,Class-String-,Class-Status-, 类-StringDeserializer-,类-StatusDeserializer-, Map-String,String-,Set-String - )
检查星火Javadoc,我的参数似乎仍然适合我。
我的代码是:
Set<String> topics = new HashSet<>();
topics.add("twitter-test");
JavaStreamingContext jssc = new JavaStreamingContext(jsc, new Duration(duration));
Map<String, String> props = new HashMap<>();
//some properties...
JavaPairInputDStream messages = KafkaUtils.createDirectStream(jssc, String.class, Status.class, org.apache.kafka.common.serialization.StringDeserializer.class, stream_data.StatusDeserializer.class, props, topics);
状态序列化代码:
public class StatusSerializer implements Serializer<Status> {
@Override public byte[] serialize(String s, Status o) {
try {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(baos);
oos.writeObject(o);
oos.close();
byte[] b = baos.toByteArray();
return b;
} catch (IOException e) {
return new byte[0];
}
}
@Override public void close() {
}
@Override
public void configure(Map<String, ?> configs, boolean isKey) {
}
}
答案 0 :(得分:1)
看起来问题出在&#34; stream_data.StatusDeserializer.class&#34;。你能取悦这个自定义反序列化器类的代码吗?另外,请您查看Kafka Consumer for Spark written in Scala for Kafka API 0.10: custom AVRO deserializer。
在KafkaParam论证中加入以下内容。
key.deserializer -> classOf[StringDeserializer]
value.deserializer -> classOf[StatusDeserializer]