实时计算
-----有别于传统的离线批处理操作(对很多数据的集合进行的操作),实时处理,说白就是针对一条一条的数据/记录进行操作,
所有的这些操作进行一个汇总(截止到目前为止的所有的统计总和)
实时计算和离线计算面临的数据的特征:
Bounded:有界
离线计算面临的操作数据都是有界限的,无论是1G、1T、1P、1EB、1NB
数据的有界必然会导致计算的有界
UnBounded:无界
实时计算面临的操作数据是源源不断的向水流一样,是没有界限的,
数据的无界必然导致计算的无界
6大问题:
3大计算中心
离线批处理
准实时流计算中心
实时流计算
3大计算引擎
用户交互式计算引擎:SQL/ES
图计算引擎
机器学习计算引擎
=============================================================================================
Storm(Apache的开源顶级项目 Tiwtter开源的(cloujre),阿里山寨的Storm(ODPS ECS OSS KVStore--Hadoop)——JStorm)
Flink
SparkStreaming
IBM的。。。
MircoSoftware
Apache Storm是Twitter开源的一个类似于Hadoop的实时数据处理框架,它原来是由BackType开发,后BackType被Twitter收购,将Storm作为Twitter的实时数据分析系统。
Storm能实现高频数据和大规模数据的实时处理。
官网资料显示storm的一个节点1秒钟能够处理100万个100字节的消息(IntelE5645@2.4Ghz的CPU,24GB的内存)。
Storm和Hadoop的计算:
数据来源
HADOOP处理的是HDFS上TB级别的数据(历史数据),STORM是处理的是实时新增的某一笔数据(实时数据);
处理过程
HADOOP是分MAP阶段到REDUCE阶段,STORM是由用户定义处理流程,流程中可以包含多个步骤,每个步骤可以是数据源(SPOUT)或处理逻辑(BOLT);
是否结束
HADOOP最后是要结束的,STORM是没有结束状态,到最后一步时,就停在那,直到有新数据进入时再从头开始;
处理速度
HADOOP是以处理HDFS上TB级别数据为目的,处理速度慢,STORM是只要处理新增的某一笔数据即可,可以做到很快;
适用场景
HADOOP是在要处理批量数据时用的,不讲究时效性,STORM是要处理某一新增数据时用的,要讲时效性。
=============================================================================================
Storm设计的顶级的抽象概念:Topology
Storm是对流Stream的抽象,流是一个不间断的无界的连续tuple,注意Storm在建模事件流时,把流中的事件抽象为tuple即元组。
Storm将流中元素抽象为Tuple,一个tuple就是一个值列表——value list,list中的每个value都有一个name,并且该value可以是基本类型,字符类型,字节数组等,当然也可以是其他可序列化的类型。
Storm认为每个stream都有一个stream源,也就是原始元组的源头,所以它将这个源头称为Spout。
有了源头即spout也就是有了stream,那么该如何处理stream内的tuple呢。将流的状态转换称为Bolt,bolt可以消费任意数量的输入流,只要将流方向导向该bolt,同时它也可以发送新的流给其他bolt使用,这样一来,只要打开特定的spout(管口)再将spout中流出的tuple导向特定的bolt,又bolt对导入的流做处理后再导向其他bolt或者目的地。
以上处理过程统称为Topology即拓扑。拓扑是storm中最高层次的一个抽象概念,它可以被提交到storm集群执行,一个拓扑就是一个流转换图,图中每个节点是一个spout或者bolt,图中的边表示bolt订阅了哪些流,当spout或者bolt发送元组到流时,它就发送元组到每个订阅了该流的bolt(这就意味着不需要我们手工拉管道,只要预先订阅,spout就会将流发到适当bolt上)。
拓扑的每个节点都要说明它所发射出的元组的字段的name,其他节点只需要订阅该name就可以接收处理。
Storm需要掌握的几个名词:
Topology用于封装一个实时计算应用程序的逻辑,类似于Hadoop的MapReduce Job
Stream 消息流,是一个没有边界的tuple序列,这些tuples会被以一种分布式的方式并行地创建和处理
Spouts 消息源,是消息生产者,他会从一个外部源读取数据并向topology里面面发出消息:tuple
Bolts 消息处理者,所有的消息处理逻辑被封装在bolts里面,处理输入的数据流并产生新的输出数据流,可执行过滤,聚合,查询数据库等操作
Task 每一个Spout和Bolt会被当作很多task在整个集群里面执行,每一个task对应到一个线程.
Stream groupings 消息分发策略,定义一个Topology的其中一步是定义每个tuple接受什么样的流作为输入,stream grouping就是用来定义一个stream应该如何分配给Bolts们.
=============================================================================================
Storm的安装
下载地址:https://storm.apache.org/downloads.html
安装并zookeeper集群(要保证集群各个节点的时间保持一致)
uplooking01
uplooking02
uplooking03
解压重命名apache-storm-1.0.2.tar.gz
[uplooking@uplooking01 ~]$ tar -zxvf soft/apache-storm-1.0.2.tar.gz -C app/
[uplooking@uplooking01 ~]$ mv app/apache-storm-1.0.2/ app/storm
修改文件conf/storm-env.sh
export JAVA_HOME=/opt/jdk
export STORM_CONF_DIR="/home/uplooking/app/storm/conf"
修改文件conf/storm.yaml
storm.zookeeper.servers:
- "uplooking01"
- "uplooking02"
- "uplooking03"
##配置集群中的nimbus的候选主机的主机名,主要避免单点问题
nimbus.seeds: ["uplooking01", "uplooking02"]
##配置storm在运行过程中supervisor从nimbus下载的各个topology对应的jar,配置型等等,做临时存储
storm.local.dir: "/home/uplooking/app/storm/tmp"
##一台supervisor机器上面能够最多运行几个worker进程
supervisor.slots.ports:
- 6700
- 6701
- 6702
- 6703
配置完成之后向其他机器分发
[uplooking@uplooking01 storm]$ scp -r ../storm uplooking@uplooking02:/home/uplooking/app/
[uplooking@uplooking01 storm]$ scp -r ../storm uplooking@uplooking03:/home/uplooking/app/
启动:
uplooking01:
[uplooking@uplooking01 storm]$ nohup bin/storm nimbus >/dev/null 2>&1 &
[uplooking@uplooking01 storm]$ nohup bin/storm ui >/dev/null 2>&1 &
uplooking02:
[uplooking@uplooking01 storm]$ nohup bin/storm nimbus >/dev/null 2>&1 &
[uplooking@uplooking03 storm]$ nohup bin/storm supervisor >/dev/null 2>&1 &
[uplooking@uplooking03 storm]$ nohup bin/storm logviewer >/dev/null 2>&1 &
uplooking03:
[uplooking@uplooking03 storm]$ nohup bin/storm supervisor >/dev/null 2>&1 &
[uplooking@uplooking03 storm]$ nohup bin/storm logviewer >/dev/null 2>&1 &
验证:
在浏览器中数据:
访问启动ui--->nohup /home/uplooking/app/storm/bin/storm ui > /dev/null 2>&1 &这台机器
http://uplooking01:8080