Strom
storm
实时分析概念
离线分析
通常是 需要一段时间的数据积累 积累到一定数量数据后 开始离线分析 无论数据量多大 离线分析 有开始 也有结束 最终得到一个处理的结果 这样的分析过程 得到的结果是有较大的延迟的
实时分析
通常 数据不停的到来 随着数据的到来 来进行增量的运算 立即得到新数据的处理结果 并没有一个数据积累的过程 有开始 但是没有明确的结束的时刻 数据实时的进行运算 基本没有延迟
Storm概述
Storm是一个开源的分布式实时计算系统,可以简单、可靠的处理大量的数据流。
Storm有很多使用场景:如实时分析,在线机器学习,持续计算,分布式RPC,ETL等等。
Storm支持水平扩展,具有高容错性,保证每个消息都会得到处理。
Storm性能优良,处理速度很快(在一个小集群中,每个结点每秒可以处理数以百万计的消息)。
Storm的部署和运维都很便捷,而且更为重要的是可以使用任意编程语言来开发应用。
Storm组件
Topology(拓扑)
Topology由Spout(喷嘴) 和 Bolt(阀门)组成
Spout(喷嘴)
Spout负责连接外部数据源 接收数据 并将数据 转换为Tuple格式 向后发送 可以发送给 一个或多个Bolt
Spout通常只负责接收 转换 发送数据,不会进行任何的业务处理
Bolt(阀门)
Bolt负责接收上游传入的Tuple数据,进行相应的运算,再将结果发送给后续的零个或多个Bolt
从而利用Spuot和Bolt组建起复杂的数据流处理网络 实现实时处理
Storm将实时运算的过程 拆分为若干简单的步骤 再组装在一起完成复杂计算任务 以便于实现分布式的流式处理
Storm的并发机制
Storm可以在如下的四个级别上存在并发
1)Node服务器
配置在Storm集群中的一个服务器,会执行Topology的一部分运算,一个Storm集群中包含一个或者多个Node
2) Worker进程
JVM虚拟机、进程。指一个Node上相互独立运作的JVM进程,每个Node可以配置运行一个或多个worker。一个Topology会分配到一个或者多个worker上运行。
3)Executor线程
指一个worker的jvm中运行的java线程。多个task可以指派给同一个executer来执行。除非是明确指定,Storm默认会给每个executor分配一个task。
4)Task任务
bolt/spout实例。task是spout或bolt的实例,他们的nextTuple()和execute()方法会被executors线程调用执行。一个线程可以同时处理多个Task。
storm的并发控制
默认并发控制
如果不进行任何配置,默认并发度为1,也即,默认情况下一个Node服务器上运行一个Worker进程,一个Worker进程里分配多个Executor线程,而每个Executor线程分别负责一个Task任务,此时唯一的并发处在线程级别。
人为指定并发度
Node级别
Node级别的并发度无法通过代码控制,只能增加服务器硬件资源。
Worker级别
可以通过代码为指定的Topology配置多个Worker。Config conf = new Config();conf.setNumWorkers(2);
**单机测试模式下,设定Worker的数量没有意义,不会起效果。
Executor级别
可以通过代码指定Spout或Bolt需要几个线程builder.setSpout(spout_id,spout,2)builder.setBolt(bolt_id,bolt,2)
** 如果只是指定线程数量,而未指定Task数量,则这个组件就会有指定数量的线程来处理,而默认每个线程内都执行一个该组件的Task
Task级别
可以通过代码指定Spout或Bolt需要并发几个Task。builder.setSpout(...).setNumTasks(2);builder.setBolt(...).setNumTasks(2);
**指定的Task会在线程内部执行,如果指定的Task的数量多于线程的数量,则这些Task自动分配到这些线程内执行。
数据流分组方式---内置了七种数据流分组方式
组件向后发送tuple时,涉及到如何为后续组件的多个task分配这些tuple的问题,这是通过在连接组件时使用不同的方法,从而指定数据流分组方式来解决的。
Shuffle Grouping(随机分组)
随机分发数据流中的tuple给bolt中的各个task,每个task接收到的tuple数量相同。
Fields Grouping(按字段分组)
根据指定字段的值进行分组。指定字段具有相同值的tuple会路由到同一个bolt中的task中。
All Grouping(全复制分组)
所有的tuple复制后分发给后续bolt的所有的task。
Globle Grouping(全局分组)
这种分组方式将所有的tuple路由到唯一一个task上
Storm按照最小task id来选取接受数据的task
这种分组方式下配置bolt和task的并发度没有意义。
这种方式会导致所有tuple都发送到一个JVM实例上,可能会引起Strom集群中某个JVM或者服务器出现性能瓶颈或崩溃。
None Grouping(不分组)
在功能上和随机分组相同,为将来预留。
Direct Grouping(指向型分组)
数据源会通过emitDirect()方法来判断一个tuple应该由哪个Strom组件来接受。
只能在声明为指向型的数据流上使用。
Local or shuffle Grouping(本地或随机分组)
和随机分组类似,但是,会优先将tuple分发给同一个worker内的bolt的task,只有在同一个Worker内没有目标bolt的task的情况下采用随机分组方式。
这种方式可以减少网络传输,从而提高topology的性能。
Storm可靠性概述
Storm是分布式程序,进程之间是通过网络来通信的,此时可能因为网络的不稳定、节点宕机等原因造成数据可能存在丢失的情况,这就给Storm的实时处理带来了数据丢失的可能
事务性拓扑
Storm中的可靠性分为三个级别:
至多一次 - 不多数据,但是可能会丢数据
WC案例中,没有任何并发控制,此时就是 至多一次的并发状态,不会多数据,但是可能会因为网络延迟 程序出错 造成数据的丢失。
至少一次 - 不丢数据,但是可能会多数据
在分布式的环境下,因为网络的不稳定性,数据丢失是无法彻底避免的,所以为了保证数据不丢失,应该检测数据丢失的情况,并重发丢失的数据。
这种方式下可以保证不丢数据,但是可能因为重发造成多数据。
对于Spout:
持有已发数据一段时间
实现ack()和fail()
对于Bolt:
需要在发送tuple的过程中实现锚定
调用collector.ack() 或 collector.fail()
恰好一次 - 不丢也不多,恰好完整的处理
在实现了至少一次语义之后,已经可以保证数据不丢,但是可能会多
想要实现恰好一次的语义,需要在以上的基础上,去除重复的数据
想要去除重复的数据,需要能够识别每条数据,并在处理过程中对已经处理过的数据的重发的数据进行抛弃
方案1:
想要唯一识别每条数据,可以为每条数据指定唯一的编号,这个编号是一个递增的数字,在重发时保持不变,通过这个编号唯一的识别tuple
后续处理过程中,记录所有已经处理过的tuple的编号,后续的tuple要处理之前,需要和这些已经处理过的tuple的编号做比较,如果发现已经处理过,则抛弃,如果没有处理过就正常处理
此方案,需要记录所有已经处理过的tuple的编号,且由于在任何时间点都无法确定之后会不会有指定tuple的重发,这些编号都不能删除,这样一来,随着storm的运行,编号越记越多,浪费大量存储空间,且,比较的速度越来越慢。在空间和时间上都无法接收。此方法不可行。
方案2:
想要解决方案1的问题,可以让所有的tuple的编号严格按照顺序递增,且要求整个topology严格按照顺序处理这些tuple,则只需要记录最后一个处理过的tuple的编号即可,后续再有tuple过来,如果编号小于等于记录中的tuple编号,则说明是之前已经处理过的tuple重发的数据,抛弃该数据。如果编号大于记录中的编号,则是正常数据,进行处理并更新记录中的最后一次处理的tuple编号即可。
此方案,需要严格保证tuple处理的顺序,可以要求所有的tuple依次处理,一个tuple处理时,其他tuple排队等待,可以保证顺序,但是效率非常低下。此方案不可行。
方案3:
想要解决方案2的问题,则要求每次发一个批的数据,一个批中有若干tuple,每个批都被赋予一个递增的编号,批中任何一个tuple出错,整批重发,重发过程中编号不变。所有的批依次处理,一个批处理的过程中,其他批排队等待,保证顺序,批之间串行,但批内部有很多tuple,是可以并发的,这种方案,比起方案2,效率有了一定提升。
此方案,虽然比方案2效率提升了,但是批和批之间仍然串行处理,性能依然受限。
方案4:
通过分析发现,在整个Topology中,并不是所有的Bolt都需要严格保证一次且一次的语义,只要抓住最关键的一个或几个步骤,保证一次且一次的语义,就可以保障数据计算不出问题,基于这样的分析,可以将整个Topology中的Bolt分为Process阶段 和 Commit阶段两类。批在Porcess阶段的Bolt中随意并发保证性能,但一旦遇到Commit阶段的Bolt,则要严格按照顺序进入,保证顺序,再在Commit阶段的Bolt中记录最后一个处理过的批的编号,和后续批的编号做比较,进行去重操作,就可以保证一次且一次的语义。
此方案,即保证了一次且一次的语义,也在最大程度上,保证了程序的并发效率,Storm采用的正是这个方案。
这三种级别,越往下可靠性越高,但效率越低,越往上可靠性越低,但是效率越高,在真正的开发中应该根据业务需求,选择一个在满足的要求的可靠性的前提下,性能尽量好的可靠性级别。
Storm集群配置及任务提交
Storm集群的基本概念
Storm集群遵从主/从模式
Storm的主节点称之为nimbus 从节点称之为supervisor
Storm通过Zookeeper来实现集群协调
Storm集群提供了半容错机制
Storm中的nimbus
nimbus守护进程主要的责任是管理:
协调和监控在集群上运行的topology
包括topology的发布
任务的指派
事件处理失败时重新指派任务
Storm中的supervisor节点
supervisor守护进程等待nimbus分配任务后生成并监控workers执行任务。
supervisor和worker都是运行在不同的JVM进程上,如果supervisor启动的worker进程因为错误异常退出,supervisor将会尝试重新生成新的worker进程。
Strom的更多相关文章
- strom的使用01
1.strom的安装和测试 1.1 搭建zookeeper集群 参考hadoop2.0初识1.3中的1.4配置zookeeper集群和自动故障转移 1.2 安装storm依赖的软件 sudo yum ...
- Flume+Kafka+Strom基于伪分布式环境的结合使用
目录: 一.Flume.Kafka.Storm是什么,如何安装? 二.Flume.Kafka.Storm如何结合使用? 1) 原理是什么? 2) Flume和Kafka的整合 3) Kafka和St ...
- 课堂笔记--Strom并发模型
Strom并发模型: topology是如何运行的?(可与mapreduce对比) 第一层:cluster 第二层:supervisor(host.node.机 ...
- 大白话strom——问题收集(持续更新ing)
本文导读: 1.基于storm的应用 2.storm的单点故障解决 3.strom与算法的结合学习4.杂记——常见问题的解答5.http://www.blogchong.com/catalog.asp ...
- Strom简介,以及安装,和官方案例测试
一:简介 1.strom的两种形式 2.strom的特性 3.使用场景 4.集群架构 5.集群架构进程 6.组件 Nimbus 7.从节点Supervisor 8.组件worker 9.组件Execu ...
- Strom学习笔记一
---恢复内容开始--- Storm 是个实时的.分布式以及具备高容错的计算系统.同Hadoop一样Storm也可以处理大批量的数据,然而Storm在保证高可靠性的前提下还可以让处理进行的更加实时:也 ...
- 大数据处理框架之Strom:DRPC
环境 虚拟机:VMware 10 Linux版本:CentOS-6.5-x86_64 客户端:Xshell4 FTP:Xftp4 jdk1.8 storm-0.9 一.DRPC DRPC:Distri ...
- 对strom的理解
1.什么是strom: storm是一个分布式实时计算系统,用户只需要提供自己的插件(例如一个jar包,其中编写用户自己的逻辑代码),然后将它部署到storm服务器上,storm的master服务器就 ...
- Strom的集群停止以及启动
一:停止 1.概述 关于strom没有停止命令 2.第一种方式(kill) jps之后 使用bin/strom -kill wordcount 3.第二种方式(书写脚本) 4.先新建superviso ...
随机推荐
- 项目(三)PXE高效能批量网络装机
PXE:预启动执行环境 PXE是由intel公司开发的网络引导技术,工作在Client/Server模式,允许客户机通过网络从远程服务器下载引导镜像,并加载安装文件或者整个操作系统. 若要搭建PXE网 ...
- [leetcode]44. Wildcard Matching万能符匹配
Given an input string (s) and a pattern (p), implement wildcard pattern matching with support for '? ...
- 解决安装xcode后git使用报错的问题
一.现象: htmlxdeMacBook-Pro:demo htmlx$ git status Agreeing to the Xcode/iOS license requires admin pri ...
- CentOS 使用yum命令安装出现错误提示”could not retrieve mirrorlist http://mirrorlist.centos.org ***”
执行yum命令时出现以上错误; 解决方法: vi /etc/sysconfig/network-scripts/ifcfg-eth0 这一段为你的网卡修改图中框框部分 然后重启 :reboot
- leveldb 学习记录(六)SSTable:Block操作
block结构示意图 sstable中Block 头文件如下: class Block { public: // Initialize the block with the specified con ...
- 解决win10系统无法安装.NET Framework 3.5
方法1:“我的电脑”,单击右键选择“管理” 在打开的“计算机管理”窗口中依路径“服务和应用程序—服务”打开,在列表中找到“Windows Update”并双击打开. 启动类型:自动. 服务状态下面点击 ...
- c语言基础课第三次作业
7-1找出最小值 1.实验代码 #include <stdio.h> int main(void) int n, i, m, min; scanf("%d", & ...
- A - ACboy needs your help again!
ACboy was kidnapped!! he miss his mother very much and is very scare now.You can't image how dark th ...
- POJ 1328 Radar Installation 贪心 A
POJ 1328 Radar Installation https://vjudge.net/problem/POJ-1328 题目: Assume the coasting is an infini ...
- Spring的概念
一.思想 IOC: DI: 二.applicationContext&BeanFactory