设计- Kafka Producer 可以写成 Spark-job 吗?
Posted
技术标签:
【中文标题】设计- Kafka Producer 可以写成 Spark-job 吗?【英文标题】:design- Can Kafka Producer written as Spark-job? 【发布时间】:2019-10-04 11:23:16 【问题描述】:我的管道如下:
Source-webservices ---> Kafka Producer --> topics --> sparkJobs --> hdfs/hive
我有两个与设计相关的问题:
我需要从 DataSourceAPI(Web 服务 URL)中提取数据并推送到主题。 如果我使用 Kafka 生产者,那么 Kafka 生产者可以编写为 spark 作业的一部分,还是应该是独立的 java 应用程序?是否可以将 Kafka 生产者编写为 spark-job?如果有,怎么做?
我有来自不同主题的不同类型的数据。 但有些数据依赖于其他主题的其他数据 所以我需要实现一些数据排序。 例如,除非 topic_1 和 topic_2 数据可用,否则无法处理来自 topic_3 的数据。 如何处理这种依赖关系?
实现订购的最佳地点是什么? @Kafka Producer 方还是@Consumer 方?
【问题讨论】:
不要使用来自 spark 和其他产品的支持邮件列表来使您的问题可见!!!特别是隐藏收件人。 【参考方案1】:1) 我不确定您的管道。您的问题表明相反的流程, 即从数据集到 Kafka。
当然,可以在 Spark DAG 中使用 kafka 生产者。有几个选项。我了解您的意思是 Dataset API 而不是 DataSource API。在数据集上,您可以始终使用“foreach”添加终端节点,然后发出每个元素。您还可以更有效地使用“foreachPartition”创建终端节点,您可以在其中为给定子集中的每个元素重用相同的生产者。
2) 在 Kafka 中,在单个主题分区内保证了严格的排序。因此,如果您需要保持不同类型数据的顺序,您需要将它们发送到相同的主题/分区(多路复用它们)并确保您的数据使用者能够解复用该异构流。要将您的数据保存在同一主题分区中,请使用相同的消息键并依赖默认分区器(推荐)或提供您自己的分区器。
【讨论】:
谢谢,编辑了查询以使其更加清晰。【参考方案2】:Spark 为 Kafka 提供连接器,您可以通过它连接到集群中可用的任何 kafka 主题。连接到 Kafka 主题后,您可以读取或写入数据。
示例代码:
stream
val kafkaStream = spark
.readStream
.format("kafka")
.option("kafka.bootstrap.servers", KAFKA_BROKERS)
.option("subscribe", src_topic_name)
.option("startingOffsets", "latest")
.option("failOnDataLoss", "false")
.load()
batch
val kafkaStream = spark
.read
.format("kafka")
.option("kafka.bootstrap.servers", KAFKA_BROKERS)
.option("subscribe", src_topic_name)
.option("startingOffsets", "latest")
.option("failOnDataLoss", "false")
.load()
现在使用 kafkaStream 你可以从 src_topic_name 读取数据(我们在这里使用 readStream)
参考:Spark Streaming with Kafka
这个blog对你有帮助
【讨论】:
谢谢,但问题更多是如何设计的设计方面。 你应该为此做研究,你不能提出问题来为你的系统设计完整的架构。您可以针对您在实施中遇到的问题提出具体问题。尝试将问题分解为子问题。并对每个部分进行研究。就像您的情况一样,第一部分是从源网络服务到 Kafka。先完成这部分,然后继续。以上是关于设计- Kafka Producer 可以写成 Spark-job 吗?的主要内容,如果未能解决你的问题,请参考以下文章