理论教育 Scala消息生产者(Producer)设计

Scala消息生产者(Producer)设计

时间:2023-11-24 理论教育 版权反馈
【摘要】:上面的步骤将最小化Kafka Producer实例的建立数量,同时也会最小化TCP连接的数量,通常由Kafka集群确定。可以使用这个Pool设置来精确地控制对流应用程序可用的Kafka Producer实例数量。5)通过Kafka生产者Pool将结果写回一个不同的Kafka topic。

Scala消息生产者(Producer)设计

Kafka与Spark Streaming整合的实践内容,主要是将Kafka作为Spark Streaming的数据源,即Spark Streaming怎样用Kafka高效获取数据,也就是利用Kafka的Consumer功能,这一部分已在上一小节进行详细阐述,但是在有些文献中,也有从Spark中的数据写到Kafka的情景,这里详细讲解一下:

写入数据到Kafka需要从foreachRDD输出操作进行,通用的输出操作者都包含了一个功能函数,让每个RDD都由Stream生成。这个函数需要将每个RDD中的数据推送到一个外部系统,比如将RDD保存到文件,或者通过网络将它写入到一个数据库。需要注意的是,这里的功能函数将在驱动中执行,同时其中通常会伴随RDD行为,它将会促使流RDDs的计算。

其中“功能函数是在驱动中执行”,也就是Kafka Producer将在驱动中进行,也就是说“功能函数是在驱动中进行评估”。当使用foreachRDD从驱动中读取数据时,实际过程将变得更加清晰。想详细了解foreachRDD读外部系统中的一些常用推荐模式,请阅读Spark的Output Operations on DStreams文档,也可以阅读重用Kafka Producer实例,这个实例是通过Apache Commons Pool工具来实现,通过Producer pool来跨多个RDDS/batches,这个Producer pool通过Broadcast variable来提供给tasks。

需要注意的是,Spark Streaming每分钟都会建立多个RDDs,每个RDD都会包含多个分区,因此无须为Kafka Producer实例建立新的Kafka生产者,更不用说每个Kafka消息。上面的步骤将最小化Kafka Producer实例的建立数量,同时也会最小化TCP连接的数量,通常由Kafka集群确定。可以使用这个Pool设置来精确地控制对流应用程序可用的Kafka Producer实例数量。

为了更好地理解上面的原理,这里通过一个“并行地从Kafka topic中读取Avro-enco⁃ded数据,将结果数据写入到Kafka”的示例来熟悉基于Spark Streaming应用程序要旨,该示例的实际流程如下:

1)使用了一个最佳的read parallelism,每个Kafka分区都配置了一个单线程input DStream。(www.daowen.com)

2)并行化Avro-encoded数据到pojos中。

3)然后将pojos并行地写到binary。

4)序列化可以通过Twitter Bijection执行。

5)通过Kafka生产者Pool将结果写回一个不同的Kafka topic。

上面示例的实际流程的详细参考代码如下所示:

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈