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,那就得重新安装了
相关推荐
2.1 **拓扑(Topology)**:在Storm中,拓扑是数据处理逻辑的定义,由多个 bolts 和 spouts 组成。Bolts负责处理数据,而Spouts则负责生成数据流。 2.2 **Bolt**:Bolt是Storm处理逻辑的核心组件,可以进行数据过滤、...
2. **Storm/storms/**:存储 Topology 的基本信息,包括名称、启动时间、运行状态、Worker 数量和组件的并行度设置等。 3. **Storm/assignments/**:存储 Nimbus 为每个 Topology 分配的任务信息,包括本地存储目录...
官方zeromq the guide翻译,直接对网页全文进行翻译,包括英文原版网页与中文版网页,可用于zmq的学习。网页内容的版本为2019年10月24日。 The Guide is originally in C, but also in PHP, Java, Python, Lua, and ...
- **Socket(套接字)**:在ZMQ中,套接字是通信的基本单元,类似于网络编程中的TCP/UDP套接字。它支持多种模式,如PUB/SUB(发布/订阅)、REQ/REP(请求/响应)、DEALER/ROUTER(经销商/路由器)等。 - **Pattern...
在`mainwindow.cpp`中,可能会有创建和设置ZMQ上下文、套接字以及处理用户界面事件的代码。`mainwindow.h`则会定义相关的类和接口,使其他类能够与主窗口交互。 `zmqsubscriber.cpp`和`zmqsubscriber.h`文件是订阅...
`gRPC` 和 `ZeroMQ (zmq)` 都是实现高效通信的框架,但它们的设计理念和应用场景各有不同。本篇文章将深入探讨这两个工具,并基于提供的“grpc、zmq通信效率测试demo”进行分析。 首先,`gRPC` 是由 Google 开源的...
在本节中,我们将深入探讨Storm的核心概念和特性,包括它的记录级容错原理、配置详解、批处理、TOPN操作、流程聚合、DRPC(Direct RPC)以及executor、worker、task之间的关系和调优。 **Storm记录级容错原理** ...
这个"REP-REQ.zip_Rep和req_zmq_zmq REP_zmq REQ_zmq_req"文件包含的是一个关于ZMQ中REPLY(REP)和REQUEST(REQ)模式的示例代码,这种模式是ZMQ中的基本通信模式之一,常用于客户端-服务器架构。 **ZMQ的REPLY...
在给定的"czmq和zmq和libsodium的库及demo"中,我们可以了解到以下几个关键知识点: 1. czmq:czmq是0MQ(ZMQ)的一个高级绑定库,它提供了更多的抽象和工具,使得开发人员能够更容易地构建复杂的异步消息处理系统...
ZMQ库,全称为ZeroMQ,是一个高度可伸缩的消息队列系统,它提供了一种在分布式计算环境中进行进程间通信(IPC)和网络间通信(IPC)的方式。ZeroMQ不仅在性能上表现出色,而且在设计上具有灵活性和可靠性,使得它...
- `storm.id`:运行中的拓扑 ID,由 Storm 名称和唯一的随机数组成。 除了上述配置,还有许多其他参数可以调整,以优化 Storm 集群的性能和稳定性。 **Storm 功能模块** - **批处理**:尽管 Storm 主要是为实时...
zmq的cpp。头文件。
在IT行业中,ZMQ因其强大的性能和丰富的特性被广泛应用于分布式系统、微服务架构以及大数据处理等领域。本文将深入探讨ZMQ数据传输的核心概念、工作原理以及不同版本库文件在数据传输中的应用。 1. **核心概念** -...
在本示例“zmq通讯demo”中,我们将探讨如何使用ZMQ来创建客户端和服务端,实现它们之间的模拟通讯。 ZMQ的核心概念是基于发布/订阅、请求/响应和推送/拉取模式的消息传递。这些模式提供了灵活且可扩展的通信结构,...
zeromq中的zmq.hpp头文件,用于编写zeromq代码
例如,`ZMQ_PUB`用于发布者,`ZMQ_SUB`用于订阅者,`ZMQ_REQ`和`ZMQ_REP`分别对应请求和响应模式,`ZMQ_PUSH`和`ZMQ_PULL`用于推送和拉取数据。 4. **ZMQ上下文和套接字创建**: 在C语言中,首先需要创建一个`zmq_...
通过学习和理解这个示例,你可以了解到如何在Qt应用程序中设置和管理ZMQ上下文,创建和绑定socket,以及如何使用消息队列进行通信。这不仅可以帮助你掌握ZMQ的基本用法,还可以让你了解如何在实际项目中整合不同的...
qtzmq库提供了许多与ZeroMQ相关的Qt对象,如`ZmqContext`和`ZmqSocket`,你可以通过这些对象进行消息的发送和接收。例如,创建一个`ZmqSocket`实例并连接到ZeroMQ服务器: ```cpp #include <qtzmq/ZmqSocket> Zmq...
3. **storm.local.dirstorm**:Storm在本地文件系统中使用的目录,用于存储工作目录和日志等数据,确保这个路径对Storm进程是可读写的。 4. **storm.cluster.mode**:Storm集群的运行模式,可以是分布式...