设计-卡夫卡制片人可以写成Spark-job吗?

时间:2019-05-17 06:57:12

标签: apache-spark apache-kafka spark-avro

我有一个与设计有关的问题 1) 以下是我的管道: 源Web服务---> Kafka Producer->主题-> sparkJobs-> hdfs / hive。

我需要从DataSourceAPIs(Web服务URL)中提取数据,然后继续讨论主题。 如果我使用卡夫卡制片人 Kafka生产者可以将其编写为spark -job的一部分,还是应该作为独立的Java应用程序使用?有可能将卡夫卡制片人写成火花工作吗?如果可以,怎么办?

2) 我有不同类型的数据来自不同的主题。 但是某些数据取决于其他主题的其他数据 因此,我需要实现一些数据排序。 例如,除非topic_1和topic_2数据可用,否则无法处理topic_3数据。 如何处理这种依赖性?

获得订购的最佳地点是什么? @Kafka生产者端还是@消费者端?

2 个答案:

答案 0 :(得分:1)

1)我不确定您的管道。您的问题暗示了相反的流程, 即从数据集到Kafka。

当然,您可以在Spark DAG中使用kafka生产者。有两种选择。我了解您的意思是数据集API,而不是数据源API。在数据集上,您可以始终添加带有“ foreach”的终端节点,然后发出每个元素。您也可能会更有效率,并使用“ foreachPartition”创建终端节点,在该节点中,您将为给定子集中的每个元素重用相同的Producer。

2)在Kafka中,可以保证单个主题分区内的严格排序。因此,如果需要保持不同类型数据的顺序,则需要将它们发送到相同的主题/分区(对它们进行多路复用),并确保您的数据使用者能够解复用该异类流。要将数据保留在同一主题分区中,请使用相同的消息键并依靠默认的分区程序(推荐),或者提供您自己的分区程序。

答案 1 :(得分:1)

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对您可能会有帮助