storm学习从基础到入门-基础概念介绍

storm:实时处理

引入:
流式计算 逻辑一般简单 效率高(内存中运算,一遍取一边运算,能达到每秒55M的吞吐)
处理日志,拿到ip,分区域
类似:spark streaming,
kafka;生产者 消费者(storm,spark…) 做数据传输
flume:高吞吐量分布式采集组件,用法以配置为主,source target

滑动窗口
案例:实时推荐,预警:疾病预警,趋势运算:报表

概念:
分布式实时流式计算平台
数据分析系统组成:客户端-数据仓库-并行计算系统=(批处理计算系统和实时计算系统)-资源调度系统-存储系统
流处理和批处理:storm是数据多次处理一次写入,hadoop是一次写入,多次查询使用,storm运行起来后是持续不断的,hadoop只是业务需要时调用数据。

本地模式
搭建平台:Ubuntu
JDK
Python,检查:python -V

安装zookeeper
解压 tar
进入conf,从配置模板复制配置文件
cp conf/zoo_sample.cfg conf/zoo.cfg(暂时无需修改)
配置环境变量
启动fuwuq,查看状态
bin/zkServer.sh start/status
如果正常启动命令栏中会显示mode:standalone

安装storm
下载,解压,配置环境变量
cd ./apache-storm-0.9.5/
配置conf下的storm.yaml
将如下的参数设置添加到该文件中(可能出现的错误:在修改文件时不要加不必要的特殊字符:如制表符,storm在启动守护进程时会读取storm.yaml里面的配置信息,对storm.yaml里面文本的格式要求比较严格,在设置参数值时冒号后面记得加一个空格)
storm.zookeeper.servers: - “localhost”
nimbus.host: “localhost”
storm.local.dir : “/var/storm”
ui.port : 8080

后台启动storm服务

启动nimbus:storm nimbus &
启动ui:storm ui &
启动supervisor:storm suppervisor & (前提是zk得起来,至少保证有一个是起来的)
启动logviewer:storm logviewer & (在)

运行任务:storm jar jar包 类的全包名 文件位置

nimbus:相当于master,主要用于分发任务,并做统一协调,不参与计算
zookeeper:调度
supervisor:相当于从节点,用于计算 <—真正执行的是worker(相当于进程) excutor(相当于线程)
grouping:

编程模型:
spout:一般处理数据源,如果数据源有多个,spout也可以有多个
open <—datasource
nextTuple --> emit 把一系列的数据处理后形成nextTup,context利用emit方法
bolt:对接spout或者bolt,任何bolt如果对接bolt,他就作为一个源存在,形成链式结构
prepare: <—context
excute --> emit
close
topology
spout - group --> bolt --> bolt …
config<k,v>
submit

LocalTopology:本地测试,测试逻辑,流程是否有错
Cluster:集群测试

Topology 拓扑 : storm中运行的一个实时应用程序,因为各个组件间的消息流动形成逻辑上的一个拓扑结构。topology会永远执行。
角色
nimbus:主控节点,主节点通常运行一个后台程序-nimbus,用于响应分布在集群中的节点,分配任务和检测故障,这个很类似于Hadoop中的Job Tracker
supervisor: 工作节点,同样会运行一个后台程序-supervisor,用于收听工作指派并基于要求运行工作进程。每个工作节点都是topology中一个子集的实现,而Nimbus和Supervisor之间的协调则通过Zookeeper。
Nimbus和Supervisor都是快速失败和无状态的,所有的状态要么在Zk里面,要么在本地磁盘,这也就意味着你可以杀死Nimbus和Supervisor进程,然后再重启它们,就好像什么都没发生过
zookeeper
worker: 运行具体处理逻辑的进程,一个worker就是一个独立的JVM进程,每个节点都可以通过配置运行一个或多个worker,指定多个worker,就是并行计算
task: worker中每一个spout/bolt的线程称为一个task,同一个spout/bolt的task可能会共享一个物理线程,该线程称之为executor
executor: 一个worker JVM中运行的线程。一个worker进程可以执行一个或多个task,storm默认一个executor分配一个task

tuple:一次消息传递的基本单元,元组。本来应该是一个Key-Value的Map,但是由于各个组件间传递的tuple字段名称已经实现定义好,所以tuple中只要按序填入value就行了,所以就是一个value List。
stream:以tuple为单位组成的一条有向无界的数据流

Spout:
Spout分成可靠和不可靠两种;当Storm接收失败时,也就是这个tuple没有被storm成功处理,可靠的Spout会对tuple(元组,数据项组成的列表)进行重发;而不可靠的Spout不会考虑接收成功与否,只发射一次。而Spout中最主要的方法就是nextTuple(),该方法会发射一个新的tuple到topology,如果没有新的tuple发射则会简单的返回。
消息源可以发射多条消息流stream。使用OutputFieldDeclarer.declareStream来定义多个stream,然后使用SpoutOutputCollector发射指定 的stream
tuple树,可靠与不可靠,

另外两个比较重要的spout方法时ack和fail。storm在检测到一个tuple被整个topology成功处理的时候调用ack,否则调用fail,storm只对可靠的spout调用ack和fail。

Bolt:
topology中所有的处理都由bolt完成
Bolt可以完成任何事,比如:连接的过滤、聚合、访问文件、数据库等等。Bolt从Spout中接收数据并进行处理,如果遇到复杂流的处理也可能将tuple发送给另一-个Bolt进行处理。而Bolt中 最重要的方法是execute ( ),以新的tuple作为参数接收。
Bolts可以简单的做消息流的传递。复杂的消息流处理往往需要很多步骤,从而也就需要经过很多bolts。
Bolts的主要方法是execute,它以一个tuple作为输入,bolts 使用OutputCollector来发射tuple, bolts必须要为它处理的每一个tuple调用OutputCollector的ack方法,以通知Storm这个tuple被处理完成了,从而通知这个tuple的发射者spouts。一般的流程是: bolts处理一个输入tuple,发射0个或者多个tuple,然后调用ack通知storm自己已经处理过这个tuple了。storm提供了-一个IBasicBolt会自动调用ack。
不管是Spout还是bolt,如果将tuple发射成多个流,这些流都可以通过declareStream()来声明

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值