在将Spark发布到Kafka之前在Spark中对RDD进行排序?

时间:2018-04-17 14:23:41

标签: scala apache-spark apache-kafka

在我的代码中,我首先订阅了一个Kafka流,处理每个RDD以创建我的类People的实例,然后,我想将结果集(Dataset[People])发布到特定的主题到卡夫卡。值得注意的是,并非每个从Kafka收到的传入消息都映射到People的实例。此外,人们的情况应该按照从卡夫卡收到的顺序发送到卡夫卡。

但是,我不确定是否真的需要排序,或者当People的实例在执行程序上运行相应的代码时保持相同的顺序(我可以直接将我的数据集发布到Kafka)。据我所知,排序是必要的,因为foreachRDD内的代码可以在集群中的不同节点上执行。这是对的吗?

这是我的代码:

val myStream = KafkaUtils.createDirectStream[K, V](streamingContext, PreferConsistent, Subscribe[K, V](topics, consumerConfig))

def process(record: (RDD[ConsumerRecord[String, String]], Time)): Unit = record match {
case (rdd, time) if !rdd.isEmpty =>
    // More Code...
    // In the end, I have: Dataset[People]
case _ =>
}

myStream.foreachRDD((x, y) => process((x, y))) // Do I have to replace this call with map, sort the RDD and then publish it to Kafka?

1 个答案:

答案 0 :(得分:0)

  

此外,人们的情况应该按照从卡夫卡收到的顺序发送给卡夫卡。

除非您有一个分区(然后您不会使用Spark,不是吗?)接收数据的顺序不确定,并且发送数据的顺序也不一样。排序在这里没有任何区别。

如果您需要一个非常特定的处理顺序(这通常是一个设计错误,如果您使用数据密集型应用程序),您需要一个顺序应用程序,或者比Spark更精细控制的系统。