1. 什么是storm
一款开源的分布式,高容错的实时框架.用来处理实时数据.
特点:
- 低延迟: 实时系统,延迟一定要底.
- 高性能
- 分布式
- 可扩展
- 容错
数据的输入 Spout—> 数据计算 Bolt1 …—> 数据输出 BoltN —> 数据计算 BlotN+1 —> 数据输出 BlotN….
1.1 什么是离线数据?
离线计算:批量获取数据、批量传输数据、周期性批量计算数据、数据展示
代表技术:Sqoop批量导入数据、HDFS批量存储数据、MapReduce批量计算数据、Hive批量计算数据、*任务调度
日常业务:
1,hivesql
2、调度平台
3、Hadoop集群运维
4、数据清洗(脚本语言)
5、元数据管理
6、数据稽查
7、数据仓库模型架构
1.2 什么是流式计算?
流式计算: 数据实时产生,数据实时传输,数据实时计算,实时展示.
代表技术:Flume实时获取数据、Kafka/metaq实时数据存储、Storm/JStorm实时数据计算、Redis实时结果缓存、持久化存储(mysql)。
一句话总结:将源源不断产生的数据实时收集并实时计算,尽可能快的得到计算结果,用来支持决策。
1.3 离线计算与实时计算的区别
最大的区别:实时收集、实时计算、实时展示
离线计算,一次计算很多条数据
实时计算,数据被一条一条的计算
2. storm的核心组件
2.1 storm架构
- Nimbus: 负责资源分配和任务调度
- Supervisor: 负责接收nimbus分配的任务,启动和停止属于自己管理的worker进程.
- Worker: 运行具体处理组件逻辑的进程.
- Task: worker中 每个 spout/bolt的线程成为一个task,在strom0.8之后,task不再与物理线程对应,同一个spout/bolt的task可能会共享一个物理线程,该线程成为executor.
2.2 storm编程模型
- Topology: storm中运行的一个实时应用程序,因为各个组件之间的消息流动形成逻辑上的一个拓扑结构
- Spout: 在一个topology中产生源数据流的组件.通常情况下,spout会从外部数据源中读取数据,然后转换为topology内部的源数据.Spout是一个主动的角色,其接口中 nextTuple()函数,strom框架会不停的调用此函数,用户只要在其中生成源数据即可.
- Bolt: 在一个togology中接收数据然后执行处理的组件.Bolt可以执行过滤,函数操作,合并,写数据库等操作.Bolt是一个被动的角色,其接口中有个execute(Tuple input)函数,在接收到消息后会调用此函数,用户可以在其中执行自己想要的操作.
- Tuple: 一次消息传递的基本单元. 本是key-value中的map,但由于各个组件之间传递的tuple的字段名称已经事先定义好,所有tuple中只要按照顺序填入各个value即可,所有就是一个value list.
- Stream: 源源不断的tuple就形成了stream.
2.3 Stream grouping
Streamgrouping:即消息的partition方法。
StreamGrouping定义了一个流在Bolt任务间该如何被切分。这里有Storm提供的6个StreamGrouping类型:
- 随机分组(Shuffle grouping):随机分发tuple到Bolt的任务,保证每个任务获得相等数量的tuple。 跨服务器通信,浪费网络资源,尽量不适用
- 字段分组(Fields grouping):根据指定字段分割数据流,并分组。例如,根据“user-id”字段,相同“user-id”的元组总是分发到同一个任务,不同“user-id”的元组可能分发到不同的任务。 跨服务器,除非有必要,才使用这种方式。
- 全部分组(All grouping):tuple被复制到bolt的所有任务。这种类型需要谨慎使用。 人手一份,完全不必要
- 全局分组(Global grouping):全部流都分配到bolt的同一个任务。明确地说,是分配给ID最小的那个task。 欺负新人
- 无分组(None grouping):你不需要关心流是如何分组。目前,无分组等效于随机分组。但最终,Storm将把无分组的Bolts放到Bolts或Spouts订阅它们的同一线程去执行(如果可能)。
- 直接分组(Direct grouping):这是一个特别的分组类型。元组生产者决定tuple由哪个元组处理者任务接收。 点名分配 AckerBolt 消息容错
7.LocalOrShuffle 分组。 优先将数据发送到本地的Task,节约网络通信的资源。
2.4 流式计算整体结构
网站系统<—-Flume集群—->kafka集群—–>Strom集群—->Redis集群
- flume 获取数据
- kafka 临时保存数据
- storm计算数据
- Redis 内存数据库,保存数据
3. Strom案例分析
略…
4. storm集群安装部署
jdk
zookeeper
strom
下载安装包
1
wget http://124.202.164.6/files/1139000006794ECA/apache.fayea.com/storm/apache-storm-0.9.5/apache-storm-0.9.5.tar.gz
解压安装包
1
2
3tar -zxvf apache-storm-0.9.5.tar.gz -C /export/servers/
cd /export/servers/
ln -s apache-storm-0.9.5 storm修改配置文件
1
2mv /export/servers/storm/conf/storm.yaml /export/servers/storm/conf/storm.yaml.bak
vi /export/servers/storm/conf/storm.yaml输入一下内容
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21指定storm使用的zk集群
storm.zookeeper.servers:
- "zk01"
- "zk02"
- "zk03"
指定storm集群中的nimbus节点所在的服务器
nimbus.host: "storm01"
指定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分发安装包
1
2
3
4
5
6
7scp -r/export/servers/apache-storm-0.9.5 storm02:/export/servers
然后分别在各机器上创建软连接
cd/export/servers/
ln -sapache-storm-0.9.5 storm
启动集群
1
2
3
4
5
6
7
8
9
10
11
12
13
14在nimbus.host所属的机器上启动 nimbus服务
cd /export/servers/storm/bin/
nohup ./storm nimbus &
黑洞: nohup ./strom nimbus >/dev/null 2>&1 &
在nimbus.host所属的机器上启动ui服务
cd /export/servers/storm/bin/
nohup ./storm ui &
黑洞: nohup ./strom ui >/dev/null 2>&1 &
在其它个点击上启动supervisor服务
cd /export/servers/storm/bin/
nohup ./storm supervisor &
黑洞: nohup ./strom supervisor >/dev/null 2>&1 &