Apache spark apachespark中的风暴状结构

Apache spark apachespark中的风暴状结构,apache-spark,apache-storm,Apache Spark,Apache Storm,您知道如何在ApacheStorm中将数据流传输到多个螺栓。在ApacheSpark中有没有类似的方法 我基本上希望有一个程序从卡夫卡队列读取数据,并将其输出到两个不同的程序,然后这些程序可以用自己的不同方式处理数据 具体来说,将有一个读卡器程序,该程序将从卡夫卡队列读取数据并将其输出到2个程序x和y。x将处理数据以计算一种度量(在我的情况下,它将计算用户活动),而y将计算另一种度量(在我的情况下,这将是基于不同设备的检查活动) 有人能帮我理解这在Spark中是如何实现的吗?为什么不简单地创建两

您知道如何在ApacheStorm中将数据流传输到多个螺栓。在ApacheSpark中有没有类似的方法

我基本上希望有一个程序从卡夫卡队列读取数据,并将其输出到两个不同的程序,然后这些程序可以用自己的不同方式处理数据

具体来说,将有一个读卡器程序,该程序将从卡夫卡队列读取数据并将其输出到2个程序x和y。x将处理数据以计算一种度量(在我的情况下,它将计算用户活动),而y将计算另一种度量(在我的情况下,这将是基于不同设备的检查活动)


有人能帮我理解这在Spark中是如何实现的吗?

为什么不简单地创建两种拓扑

  • 两种拓扑都有一个来自kafka主题的喷口(是的,可以有多个拓扑来自同一主题;我在生产系统上运行了这个)确保使用不同的喷口配置,否则kafka zookeper将看到两种拓扑相同。请看一下文档
  • Spoutconfig是Kafkanconfig的扩展,它支持带有ZooKeeper连接信息的附加字段,并用于控制特定于KafkaSpout的行为。Zkroot将用作存储用户偏移量的根。id应该唯一标识您的喷口

  • 在拓扑x中实现程序x,在拓扑y中实现程序y

    另一个选项是两个螺栓图从同一个喷口下标,但这不是最优的,因为失败的元组(可能只在一个图中失败)将被重放到两个图中,如果它们只在其中一个图中失败;因此,一些卡夫卡消息最终会被处理两次,使用两个分开的拓扑,避免出现这种情况

    有趣的问题!您是否愿意详细说明“两个不同的程序”的输出?因此,一般来说,这些程序可能是需要从同一来源读取数据的任何程序。在我的例子中,我希望一个程序处理该数据并计算指标,而另一个程序应获取该数据并在s3中创建备份。请使用附加信息编辑您的问题好吗?至于s3中的备份,这应该是Spark中已经提供的常规保存。另一方面,你可能想考虑一个连接到HbASE或ErrastScess。还有一件事,如果你不想更具体地说明你需要什么。您的问题将被标记为广泛的,因此不会得到解决,甚至可能会被删除,尽管它很有趣。您建议使用Apache Spark?还是暴风雨?@PraveshJain代表暴风雨。但对于Spark,您可能应该使用相同的方法;两个不同的程序读取相同的卡夫卡主题,您需要确保zookeper将卡夫卡客户端视为不同的客户端(因此请小心卡夫卡客户端的副本)。我意识到我可以做到这一点。始终可以创建两个单独的程序。我想知道这是否可以通过在不同的程序中分离公共代码来优化。@PraveshJain如果您进行“优化”,您可能会停止处理卡夫卡消息两次。我在最后一段中解释了这一点。在任何情况下都不能排除两次处理。
    public SpoutConfig(BrokerHosts hosts, String topic, String zkRoot, String id);