Kafka.Utils.createRDD与KafkaDirectStreaming

时间:2016-06-16 16:33:40

标签: apache-spark apache-kafka kafka-consumer-api

我想知道当我想要读取所有Kafka队列时,使用batch-Kafka RDD而不是KafkaDirectStream来从Kafka队列读取操作是否更快。

我观察到使用批处理RDD从不同分区读取不会导致Spark并发作业。是否有一些Spark专有配置才能允许这种行为?

感谢。

2 个答案:

答案 0 :(得分:0)

尝试在不同的线程或不同的进程中运行spark使用者。这就是我采取的方法。我观察到通过为每个主题分区分配一个消费者线程(或进程)来获得最佳并发性。

关于批量与KafkaDirectStream的问题,我认为即使是KafkaDirectStream也是面向批处理的。批处理间隔可以在流式上下文中指定,如下所示:

private static final int INTERVAL = 5000;  // 5 seconds
JavaSparkContext sc = new JavaSparkContext(conf);
SQLContext sqlContext = new SQLContext(sc);
JavaStreamingContext ssc = new JavaStreamingContext(sc, new Duration(INTERVAL));

有一个很好的图像描述了火花流是如何批量导向的:

http://spark.apache.org/docs/1.6.0/streaming-programming-guide.html#discretized-streams-dstreams

答案 1 :(得分:0)

Spark本质上是一个批处理引擎,Spark流通过定义称为微批处理的东西使批处理更接近流。微批处理只不过是指定批处理间隔非常低(根据官方文档中的建议,可以低至50ms)。所以现在重要的是你的微批次间隔是多少。如果保持低水平,你会感觉它接近实时。

在Kafka消费者方面,Spark直接接收器在每个执行器中作为单独的任务运行。因此,如果您有足够的执行程序作为分区,那么它将从所有分区中获取数据并从中创建RDD。

如果您正在谈论从多个队列中读取,那么您将创建多个DStream,这将再次需要更多的执行程序来匹配分区的总数。