Storm实战 (2) storm中ZMQ和netty作用
storm中ZMQ和netty作用
在storm集群安装中,我选择的是版本storm1.0.0,官网关于storm1.0.0需要的依赖库说的是要jdk1.6+和Python2.6.6,但在浏览博客时无意间发现有个博客上选择的版本是storm0.8.1说的是需要ZMQ,当时比较迷惑,到底需不需要呢?????????
参考资料:
- storm学习之Netty代替ZMQ http://blog.csdn.net/maixia24/article/details/38392457
- 从Storm和Spark 学习流式实时分布式计算的设计 http://www.csdn.net/article/2014-08-04/2821018/2
1.Storm的消息传递
对于Storm来说,他的消息分发机制是在定义Topology的时候就显式定义好的。也就是说,应用程序的开发者需要清楚的定义各个Bolts之间的关系,下游的Bolt是以什么样的方式获取上游的Bolt发出的Tuple。Storm有六种消息分发模式:
- Shuffle Grouping: 随机分组,Storm会尽量把数据平均分发到下游Bolt中。
- Fields Grouping:按字段分组, 比如按userid来分组, 具有同样userid的tuple会被分到相同的Bolt。这个对于类似于WordCount这种应用非常有帮助。
- All Grouping: 广播, 对于每一个Tuple, 所有的Bolts都会收到。这种分发模式要慎用,会造成资源的极大浪费。
- Global Grouping: 全局分组, 这个Tuple被分配到storm中的一个bolt的其中一个task。这个对于实现事务性的Topology非常有用。
- Non Grouping: 不分组, 这个分组的意思是说stream不关心到底谁会收到它的tuple。目前这种分组和Shuffle grouping是一样的效果, 有一点不同的是storm会把这个bolt放到这个bolt的订阅者同一个线程里面去执行。
- Direct Grouping: 直接分组, 这是一种比较特别的分组方法,用这种分组意味着消息的发送者指定由消息接收者的哪个task处理这个消息。
消息传递要点:
消息队列现在是模块之间通信的非常通用的解决方案了。消息队列使得进程间的通信可以跨越物理机,这对于分布式系统尤为重要,毕竟我们不能假定进程究竟是部署在同一台物理机上还是部署到不同的物理机上。RabbitMQ是应用比较广泛的MQ,关于RabbitMQ可以看我的一个专栏:RabbitMQ
提到MQ,不得不提的是ZeroMQ。ZeroMQ封装了Socket,引用官方的说法: “ZMQ (以下 ZeroMQ 简称 ZMQ)是一个简单好用的传输层,像框架一样的一个 socket library,他使得 Socket 编程更加简单、简洁和性能更高。是一个消息处理队列库,可在多个线程、内核和主机盒之间弹性伸缩。ZMQ 的明确目标是“成为标准网络协议栈的一部分,之后进入 Linux 内核”。现在还未看到它们的成功。但是,它无疑是极具前景的、并且是人们更加需要的“传统”BSD 套接字之上的一层封装。ZMQ 让编写高性能网络应用程序极为简单和有趣。”
因此, ZeroMQ不是传统意义上的MQ。它比较适用于节点之间和节点与Master之间的通信。Storm在0.8之前的Worker之间的通信就是通过ZeroMQ。但是为什么0.9就是用Netty替代了ZeroMQ呢?说替代不大合适,只是0.9的默认的Worker之间的通信是使用了Netty,ZeroMQ还是支持的。Storm官方认为ZeroMQ有以下缺点:
- 不容易部署。尤其是在云环境下:以为ZMQ是以C写的,因此它还是紧依赖于操作系统环境的。
- 无法限制其内存。通过JVM可以很容易的限制java所占用的内存。但是ZMQ对于Storm来说是个黑盒似得存在。
- Storm无法从ZMQ获取信息。比如Storm无法知道当前buffer中有多少数据为发送。
当然了还有所谓的性能问题,具体可以访问Netty作者的blog。结论就是Netty的性能比ZMQ(在默认配置下)好两倍。不知道所谓的ZMQ的默认配置是什么。反正我对这个结果挺惊讶。当然了,Netty使用Java实现的确方便了在Worker之间的通信加上授权和认证机制。这个使用ZMQ的确是不太好做。
2.ZMQ在storm0.8.x以及之前版本中作用
- ZMQ用于storm0.8.x及以前版本节点之间和节点与Master之间的通信
- storm0.9的默认的Worker之间的通信是使用了Netty,ZeroMQ还是支持的。
综上所述:只要你选择的版本是storm0.9及其以后版本,就不用安装ZMQ了,因为storm0.9之后版本默认采用netty的,如果你要强行使用ZMQ,那就得重新安装了