弹性风暴拓扑/ Storm-Hadoop共存

jon*_*jon 9 java hadoop mapreduce distributed-computing apache-storm

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

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

  • 我设想理想的情况是能够任意地"借用"Storm和Hadoop之间的插槽.恩.两者都会根据需要使用相同的资源.不幸的是,这是一个固定的部署,并不像EC2那样"基于云".

  • 我想避免在我们的Storm环境中遇到瓶颈.一个理想的情况是根据需求"旋转"(或反向)螺栓的更多实例.这可能/现实吗?

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

我们正确接近这个问题吗?从本质上讲,Storm拓扑将"提供"MapReduce批处理作业.我们的一些处理可以以流方式处理,并且作为Storm拓扑会更好,而其中一些需要批处理.

任何一般性反馈,即使它没有解决我的具体问题,也会受到欢迎.在这一点上,这更像是一个探索阶段,我可能完全以错误的方式接近这一点.

Jac*_*ack 5

一些想法,以及我迄今为止进行类似实验的经验(在Sprint期间通过Spike工作):

  • 根据我的经验(我可能是错的),你不需要在需求增加时调整更多螺栓,而是调整拓扑中每个螺栓的并行配置.拓扑不是通过添加更多螺栓来扩展的,而是通过增加并行性来扩展任何螺栓是瓶颈.以示例字数问题为例:
builder.setBolt(4, new MyBolt(), 12)
    .shuffleGrouping(1)
    .shuffleGrouping(2)
    .fieldsGrouping(3, new Fields("id1", "id2"));
Run Code Online (Sandbox Code Playgroud)

最后一个参数("12")是该螺栓的平行度.如果它是拓扑中的瓶颈而您需要扩展以满足需求,那么您可以增加这一点.12的并行性意味着它将导致12个线程在风暴群集中并行执行螺栓.

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

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

这里,执行程序(线程)的数量MyBolt()为3,您可以动态更改线程数而不会影响拓扑. storm rebalance用于此:

$ storm rebalance someTopology -n 6 -e mySpout=4 -e myBolt=6
Run Code Online (Sandbox Code Playgroud)

这会将"someTopology"拓扑的工作者数量更改为6,将mySpout的执行者/线程数量更改为4,将myBolt的执行者/线程数量更改为6.

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