我实现了一个包含几个kafka流的spark-streaming工作。 每个流都有自己的主题。
for (Map.Entry<String, Map<TopicAndPartition, Long>> byTopic : perTopicMap.entrySet()) {
logger.warn("Creating stream for topic " + byTopic.getKey() + " with the following offsets" + byTopic.getValue());
JavaInputDStream<String> directStream = KafkaStreamFactory.createDirectStream(jssc, kafkaParams, byTopic.getValue(), AllMetadataMessageHandler.INSTANCE);
processJavaDStream(directStream);
}
稍后在代码中我根据主题将每个流保存到其表中:
private void processJavaDStream(JavaDStream<String> eventStream) {
eventStream.foreachRDD((JavaRDD<String> rdd) -> {
Dataset<Row> myDataSet = someCalc(rdd);
myDataSet.write().format(PARQUET_FORMAT).mode(SaveMode.Append).partitionBy(PARTITION_BY_DAY, PARTITION_BY_HOUR).saveAsTable(topic);
}
}
现在一切都很顺利,但我想享受spark.streaming.concurrentJobs建议的并行性。
但是,当我添加它时,Spark会在同一个线程池中运行所有流。一段时间后,2个不同的spark执行程序线程写入同一个表。相同的流获得2个不同的线程。这会导致冲突并导致写入表失败。
有没有办法在线程和流之间进行匹配,以便每个流都能获得一个执行程序线程?