Apache kafka 如何将Spark流(Dstream/JavaDStream)写入Kafka?
我用以下最新的maven工件尝试了这段Java代码。 以及前一份—— 但下面的代码不允许我使用Java1.8和最新的IDE进行编译 ---进口部--Apache kafka 如何将Spark流(Dstream/JavaDStream)写入Kafka?,apache-kafka,spark-streaming,Apache Kafka,Spark Streaming,我用以下最新的maven工件尝试了这段Java代码。 以及前一份—— 但下面的代码不允许我使用Java1.8和最新的IDE进行编译 ---进口部-- Map producerConfig=new HashMap(); producerConfig.put(“bootstrap.servers”,“localhost:9092”); producerConfig.put(“key.serializer”,StringSerializer.class); producerConfig.put(“v
Map producerConfig=new HashMap();
producerConfig.put(“bootstrap.servers”,“localhost:9092”);
producerConfig.put(“key.serializer”,StringSerializer.class);
producerConfig.put(“value.serializer”,StringSerializer.class);
KafkaWriter KafkaWriter=新的数据流KafkaWriter(lines.dstream(),scala.reflect.ClassTag$.MODULE$.apply(String.class));
函数1 f=新的MyFunc(){
@凌驾
公共产品记录适用(最终字符串s){
返回新产品记录(“我的主题”,s);
}
};
kafkaWriter.writeToKafka(producerConfig,f,Option.empty());
KafkaWriter.writerToKafka(producerConfig,f,Option.empty)——这行代码在EclipseIDE上给出了以下错误
感谢您的帮助。卡夫卡作者使用了scala.collection.Map
而在这次尝试中,我们使用了java.util.Map
使用了asScala
转换,但我不知道这是从哪里来的。(它似乎不合法,因为它似乎使用了来自Scala.collection.JavaConverters
的Scala隐式转换,但这在Java中不起作用)
最简单的解决方案是实例化一个scala.collection.immutable.HashMap
,尽管我建议将作业迁移到使用scala
如果您使用的是Spark>=v2.2,编写kafka的最简单方法是将数据转换为
数据集
或数据帧
,并使用数据帧编写器
,如下所示:
data.write.format("kafka")
.option("kafka.bootstrap.servers","...")
.option("topic", "abcTopic" )
.option("checkpointLocation", "/path/to/checkpoint/loc")
.save()
(好吧,这在我能找到的任何地方都没有记录。)是的,对于他们使用的“producerConfig”,例如“asScala”转换。进一步查看这条评论——我已经为这个原创(Spark Kafka Writer)创建者发布了如下消息,用于将java映射转换为scala映射
JavaConverters
不依赖隐式,不像JavaConverations
@BenFradet,恐怕它确实依赖隐式,并且只在Scala中工作。它使用“pimp my library”模式添加了一个显式的asJava
/asScala
方法。请参阅:@BenFradet这可能用于以下位置:JavaConverters.mapascalamap(javaMap)
:
Map<String, Object> producerConfig = new HashMap<String, Object>();
producerConfig.put("bootstrap.servers", "localhost:9092");
producerConfig.put("key.serializer", StringSerializer.class);
producerConfig.put("value.serializer", StringSerializer.class);
KafkaWriter<String> kafkaWriter = new DStreamKafkaWriter<>(lines.dstream(), scala.reflect.ClassTag$.MODULE$.apply(String.class));
Function1<String, ProducerRecord<String, String>> f = new MyFunc<String, ProducerRecord<String, String>>() {
@Override
public ProducerRecord<String, String> apply(final String s) {
return new ProducerRecord<>("my-topic", s);
}
};
kafkaWriter.writeToKafka(producerConfig, f,Option.empty());
data.write.format("kafka")
.option("kafka.bootstrap.servers","...")
.option("topic", "abcTopic" )
.option("checkpointLocation", "/path/to/checkpoint/loc")
.save()