07-storm
来源:互联网 发布:竞价优化 编辑:程序博客网 时间:2024/06/06 20:20
特点
低延迟、高可用、分布式、可扩展、数据不丢失。提供简单容易理解的接口,便于开发。
场景
- 日志分析
从海量日志中分析出特定的数据,并将分析的结果存入外部存储器用来辅佐决策。 - 管道系统
将一个数据从一个系统传输到另外一个系统,比如将数据库同步到Hadoop - 消息转化器
将接受到的消息按照某种格式进行转化,存储到另外一个系统如消息中间件
案列
- 一淘-实时分析系统
实时分析用户的属性,并反馈给搜索引擎
最初,用户属性分析是通过每天在云梯上定时运行的MR job来完成的。为了满足实时性的要求,希望能够实时分析用户的行为日志,将最新的用户属性反馈给搜索引擎,能够为用户展现最贴近其当前需求的结果。 - 携程-网站性能监控
实时分析系统监控携程网的网站性能
利用HTML5提供的performance标准获得可用的指标,并记录日志。Storm集群实时分析日志和入库。使用DRPC聚合成报表,通过历史数据对比等判断规则,触发预警事件。 - 阿里妈妈-用户画像
实时计算用户的兴趣数据
为了更加精准投放广告,阿里妈妈后台计算引擎需要维护每个用户的兴趣点(理想状态是,你对什么感兴趣,就向你投放哪类广告)。用户兴趣主要基于用户的历史行为、用户的实时查询、用户的实时点击、用户的地理信息而得,其中实时查询、实时点击等用户行为都是实时数据。考虑到系统的实时性,阿里妈妈使用Storm维护用户兴趣数据,并在此基础上进行受众定向的广告投放。
Topology
Storm中运行的一个实时应用程序的名称。(拓扑)
Spout
在一个topology中获取源数据流的组件。
通常情况下spout会从外部数据源中读取数据,然后转换为topology内部的源数据。
Bolt
接受数据然后执行处理的组件,用户可以在其中执行自己想要的操作。
Tuple
一次消息传递的基本单元,理解为一组消息就是一个Tuple。
常用操作命令
提交任务
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
再平衡使你重分配集群任务。这是个很强大的命令。比如,你向一个运行中的集群增加了节点。
再平衡命令将会停用拓扑,然后在相应超时时间之后重分配工人,并重启拓扑。
Storm里面有7种类型的stream grouping
- Shuffle Grouping
随机分组, 随机派发stream里面的tuple,保证每个bolt接收到的tuple数目大致相同。 - Fields Grouping
按字段分组,比如按userid来分组,具有同样userid的tuple会被分到相同的Bolts里的一个task,而不同的userid则会被分配到不同的bolts里的task。 - All Grouping
广播发送,对于每一个tuple,所有的bolts都会收到。 - Global Grouping
全局分组, 这个tuple被分配到storm中的一个bolt的其中一个task。再具体一点就是分配给id值最低的那个task。 - Non Grouping
不分组,这stream grouping个分组的意思是说stream不关心到底谁会收到它的tuple。目前这种分组和Shuffle grouping是一样的效果, 有一点不同的是storm会把这个bolt放到这个bolt的订阅者同一个线程里面去执行。 - Direct Grouping
直接分组, 这是一种比较特别的分组方法,用这种分组意味着消息的发送者指定由消息接收者的哪个task处理这个消息。
只有被声明为Direct Stream的消息流可以声明这种分组方法。而且这种消息tuple必须使用emitDirect方法来发射。
消息处理者可以通过TopologyContext来获取处理它的消息的task的id (OutputCollector.emit方法也会返回task的id)。 - Local or shuffle grouping
如果目标bolt有一个或者多个task在同一个工作进程中,tuple将会被随机发生给这些tasks。否则,和普通的Shuffle Grouping行为一致。
概念
- Workers (JVMs)
在一个物理节点上可以运行一个或多个独立的JVM 进程。
一个Topology可以包含一个或多个worker(并行的跑在不同的物理机上), 所以worker process就是执行一个topology的子集,
并且worker只能对应于一个topology - Executors (threads)
在一个worker JVM进程中运行着多个Java线程。一个executor线程可以执行一个或多个tasks。
但一般默认每个executor只执行一个task。一个worker可以包含一个或多个executor, 每个component (spout或bolt)至少对应于一个executor,
所以可以说executor执行一个compenent的子集, 同时一个executor只能对应于一个component。 - Tasks(bolt/spout instances)
Task就是具体的处理逻辑对象,每一个Spout和Bolt会被当作很多task在整个集群里面执行。
每一个task对应到一个线程,而stream grouping则是定义怎么从一堆task发射tuple到另外一堆task。
你可以调用TopologyBuilder.setSpout和TopBuilder.setBolt来设置并行度 — 也就是有多少个task。
配置并行度
对于并发度的配置, 在storm里面可以在多个地方进行配置, 优先级为:
defaults.yaml < storm.yaml < topology-specific configuration
< internal component-specific configuration < external component-specific configuration
- worker processes的数目
可以通过配置文件和代码中配置, worker就是执行进程, 所以考虑并发的效果, 数目至少应该大亍machines的数目- executor的数目
component的并发线程数,只能在代码中配置(通过setBolt和setSpout的参数), 例如, setBolt(“green-bolt”, new GreenBolt(), 2)
- executor的数目
- tasks的数目
可以不配置, 默认和executor1:1, 也可以通过setNumTasks()配置
Topology的worker数通过config设置,即执行该topology的worker(java)进程数。它可以通过 storm rebalance 命令任意调整。
- 07-storm
- STORM
- storm
- Storm
- storm
- storm
- storm
- storm
- storm
- storm
- storm
- Storm
- storm
- storm
- storm
- Storm
- Storm
- Storm
- java Hotspot 内存管理白皮书
- 【安全牛学习笔记】TCPDUMP-抓包、筛选、高级筛选、过程文档记录
- 关于换工作
- 第一个AndRoid程序,主要内容
- [BZOJ2001][HNOI2010]City城市建设-CDQ分治
- 07-storm
- [0] Hello World
- DescriptionResource Path Location Type web.xml is missing and <failOnMissingWebXml> is set to true
- 栈-----noip2011 选择客栈
- Kappa:比Lambda更好更灵活的实时处理架构
- Python中的lambda
- CCS中的GEL语言
- Android 事件分发机制源码攻略(二) —— ViewGroup篇
- vue项目中weChat的title问题