Spark结构化流式多线程/多个消费者

时间:2017-12-18 23:21:10

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

我正在使用火花结构流,融合开源Kafka集群和在AWS EMR中运行spark作业的火花流应用程序。我们至少有20多个Kafka主题以AVRO格式生成单个Kafka主题的数据,并且每个主题已在3到4个分区之间进行分区。我正在使用Spark ReadStream阅读所有20多个主题(以逗号分隔的主题值)。然后从生成的DataFrame中过滤每个消息行,使用正确的Avro架构应用每条消息,并将生成的Dataset[T]写入S3和Cassandra。

我几乎无法找到

的答案
  1. 我可以在所有主题中使用一个ReadStream吗?它是否会被视为所有主题和分区的一个Spark消费者,因为我只执行一个“火花提交作业”#39;在EMR?

  2. spark应用程序如何在分区之间分配处理? spark是否使用不同的执行程序并行读取这些主题/分区,还是需要为每个分区实现任何多线程?

  3. 是否可以扩展到消费者群体中的多个消费者并行化?

  4. 为大量问题道歉,我认为它们都有关系。感谢您在我找到文档的任何反馈或指示。

    1. 的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
        )
      
    2. ReadStream代码

      val df = sparkSession.readStream
        .format("kafka")
        .options(kafkaParams)
        .load()
      
    3. 然后使用'主题列将输入数据框拆分为多个数据框,并为每个结果数据框应用Avro架构。

    4. 将每个Dataset[T]写入不同的汇点,如S3,Cassandra等......

1 个答案:

答案 0 :(得分:0)

  

我可以对所有主题使用一个ReadStream吗?

假设所有主题都可以使用相同的Kafka配置集,请确定。但是,可能不能容错。例如,failOnDataLoss将在单个主题失败时导致整个作业失败。

  

是否将其视为所有主题和分区的一个Spark使用者... Spark是否使用不同的执行程序并行读取这些主题/分区?

是的。您可以将Spark Executor的数量扩展到所有主题的分区总数之和。

  

我需要为每个分区实现任何多线程吗?

Spark应该为您处理。

  

是否可以扩展到一个消费者组中的多个消费者以进行并行化?

您应该尝试在代码中设置group.id属性,但是拥有多个执行者已经在创建使用者组。


与问题无关-您正在尝试做的是 Kafka Connect 的用途。将Kafka数据读取到各种数据源中。 S3和Cassandra已经是插件的两个现有实现。