Storm部署

来源:互联网 发布:万网域名需要备案吗 编辑:程序博客网 时间:2024/05/27 03:30

Storm 集群部署

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      nimbusTasktracker     supervisorChild           worker(是一个进程)Job             topologyMapper/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

三、 部署过程

  1. JDK安装

  2. Python安装

  3. 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 byorg/zeromq/ZMQ.class’. Stop.

解决方法:touch src/classdist_noinst.stampcd src/org/zeromq/ $ /jzmq/src/org/zeromqjavac *.java
  1. zookeeper的部署(master和slaver1-2都要安装,配置文件一样)

下载zookeeper,解压。修改配置文件./conf/zoo.cfg文件(刚下载下来的不叫zoo.cfg,改一下就可以了)

#The number of milliseconds of each ticktickTime=2000# The number of ticks that the initial# synchronization phase can takeinitLimit=5# The number of ticks that can pass between# sending a request and getting an acknowledgementsyncLimit=2# the directory where the snapshot is stored.# do not use /tmp for storage, /tmp here is just# example sakes.dataDir=/usr/local/zookeeperdataLogDir=/usr/local/zookeeper/log# the port at which the clients will connectclientPort=2181server.0=192.168.122.1:2888:3888server.1=192.168.122.2:2888:3888server.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 configurationstorm.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

0 0