Fork me on GitHub

Storm 学习笔记

Storm的基本原理

Storm是一个免费开源的分布式实时计算系统
Storm是随着实时大数据处理的需求而生的,最早用在微博社交工具Twitter(推特)上,在分布式的环境下不间断地实时处理少量的数据。
目前Storm主要用在以下3个方面:

  • 流处理(Stream Processing)
  • 连续计算(Continuous Computation)
  • 分布式RPC(Distributed RPC)

Storm的技术核心和基本组成

  • Topology(拓扑)
  • Stream(流)
  • Spout(喷口)
  • Bolt(螺栓)
  • Stream grouping(流分组)
  • Task(任务)
  • Worker(工作进程)

概念

主控节点和工作节点

Storm集群中有两类节点:主控节点(Master Node)和工作节点(Worker Node)。其中,主控节点只有一个,而工作节点可以有多个。

Nimbus进程与Supervisor进程

主控节点运行一个称为Nimbus的守护进程。Nimbus负责在集群中分发代码,对节点分配任务,并监视主机故障。
每个工作节点运行一个称为Supervisor的守护进程。Supervisor监听其主机上已经分配的主机的作业,启动和停止Nimbus已经分配的工作进程。

storm.yaml

修改 STORM_HOME 目录下的 conf/storm.yaml 文件,可以覆盖 Storm 配置的默认值。
storm.yaml会覆盖defaults.yaml中的任何内容。以下几个配置是必须要设置的。

storm.zookeeper.servers

这是一个为Storm集群服务的ZooKeeper集群的主机列表,它的配置应该类似于:

1
2
3
4
storm.zookeeper.servers:
- "111.222.333.444"
- "555.666.777.888"
- "555.666.777.889"

注:

  • 如果你的ZooKeeper集群使用的端口和默认的端口不相同,应该也设置“storm.zookeeper.port”的值。
  • ZooKeeper只能部署奇数个,偶数个是不可以的。
    选举机制(FastLeaderElection算法):sid最大且被超过集群中超过半数的机器拥护就会成为leader.
    所以只有两种情况无法选出leader:
    整个集群只有2台服务器(注意不是只剩2台,而是集群的总节点数为2)
    整个集群超过半数机器挂掉。
    所谓的偶数问题其实是另一个集群优化配置问题,即:集群的容灾数量=集群总节点数/2-1
    假如集群有5节点,那么最多允许2个节点挂掉,如果有3节点挂了,那么整个集群的选举结果不会满足条件:集群中超过半数的机器拥护。
    假如集群有6个节点,那么最多也只能挂掉2台,因为挂了3台时,选举结果也不会满足条件:集群中超过半数的机器拥护。
    结果可以看出,多那一台用处并不大。所以集群总数推荐为奇数。

storm.local.dir

Nimbus 和 Supervisor 守护进程需要在本地硬盘的一个目录存储少量的状态(如jars、confs等)。应该在每台主机上创建该目录,赋予它适当的权限,然后使用该配置填写目录位置。

1
storm.local.dir:"/mnt/storm"

nimbus.host

工作节点为了下载拓扑的jar和confs文件,需要知道哪些主机是主控节点。例如:

1
nimbus.host:"111.222.333.444"

supervisor.slots.ports

对于每个工作节点,通过该配置项来设置该节点上运行多少个Worker。每个Worker使用一个端口接收消息,此设置定义为使用哪些端口是打开的。定义几个端口,Storm将分配几个Worker在这台主机上运行。
此设置默认为在端口6700、6701、6702、6703上配置运行4个Worker。

1
2
3
4
5
supervisor.slots.ports:
- 6700
- 6701
- 6702
- 6703

Storm的安装与配置

ToPology组件

Spout组件

Bolt组件

ZooKeeper集群

ZooKeeper 下载安装
下载zookeeper的安装包之后, 解压到合适目录. 进入zookeeper目录下的conf子目录, 创建zoo.cfg:

1
2
3
4
tickTime=2000
dataDir=/Users/apple/zookeeper/data
dataLogDir=/Users/apple/zookeeper/logs
clientPort=4180

「真诚赞赏,手留余香」