如何将Spark Stream(Dstream / JavaDStream)写入Kafka?

时间:2017-10-02 04:33:45

标签: apache-kafka spark-streaming

我已尝试使用以下最新maven工件的Java代码。 https://mvnrepository.com/artifact/com.github.benfradet/spark-kafka-writer_2.10/0.4.0 和前一个一样 - https://mvnrepository.com/artifact/com.github.benfradet/spark-kafka-writer_2.10/0.1.0 但是下面的代码并不允许我使用Java 1.8和Eclipse Oxygen最新的IDE进行编译。

---进口部分 -

import com.github.benfradet.spark.kafka.writer.DStreamKafkaWriter;

import com.github.benfradet.spark.kafka.writer.KafkaWriter;

import org.apache.kafka.common.serialization.StringSerializer;

import scala.Function1;

import scala.Option;

import scala.Serializable;
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());

KafkaWriter.writerToKafka(producerConfig,f,Option.empty)--- Line在Eclipse IDE上给出了以下错误

spark-kafka-writer-error

任何帮助表示赞赏。

1 个答案:

答案 0 :(得分:0)

kafka作家的writeToKafka method在此次尝试中需要scala.collection.Map,我们正在使用java.util.Map

official Java example使用asScala转换,但我不知道它来自哪里。 (它似乎不合法,因为它看起来像是使用来自scala.collection.JavaConverters的Scala隐式转换,但这在Java中不起作用)

最简单的解决方案是实例化scala.collection.immutable.HashMap,但我建议迁移作业以使用Scala。

如果您使用Spark&gt; = v2.2,写入kafka的最简单方法是将您的数据转换为DatasetDataFrame并使用DataFrameWriter这样的:

data.write.format("kafka")
  .option("kafka.bootstrap.servers","...") 
  .option("topic", "abcTopic" )
  .option("checkpointLocation", "/path/to/checkpoint/loc")
  .save()

(AFAIK,我找不到任何地方都没记录。)