【问题标题】:Apache Spark - Parallel Processing of messages from Kafka - JavaApache Spark - 来自 Kafka 的消息的并行处理 - Java
【发布时间】:2015-11-09 00:40:07
【问题描述】:
JavaPairReceiverInputDStream<String, byte[]> messages = KafkaUtils.createStream(...);
JavaPairDStream<String, byte[]> filteredMessages = filterValidMessages(messages);

JavaDStream<String> useCase1 = calculateUseCase1(filteredMessages);
JavaDStream<String> useCase2 = calculateUseCase2(filteredMessages);
JavaDStream<String> useCase3 = calculateUseCase3(filteredMessages);
JavaDStream<String> useCase4 = calculateUseCase4(filteredMessages);

...

我从 Kafka 检索消息,对其进行过滤并将相同的消息用于多个用例。这里useCase1到4是相互独立的,可以并行计算。但是,当我查看日志时,我发现计算是按顺序进行的。我怎样才能让它们并行运行。任何建议都会有所帮助。

【问题讨论】:

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


    【解决方案1】:

    我将所有代码移到一个 for 循环中,并根据 kafka 主题中的分区数进行迭代,我看到了改进。

    for(i=0;i<numOfPartitions;i++)
    {
    JavaPairReceiverInputDStream<String, byte[]> messages =
    KafkaUtils.createStream(...);
    JavaPairDStream<String, byte[]> filteredMessages =
    filterValidMessages(messages);
    
    JavaDStream<String> useCase1 = calculateUseCase1(filteredMessages);
    JavaDStream<String> useCase2 = calculateUseCase2(filteredMessages);
    JavaDStream<String> useCase3 = calculateUseCase3(filteredMessages);
    JavaDStream<String> useCase4 = calculateUseCase4(filteredMessages);
    }
    

    参考:http://www.michael-noll.com/blog/2014/10/01/kafka-spark-streaming-integration-example-tutorial/

    【讨论】:

      【解决方案2】:

      尝试为您的 4 个用例中的每一个创建创建 Kafka 主题。然后尝试创建 4 个不同的 Kafka DStream。

      【讨论】:

      • 谢谢。但是,用例会以不同的方式使用相同的消息。
      • 我会仔细检查您的解决方案,因为不同的消息将根据消息的密钥进入不同的分区。
      • 在这种情况下,我有同样的信息,第一个用例去掉国家和聚合,第二个用例去掉反类型和聚合等等。
      猜你喜欢
      • 2019-07-25
      • 2016-04-18
      • 2018-02-08
      • 2015-05-20
      • 2017-07-13
      • 2015-02-04
      • 1970-01-01
      • 1970-01-01
      • 2019-12-15
      相关资源
      最近更新 更多