通过spark结构阅读多个kafka主题是行不通的?

时间:2018-04-19 09:24:42

标签: apache-spark apache-kafka spark-streaming

我正在尝试使用结构流来读取多个kafka主题中的数据。 版 卡夫卡 - 2.12-1.0.0 Spark Structure Streaming - 2.2.1

我的代码: -

val spark = SparkSession
      .builder()
      .appName("StreamLocallyExample")
      .config("spark.master", "local")
       .config("spark.sql.streaming.checkpointLocation", "path/XXYY")
       .getOrCreate()

    val kafkaStreamDF = sparkSession.readStream.format("kafka")
          .option("kafka.bootstrap.servers", "localhost:9092")
          .option("subscribe", "test,trial")
          .load()

    val df=kafkaStreamDF.selectExpr("CAST(value AS string)")

    val query=df.writeStream .outputMode("append")
                .format("console")
                .option("truncate","false")
                .start()

    query.awaitTermination()

在上面,我有两个kafka主题(测试,试用)。当我运行这个程序时。我只能使用试用主题的消息。不能使用来自测试主题的消息。

我没有收到任何错误,程序运行正常。任何人都可以帮助我。

谢谢!

1 个答案:

答案 0 :(得分:1)

像Maverik提到的那样,请确保所有主题都在接收数据。在具有多个主题的单个流中,主题将按顺序逐个读取。

您可以使用以下配置在消费者端启用并行性

conf.set("spark.streaming.concurrentJobs", "2");

默认情况下,并发作业数为1,这意味着一次只有1个作业处于活动状态,直到未完成,即使资源可用且空闲,其他作业也将排队。

http://stackoverflow.com/questions/23528006/how-jobs-are-assigned-to-executors-in-spark-streaming。

即使批处理的处理时间略多于批处理间隔,运行并发作业也会减少处理时间和计划延迟。

SparkConf conf = new SparkConf().setAppName("Streaming");
conf.set("spark.streaming.concurrentJobs", "2");
JavaSparkContext sc = new JavaSparkContext(conf);
JavaSparkContext sc = new JavaStreamingContext(sc, new Duration(1000));

kafkaParams.put("metadata.broker.list",
                "broker1:9092,broker2:9092,broker3:9092");
Set<String> topics = Collections.singleton("");

JavaPairInputDStream<String, String> directKafkaStream = KafkaUtils.createDirectStream(ssc, String.class,
                String.class, StringDecoder.class, StringDecoder.class, kafkaParams, topics);

资料来源:http://why-not-learn-something.blogspot.in/2016/06/spark-streaming-performance-tuning-on.html