9

我们正在评估部署 Storm,但我有点担心。我们目前运行 Hadoop MapReduce,并且希望将我们的一些处理从 MapReduce 转换到 Storm 进程。请注意,这是一些,但不是全部。我们仍然会有一些 MapReduce 功能。

我找到了 Mesos,它可以(可能)允许我们在同一硬件上维护 Storm 和 Hadoop 部署,但还有一些其他问题:

  • 我设想理想的情况是能够在 Storm 和 Hadoop 之间任意“借用”插槽。前任。两者都将根据需要使用相同的资源。不幸的是,这是一个固定部署,而不是像 EC2 之类的“基于云”。

  • 我想避免 Storm 环境中的瓶颈。一个理想的情况是根据需要“旋转”(或相反)更多 Bolts 实例。这可能/现实吗?

  • “重新启动”拓扑似乎是一项相当昂贵的操作,我不确定这是否真的是一种选择。理想情况下,我希望它尽可能无缝。

我们是否正确地处理了这个问题?本质上,Storm 拓扑会“提供”一个 MapReduce 批处理作业。我们的一些处理可以流式处理,作为 Storm 拓扑会更好,而其中一些需要批处理。

欢迎任何一般性反馈,即使它没有解决我的具体问题。在这一点上,这更像是一个探索阶段,我可能完全走错了路。

4

1 回答 1

5

一些想法,以及迄今为止我在进行类似实验时的经验(在 Sprint 期间在 Spike 中完成):

  • 根据我的经验(我可能是错的),随着需求的增加,您并没有真正启动更多的螺栓,而是调整拓扑中每个螺栓的并行度配置。拓扑不是通过添加更多 Bolt 来扩展的,而是通过增加任何 Bolt 是瓶颈的并行度来扩展拓扑。以字数问题为例:
builder.setBolt(4, new MyBolt(), 12)
    .shuffleGrouping(1)
    .shuffleGrouping(2)
    .fieldsGrouping(3, new Fields("id1", "id2"));

最后一个参数(“12”)是那个螺栓的平行度。如果它是拓扑中的瓶颈并且您需要扩展以满足需求,则可以增加它。并行度为 12 意味着它将导致 12 个线程在风暴集群中并行执行螺栓。

  • 在 0.8.0 中,您可以使用“执行器”,它还允许“动态”调整以帮助向上/向下缩放螺栓/等。例子:

builder.setBolt(new MyBolt(), 3) .setNumTasks(64) .shuffleGrouping("someSpout");

这里的executor(线程)数MyBolt()为3,可以动态改变线程数,不影响拓扑。 storm rebalance用于此:

$ storm rebalance someTopology -n 6 -e mySpout=4 -e myBolt=6

这会将“someTopology”拓扑的工作线程数更改为 6,将 mySpout 的执行程序/线程数更改为 4,并将 myBolt 的执行程序/线程数更改为 6。

  • 听起来您的风暴拓扑将处理流数据。需要批处理的数据将在持久保存到您正在使用的任何数据存储 (HDFS) 后启动。在这种情况下,您将包装一个螺栓来对数据存储进行持久性,以获取所需的任何数据。
  • 另一方面,如果您想在您已经拥有的任何数据存储之上进行某种增量处理(并保持有状态),请使用 Trident ( https://github.com/nathanmarz/storm/wiki/Trident-tutorial)。三叉戟实际上可能会解决您的很多问题。
于 2013-01-10T19:37:48.260 回答