(1)Storm简介
Storm最早是由BackType公司开发的实时处理系统,底层由Clojure实现。Clojure也是一门基于JVM的高级面向函数式的编程语言。2011年Twitter公司收购了BackType公司,便使用Storm帮助企业解决了实时海量数据处理的问题。阿里巴巴在Storm基础上,使用Java代替Clojure实现了核心,并在性能上进行了优化,产生了JStorm。目前Storm和JStorm都由Apache基金会组织管理。
(2)Storm特性
自由共享、开源的分布式实时计算系统;实时计算领域的Hadoop;编程模型简单,并且支持多种编程语言;高性能,低延迟;易扩展;容错;消息不丢失。
(3)Storm使用场景
1)信息流处理 Stream Processing
处理源源不断产生的消息,并将处理之后的结果存储到某个存储系统中去,典型的架构是Kafka+Storm+HBase(或redis)。
2)连续计算 Continuous Computation
Storm可进行连续查询并把结果即时反馈给客户端,比如把微博上的热门话题发送到浏览器上。
3)分布式远程过程调用 Distributed RPC
用来处理并行密集查询,客户端向Storm提交一个查询请求和查询参数,Storm运行Topology并行处理,并将结果同步返回给客户端。
4)在线机器学习
(4)Storm与Hadoop的联系与区别
Storm只是一个实时分布式计算框架,但可以读取hdfs上的文件进行批量计算,另外Storm可以运行在Yarn上。Hadoop的hdfs是分布式文件存储系统,mapreduce+Yarn批量离线计算。
Storm的计算任务为Topology,提交到Storm集群上运行,除非手动执行kill命令,否则会一直运行下去。MapReduce数据处理完毕,就会停止。
(5)Storm与SparkStreaming的联系与区别
Storm是真正的实时处理框架,针对数据,来一条记录就处理一次,是一种流式数据处理技术框架,运行级别达到毫秒级别。
SparkStreaming是一种微批数据处理框架,运行级别达到秒级。
(1)Nimbus
Nimbus为Storm的主节点,本身无状态。接收客户端任务Topology的提交,并负责在集群中分发代码,即jar包。分配工作给从节点supervisor,注意不是直接分配,而是将任务发布到zookeeper上,由supervisor到zookeeper上领取任务。监听集群状态。当Supervisor节点挂掉,由Nimbus将该节点上正在运行着的任务重新分配给其他Supervisor执行。
(2)Supervisor
Supervisor为Storm的从节点。从Zookeeper上获取nimbus分配的任务,负责启动和停止本机上worker进程来执行任务。需要将自己的运行状态信息汇报到zookeeper上,由nimbus监控。
(3)worker
worker进程负责启动executor线程来执行任务。负责与其他worker之间进行数据传输。需要将自己的运行状态汇报到zookeeper上,由nimbus监控。
(4)Executor
真正执行任务的线程,由worker启动和停止,executor负责执行客户提交到Storm集群上任务中Task(spout/bolt)。
(5)ZooKeeper
ZooKeeper存储任务调度信息、各节点状态信息、心跳。使Storm集群各节点保持无状态,这样具有高可靠性。zk上storm各znode存储数据类型如下:
znode | 存储的数据 |
---|---|
/storm/supervisors/supervisor-id | supervisor节点的状态信息 |
/storm/storms/topology-id | topology基本信息 |
/storm/assignments/topology-id | topology任务的分配信息 |
/storm/workbeats/topology-id/worker-id | worker工作进程的状态信息 |
/storm/errors/topology-id | topology在运行过程中出现异常的task信息,方便Nimbus将运行出错的任务进行重新分配 |
/storm/workerbeats/wordcount-3-1471753943/各个worker对应的znode | wordcount任务的各个worker工作进程的状态信息 |
(6)UI
在storm.yaml配置文件中通过配置ui.port参数来指定web ui访问端口。UI需要与nimbus运行在同一台服务器上。
(7)Logviewer
Logviewer是Storm集群任务运行过程中的日志收集进程,需要在每个Supervisor所在的节点上启动。
(8)Netty
Netty是storm底层通信框架,替代了0.9版本之前的zeroMq。
(1)Storm的安装前提
Python版本:2.6.6以上。
$ python --version
Python 2.6.6
(2)Storm安装
1)解压安装包
Storm安装包版本:0.9.6,参考文档:
http://storm.apache.org/2015/11/05/storm096-released.html
http://storm.apache.org/downloads.html
softwares]$ tar -zxf apache-storm-0.9.6.tar.gz -C /opt/modules/
2)修改配置文件/opt/modules/apache-storm-0.9.6/conf/storm_env.ini,配置JDK环境。
JAVA_HOME:/opt/modules/jdk1.7.0_67
3)修改配置文件/opt/modules/apache-storm-0.9.6/conf/storm.yaml,配置storm相关参数。
########### These MUST be filled in for a storm configuration
storm.zookeeper.servers:
- "bigdata-senior.ibeifeng.com"
# - "server2"
#
nimbus.host: "bigdata-senior.ibeifeng.com"
storm.local.dir: "/opt/modules/apache-storm-0.9.6/workspace"
supervisor.slots.ports:
- 6700
- 6701
- 6702
- 6703
ui.port: 8081
配置文件/opt/modules/apache-storm-0.9.6/conf/storm.yaml中常用的配置参数如下:
配置选项名称 | 配置选项作用 |
---|---|
topology.max.task.parallelism | 每个Topology运行时最大的Executor数目 |
topology.workers | 每个Topology运行时的worker的默认数目,若在代码中设置,则此选项值被覆盖 |
storm.zookeeper.servers | zookeeper所在服务器地址 |
storm.local.dir | Storm用于存储jar包和临时文件的本地存储目录 |
storm.zookeeper.root | zookeeper的根节点 |
ui.port | UI进程端口号 |
nimbus.host | nimbus主机地址 |
supervisor.slots.ports | supervisor进程端口号 |
supervisor.worker.timeout.secs | supervisor进程超时时间 |
drpc.servers | 在使用drpc服务时,drpc server的服务器列表 |
drpc.port | 在使用drpc服务时,drpc server的服务端口 |
(3)Storm集群启动
1)启动ZooKeeper
zookeeper-3.4.5]$ zkServer.sh start
$ jps
2890 QuorumPeerMain
2)启动nimbus
apache-storm-0.9.6]$ bin/storm nimbus
[beifeng@bigdata-senior apache-storm-0.9.6]$ nohup bin/storm nimbus
nohup: ignoring input and appending output to `nohup.out'
[beifeng@bigdata-senior apache-storm-0.9.6]$ nohup bin/storm nimbus > /dev/null 2>&1
[beifeng@bigdata-senior apache-storm-0.9.6]$ nohup bin/storm nimbus > /dev/null 2>&1 &
[1] 2695
$ ps -ef | grep daemon.nimbus
$ jps
2931 nimbus
3)启动supervisor
apache-storm-0.9.6]$ nohup bin/storm supervisor > /dev/null 2>&1 &
$ ps -ef | grep daemon.supervisor
$ jps
3001 supervisor
4)启动ui
apache-storm-0.9.6]$ nohup bin/storm ui > /dev/null 2>&1 &
$ ps -ef | grep ui.core
$ netstat -tlnup | grep 8081
$ jps
3095 core
ui界面:http://bigdata-senior.ibeifeng.com:8081/index.html
5)启动logviewer
apache-storm-0.9.6]$ nohup bin/storm logviewer > /dev/null 2>&1 &
$ ps -ef | grep daemon.logviewer
$ jps
3411 logviewer
[beifeng@bigdata-senior apache-storm-0.9.6]$ jps
3475 Jps
2931 nimbus
3001 supervisor
2890 QuorumPeerMain
3411 logviewer
3095 core
6)启动DRPC
apache-storm-0.9.6]$ nohup bin/storm drpc > /dev/null 2>&1 &
(4)Storm集群停止
$ kill -9 `ps -ef | grep daemon.nimbus | awk '{print $2}' | head -n 1`
$ kill -9 `ps -ef | grep daemon.supervisor | awk '{print $2}' | head -n 1`
$ kill -9 `ps -ef | grep ui.core | awk '{print $2}' | head -n 1`
$ kill -9 `ps -ef | grep daemon.logviewer | awk '{print $2}' | head -n 1`
(5)ZooKeeper的批启动脚本 zookeeper.sh(统一写在节点nimbus服务器)
#!/bin/bash
if [ $# -ne 1 ];then
echo "Usage: bin/zkServer.sh {start|start-foreground|stop|restart|status|upgrade|print-cmd}"
exit 4
fi
source /etc/profile
ZK_HOME=/opt/modules/zookeeper-3.4.5-cdh5.3.6
for node in hive-stu.ibeifeng.com
do
echo "$1 zookeeper in $node"
ssh $node "source /etc/profile && $ZK_HOME/bin/zkServer.sh $1"
done
(6)Storm的批启动脚本 start-storm.sh(统一写在节点nimbus服务器)
主节点上启动nimbus和ui,从节点上启动supervisor和logviewer。
#!/bin/bash
source /etc/profile
STORM_HOME=/opt/modules/apache-storm-0.9.6
#先在主节点上启动nimbus和ui进程
$STORM_HOME/bin/storm nimbus >/dev/null 2>&1 &
$STORM_HOME/bin/storm ui >/dev/null 2>&1 &
#在从节点上启动logviewer和supervisor
SUPERVISORS=$(cat $STORM_HOME/conf/supervisors)
for supervisor in $SUPERVISORS
do
echo "start supervisor and logviewer in $supervisor"
ssh $supervisor "source /etc/profile && nohup $STORM_HOME/bin/storm supervisor >/dev/null 2>&1" >/dev/null 2>&1 &
ssh $supervisor "source /etc/profile && nohup $STORM_HOME/bin/storm logviewer >/dev/null 2>&1" >/dev/null 2>&1 &
done
(7)Storm的批停止脚本 stop-storm.sh(统一写在节点nimbus服务器)
在storm的主节点上添加一个指定supervisor节点的文件/opt/modules/apache-storm-0.9.6/conf/supervisors,内容:一行一个Supervisor节点服务器主机名。
#!/bin/bash
source /etc/profile
STORM_HOME=/opt/modules/apache-storm-0.9.6
#先在主节点上停止nimbus和ui进程
kill -9 `ps -ef | grep daemon.nimbus | awk '{print $2}' | head -n 1`
kill -9 `ps -ef | grep ui.core | awk '{print $2}' | head -n 1`
#在从节点上停止logviewer和supervisor
SUPERVISORS=$(cat $STORM_HOME/conf/supervisors)
for supervisor in $SUPERVISORS
do
echo "stop supervisor and logviewer in $supervisor"
ssh $supervisor kill -9 `ssh $supervisor ps -ef | grep daemon.supervisor | awk '{print $2}'|head -n 1`
ssh $supervisor kill -9 `ssh $supervisor ps -ef | grep daemon.logviewer | awk '{print $2}'|head -n 1`
done
(8)运行WordCountTopology
apache-storm-0.9.6]$ bin/storm jar examples/storm-starter/storm-starter-topologies-0.9.6.jar storm.starter.WordCountTopology wordcount
注意:这里的mainclass完全限定名,不像之前运行MapReduce案例一样有提示,因此需要先使用jar xvf storm-starter-topologies-0.9.6.jar | grep -i wordcount
来查看。
{"topology.workers":3,"topology.debug":true}
杀掉任务:apache-storm-0.9.6]$ bin/storm kill wordcount