Author:kangqi
Version:1.0.0
Date:2016.8.17
一、 storm简介
Storm是一个免费开源、分布式、高容错的实时计算系统。Storm令持续不断的流计算变得容易,弥补了Hadoop批处理所不能满足的实时要求。Storm经常用于在实时分析、在线机器学习、持续计算、分布式远程调用和ETL等领域。Storm的部署管理非常简单,而且,在同类的流式计算工具,Storm的性能也是非常出众的。
实现一个实时计算系统要解决的问题有:低延迟、高性能、分布式、可扩展、容错性。
storm优势:
简单的编程模型 MR降低了并行批处理的复杂性 Storm降低了进行实时处理的复杂性
服务化:一个服务框架,支持热部署时,即时上线或下线APP
支持各种编程语言,默认支持Java,ruby,Python,clojure。增加其他语言支持,只需实现一个简单的storm通信协议即可。
容错性:storm会管理工作进程和节点的故障
水平扩展:计算是在多个线程、进程和服务器之间并行进行的。
可靠的消息处理:storm保证每个消息至少能得到一次完整处理 任务失败会负责从消息源重试消息
快速:底层消息队列是ZeroMQ
本地模式 :模拟Storm集群
Storm架构:
集群由一个主节点(类似于job tracker和namenode)和多个工作节点组成(master和slaver的架构)。主节点运行了一个Nimbus的守护进程,用于分配代码、布置任务及故障检测。每个工作节点都运行了一个名为Supervisor的守护进程,用于监听工作,开始并终止工作进程。Nimbus和supervisor都是无状态的,都能快速失败,十分健壮。两者的协调工作是由Zookeeper来完成的。ZooKper用于管理集群中的不同组件,ZeroMQ是内部消息系统,JZMQ是zeroMQ的Java binding。AWS上一键部署Storm集群用的是storm-deploy的子项目。
Hadoop和Storm的几个名词的对比
Jobtracker nimbus
Tasktracker supervisor
Child worker(是一个进程)
Job topology
Mapper/reducer spout/bolt
Task:每一个spout/bolt的线程称为一个task
多个task可能共享一个物理线程,称为一个executor
Topology:storm中运行的一个实时应用程序,各个组件间的消息流动形成逻辑上的一个拓扑结构
Spout:从外部数据源中读取数据转化为拓扑的源数据,有个nextTuple()方法,死循环,不停的调用
Bolt:接收源数据然后执行逻辑运算,可以执行过滤,函数操作,合并等。有个execute方法(Tuple input),接收数据后调用这个方法,在其中写自己的逻辑
Tuple:一次消息传递的基本单元,本来应该是一个key-value的map,但是由于tuple的字段需要事先定义好,所以tuple是一个value list。
二、 生产环境
操作系统:centos7
账户:root
机器: master、slaver1、slaver2共计三台机器。其中master为主节点,slaver1-2为工作节点。Master连接外网,slaver1-2通过千兆交换机与master相连。
防火墙关闭
软件版本:
JDK:1.7.0(支持Java)
Python:2.7.5(支持Python)
Zeromq: 2.1.7
Jzmq: master
Storm: 0.8.2
Zookeeper: 3.4.5
三、 部署过程
JDK安装
Python安装
Zeromq的安装
下载Zeromq源码包,解压并安装(master和slaver1-2都要安装)
tar -zxvf zeromq-2.1.7.tar.gz
cd ./zeromq-2.1.7
./configure
make
make install
4.下载jzmq安装包,解压并安装(master和slaver1-2都要安装)
unzip jzmq-master.zip
./autogen.sh
./configure
make
make install
Make的时候如果报错make[1]: * No rule to make target classdist_noinst.stamp', needed by
org/zeromq/ZMQ.class’. Stop.
解决方法:touch src/classdist_noinst.stamp
cd src/org/zeromq/ $ /jzmq/src/org/zeromq
javac *.java
下载zookeeper,解压。修改配置文件./conf/zoo.cfg文件(刚下载下来的不叫zoo.cfg,改一下就可以了)
#The number of milliseconds of each tick
tickTime=2000
# The number of ticks that the initial
# synchronization phase can take
initLimit=5
# The number of ticks that can pass between
# sending a request and getting an acknowledgement
syncLimit=2
# the directory where the snapshot is stored.
# do not use /tmp for storage, /tmp here is just
# example sakes.
dataDir=/usr/local/zookeeper
dataLogDir=/usr/local/zookeeper/log
# the port at which the clients will connect
clientPort=2181
server.0=192.168.122.1:2888:3888
server.1=192.168.122.2:2888:3888
server.2=192.168.122.3:2888:3888
#
# Be sure to read the maintenance section of the
# administrator guide before turning on autopurge.
#
# http://zookeeper.apache.org/doc/current/zookeeperAdmin.html#sc_maintenance
#
# The number of snapshots to retain in dataDir
#autopurge.snapRetainCount=3
# Purge task interval in hours
# Set to "0" to disable auto purge feature
#autopurge.purgeInterval=1
说明:(注意集群中机器个数应当为奇数,防止出现脑裂)
Zookeeper有三种模式,单机、伪集群、集群。三个的区别跟Hadoop其实是一样的
tickTime: zookeeper中使用的基本时间单位, 毫秒值.
dataDir: 数据目录. 可以是任意目录.此处设置为/usr/local/zookeeper
dataLogDir: log目录, 同样可以是任意目录.此处设置为/usr/local/zookeeper/log
clientPort: 监听client连接的端口号.此处设置为2181,不与正在使用的端口冲突即可
initLimit: zookeeper集群中的包含多台server, 其中一台为leader, 集群中其余的server为follower. initLimit参数配置初始化连接时, follower和leader之间的最长心跳时间. 此时该参数设置为5, 说明时间限制为5倍tickTime, 即5*2000=10000ms=10s.
syncLimit: 该参数配置leader和follower之间发送消息, 请求和应答的最大时间长度. 此时该参数设置为2, 说明时间限制为2倍tickTime, 即4000ms.
server.X=A:B:C 其中X是一个数字, 表示这是第几号server. A是该server所在的IP地址. B配置该server和集群中的leader交换消息所使用的端口. C配置选举leader时所使用的端口. 由于配置的是集群模式, 所以各个server的B, C参数必须不同.
将zookeeper下的bin文件夹加入/etc/profile文件的path中,并source一下使之生效
source /etc/profile
特别注意:
Log文件夹是不会自动建立的,需要手动建立。另外每一台机器的dataDir中需要手动建一个myid文件,根据设置的server编号往该文件里写一个数字。例如上面的server.0,那么在192.168.122.1的dataDir里建的myid文件中需要写入一个数字0.
上述软件编译安装过程中如发现缺少某些包,Ubuntu下apt-get search、centos下yum search 查询出包的具体名字,然后安装即可。
Centos下考虑到安装源可能包含的包不全面,建议先执行
yum install epel-release
EPEL为第三方源,即Extra Packages for Enterprise Linux,为CentOS提供了额外的10000多个软件包,而且在不替换系统组件方面下了很多功夫,因而可以放心使用。
6.下载storm,unzip解压。(master和slaver1-2都要部署)
修改配置文件./conf/storm.yaml(注意每一行最前面不能有空格,要删掉最前面的空格。否则报错)
## These MUST be filled in for a storm configuration
storm.zookeeper.servers:
- "192.168.122.1"
- "192.168.122.2"
- "192.168.122.3"
#
nimbus.host: "192.168.122.1"
storm.local.dir:"/usr/local/storm" ui.port: "18080"
supervisor.slots.ports:
- 6700
- 6701
- 6702
- 6703
注:根据你的cpu的能力可以多几个端口,每一个端口对应storm一个slot,可以运行storm的一个bolt,此处开设了四个端口。
zookeeper.server就是之前配置的。Nimbus.host是选取的master,storm.local.dir存储了一些storm的信息,可以随意设置,此处设置为/usr/local/storm。Ui.port指的是运行拓扑的时候的web观察端口,可在浏览器里看到。没有拓扑时通过master的地址:8080端口查看集群。
将storm下的bin文件夹加入/etc/profile文件的path中,并source一下使之生效
source /etc/profile
Zookeeper启动:
先启动zookeeper,从master开始,每台机器按之前配置文件中的顺序执行
zkServer.sh start
Jps查看发现有QuorumPeerMain即说明该台机器启动成功
全部机器启动完后
zkServer status
查看每台机器的状态,集群会选出一个leader,剩余的机器是follower。
Storm 启动:
在 master上执行
nohup storm nimbus //开启master的主守护进程
nohup storm ui
Jps查看出现nimbus,core
Ui开启是为了通过浏览器访问集群,类似于Hadoop
在slaver1-2上执行
nohup storm supervisor //开启工作节点的守护进程
Jps查看出现 supervisor