Storm基础
1. 离线计算与流式计算的概述
- 离线计算:批量获取数据、批量传输数据、周期性批量计算数据、数据展示,flum获取数据,Sqoop批量导入数据、HDFS批量存储数据、MapReduce批量计算数据、Hive批量计算数据
- 流式计算:数据实时产生、数据实时传输、数据实时计算、实时展示,Flume实时获取数据、Kafka/metaq实时数据存储、Storm/JStorm实时数据计算、Redis实时结果缓存、持久化存储(mysql)。
2. storm与hadoop的区别
- Storm用来实时处理数据,特点:低延迟、高可用、分布式、可扩展、数据不丢失。提供简单容易理解的接口,便于开发。
- Storm用于实时计算,Hadoop用于离线计算。
- Storm处理的数据保存在内存中,源源不断;Hadoop处理的数据保存在文件系统中,一批一批。
- Storm的数据通过网络传输进来;Hadoop的数据保存在磁盘中
3. 名词解析
Nimbus:负责资源分配和任务调度。
Supervisor:负责接受nimbus分配的任务,启动和停止属于自己管理的worker进程。—通过配置文件设置当前supervisor上启动多少个worker。
Worker:运行具体处理组件逻辑的进程。Worker运行的任务类型只有两种,一种是Spout任务,一种是Bolt任务。
Task:worker中每一个spout/bolt的线程称为一个task. 在storm0.8之后,task不再与物理线程对应,不同spout/bolt的task可能会共享一个物理线程,该线程称为executor。
Topology:Storm中运行的一个实时应用程序的名称。(拓扑)
Spout:在一个topology中获取源数据流的组件。
通常情况下spout会从外部数据源中读取数据,然后转换为topology内部的源数据。Bolt:接受数据然后执行处理的组件,用户可以在其中执行自己想要的操作。
Tuple:一次消息传递的基本单元,理解为一组消息就是一个Tuple。
Stream:表示数据的流向。
4. storm主键功能
DataSource:外部数据源
Spout:接受外部数据源的组件,将外部数据源转化成Storm内部的数据,以Tuple为基本的传输单元下发给Bolt
Bolt:接受Spout发送的数据,或上游的bolt的发送的数据。根据业务逻辑进行处理。发送给下一个Bolt或者是存储到某种介质上。介质可以是Redis可以是mysql,或者其他。
Tuple:Storm内部中数据传输的基本单元,里面封装了一个List对象,用来保存数据。
StreamGrouping:数据分组策略7种:shuffleGrouping(Random函数),Non Grouping(Random函数),FieldGrouping(Hash取模)、Local or ShuffleGrouping 本地或随机,优先本地。
- Nimbus:任务分配
- Supervisor:接受任务,并启动worker。worker的数量根据端口号来的。
- Task:Task=线程=executor。 一个Task属于一个Spout或者Bolt并发任务。
- Zookeeper:保存任务分配的信息、心跳信息、元数据信息。
5. storm安装
1. 创建文件夹,上传安装包,解压文件,重命名为storm
mkdir /export/servers
tar -zxvf apache-storm-1.0.0.tar.gz -C /export/servers
mv apache-storm-1.0.0 storm
2. 配置环境变量
vi /etc/profile
export STORM_HOME=/export/servers/storm
export PATH=$PATH:$STORM_HOME/bin
3. 配置文件
vi storm.yaml
**注意:没行前面必须有空格**
#指定storm使用的zk集群
storm.zookeeper.servers:
- "master"
- "work1"
- "work2"
#指定storm集群中的nimbus节点所在的服务器
nimbus.host: "master"
#指定nimbus启动JVM最大可用内存大小
nimbus.childopts: "-Xmx1024m"
#指定supervisor启动JVM最大可用内存大小
supervisor.childopts: "-Xmx1024m"
#指定supervisor节点上,每个worker启动JVM最大可用内存大小
worker.childopts: "-Xmx768m"
#指定ui启动JVM最大可用内存大小,ui服务一般与nimbus同在一个节点上。
ui.childopts: "-Xmx768m"
#指定supervisor节点上,启动worker时对应的端口号,每个端口对应槽,每个槽位对应一个worker
supervisor.slots.ports:
- 6700
- 6701
- 6702
- 6703
4. 分发到其他机器上: scp -r /export/servers root@slave2:/export/servers/
5. 启动
master中启动nimbus和ui:
nohup storm nimbus &
nohup storm ui &
supervis机器上启动:
nohup storm supervisor &
6. Storm常用操作命令
提交任务命令格式:storm jar 【jar路径】 【拓扑包名.拓扑类名】 【拓扑名称】
bin/storm jar examples/storm-starter/storm-starter-topologies-0.9.6.jar storm.starter.WordCountTopology wordcount杀死任务命令格式:storm kill 【拓扑名称】 -w 10(执行kill命令时可以通过-w [等待秒数]指定拓扑停用以后的等待时间)
storm kill topology-name -w 10停用任务命令格式:storm deactivte 【拓扑名称】
storm deactivte topology-name
我们能够挂起或停用运行中的拓扑。当停用拓扑时,所有已分发的元组都会得到处理,但是spouts的nextTuple方法不会被调用。销毁一个拓扑,可以使用kill命令。它会以一种安全的方式销毁一个拓扑,首先停用拓扑,在等待拓扑消息的时间段内允许拓扑完成当前的数据流。启用任务命令格式:storm activate【拓扑名称】
storm activate topology-name重新部署任务命令格式:storm rebalance 【拓扑名称】
storm rebalance topology-name
7. strorm集群的日志
- nimbus的日志信息: tail -100f /export/servers/storm/logs/nimbus.log
- ui运行日志信息: tail -100f /export/servers/storm/logs/ui.log
- supervisor运行日志信息: tail -100f /export/servers/storm/logs/supervisor.log
8. 运行jar包 问题
- Exception in thread “main” java.lang.NoClassDefFoundError: backtype/storm/topology/IRichSpout
jar包不兼容,在客户端打包的时候引入的storm jar 包要和linux端安装的storm版本一样,不然API 不兼容。 - rg.apache.storm.utils.NimbusLeaderNotFoundException: Could not find leader nimbus from seed hosts [“master” “slave1”]. Did you specify a valid list of nimbus hosts for config nimbus.seeds?