Spark流媒体应用程序订阅相同的kafka主题

时间:2017-08-29 10:26:37

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

我是spark和kafka的新手,我和kafka的火花流的使用模式略有不同。 我正在使用

spark-core_2.10 - 2.1.1
spark-streaming_2.10 - 2.1.1
spark-streaming-kafka-0-10_2.10 - 2.0.0
kafka_2.10 - 0.10.1.1

正在将连续事件数据流式传输到kafka主题,我需要从多个火花流应用程序处理该主题。但是当我运行spark streaming应用程序时,只有其中一个接收数据。

     Map<String, Object> kafkaParams = new HashMap<String, Object>();

     kafkaParams.put("bootstrap.servers", "localhost:9092");
     kafkaParams.put("key.deserializer", "org.apache.kafka.common.serialization.StringDeserializer");
     kafkaParams.put("value.deserializer", "org.apache.kafka.common.serialization.StringDeserializer"); 
     kafkaParams.put("auto.offset.reset", "latest");
     kafkaParams.put("group.id", "test-consumer-group");
     kafkaParams.put("enable.auto.commit", "true");
     kafkaParams.put("auto.commit.interval.ms", "1000");
     kafkaParams.put("session.timeout.ms", "30000");

     Collection<String> topics =  Arrays.asList("4908100105999_000005");;
     JavaInputDStream<ConsumerRecord<String, String>> stream =  org.apache.spark.streaming.kafka010.KafkaUtils.createDirectStream(
                    ssc,
                    LocationStrategies.PreferConsistent(),
                    ConsumerStrategies.<String, String> Subscribe(topics, kafkaParams) );

      ... //spark processing

我有两个火花流应用程序,通常是我提交的第一个使用kafka消息。第二个应用程序只是等待消息而永远不会继续。 正如我所读到的,kafka主题可以从多个消费者订阅,对于火花流是不是真的?或者kafka主题及其配置中缺少一些内容?

提前致谢。

2 个答案:

答案 0 :(得分:1)

您可以使用相同的groupid创建不同的流。以下是0.8集成在线文档的更多细节,有两种方法:

方法1:基于接收者的方法

  

可以使用不同的组创建多个Kafka输入DStream   使用多个接收器并行接收数据的主题。

方法2:直接接近(无接收者)

  

无需创建多个输入Kafka流并将它们联合起来。同   directStream,Spark Streaming将创建尽可能多的RDD分区   有消耗的Kafka分区,它们都会从中读取数据   卡夫卡并行。所以卡夫卡和卡夫卡之间有一对一的映射   RDD分区,更容易理解和调整。

您可以在Spark Streaming + Kafka Integration Guide 0.8

了解更多信息

从您的代码看起来您​​使用的是0.10,请参阅Spark Streaming + Kafka Integration Guide (Kafka broker version 0.10.0

即使认为它正在使用spark streaming api,一切都由kafka属性控制,因此取决于您在属性文件中指定的组ID,您可以启动具有不同组ID的多个流。

干杯!

答案 1 :(得分:1)

消费者数量[在消费者群体下],不能超过主题中的分区数量。如果要并行使用消息,则需要引入适当数量的分区并创建接收器来处理每个分区。