我正在尝试使用结构流来读取多个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主题(测试,试用)。当我运行这个程序时。我只能使用试用主题的消息。不能使用来自测试主题的消息。
我没有收到任何错误,程序运行正常。任何人都可以帮助我。
谢谢!
答案 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