我正在使用火花结构流,融合开源Kafka集群和在AWS EMR中运行spark作业的火花流应用程序。我们至少有20多个Kafka主题以AVRO格式生成单个Kafka主题的数据,并且每个主题已在3到4个分区之间进行分区。我正在使用Spark ReadStream
阅读所有20多个主题(以逗号分隔的主题值)。然后从生成的DataFrame中过滤每个消息行,使用正确的Avro架构应用每条消息,并将生成的Dataset[T]
写入S3和Cassandra。
我几乎无法找到
的答案我可以在所有主题中使用一个ReadStream
吗?它是否会被视为所有主题和分区的一个Spark消费者,因为我只执行一个“火花提交作业”#39;在EMR?
spark应用程序如何在分区之间分配处理? spark是否使用不同的执行程序并行读取这些主题/分区,还是需要为每个分区实现任何多线程?
是否可以扩展到消费者群体中的多个消费者并行化?
为大量问题道歉,我认为它们都有关系。感谢您在我找到文档的任何反馈或指示。
的myconfig
val kafkaParams= Map("kafka.bootstrap.servers" -> "topic1,topic2,topic3,topic4,topic5,
"failOnDataLoss" -> param.fail_on_data_loss.toString,
"subscribe" -> param.topics.toString,
"startingOffsets" -> param.starting_offsets.toString,
"kafka.security.protocol" -> param.kafka_security_protocol.toString,
"kafka.ssl.truststore.location" -> param.kafka_ssl_truststore_location.toString,
"kafka.ssl.truststore.password" -> param.kafka_ssl_truststore_password.toString
)
ReadStream代码
val df = sparkSession.readStream
.format("kafka")
.options(kafkaParams)
.load()
然后使用'主题列将输入数据框拆分为多个数据框,并为每个结果数据框应用Avro架构。
将每个Dataset[T]
写入不同的汇点,如S3,Cassandra等......
答案 0 :(得分:0)
我可以对所有主题使用一个ReadStream吗?
假设所有主题都可以使用相同的Kafka配置集,请确定。但是,可能不能容错。例如,failOnDataLoss
将在单个主题失败时导致整个作业失败。
是否将其视为所有主题和分区的一个Spark使用者... Spark是否使用不同的执行程序并行读取这些主题/分区?
是的。您可以将Spark Executor的数量扩展到所有主题的分区总数之和。
我需要为每个分区实现任何多线程吗?
Spark应该为您处理。
是否可以扩展到一个消费者组中的多个消费者以进行并行化?
您应该尝试在代码中设置group.id
属性,但是拥有多个执行者已经在创建使用者组。
与问题无关-您正在尝试做的是 Kafka Connect 的用途。将Kafka数据读取到各种数据源中。 S3和Cassandra已经是插件的两个现有实现。