同一进程中的几个Spark Streams - 如何匹配每个流的一个线程?

时间:2017-02-26 16:40:17

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

我实现了一个包含几个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个不同的线程。这会导致冲突并导致写入表失败。

有没有办法在线程和流之间进行匹配,以便每个流都能获得一个执行程序线程?

0 个答案:

没有答案