目录
前言
- 接下来
热数据
的处理,缓存雪崩
问题的解决 -->storm
,hystrix
对于这两个技术,都是关键性的会去影响你的热数据,缓存雪崩时的系统可用性和稳定性,学以致用,用到我们之前搭建的缓存系统架构中。
storm
,在做热数据这块,如果要做复杂的热数据的统计和分析,亿流量,高并发的场景下,最合适的技术就是stormhystrix
,分布式系统的高可用性的限流,熔断,降级,还有缓存雪崩的方案,限流的技术
Storm基础
Storm到底是什么
mysql,hadoop与storm关系
mysql
:事务性系统,面临海量数据的尴尬hadoop
:离线批处理,今天数据,明天计算storm
:实时计算,来一条,计算结果
自己搞一套storm?
- 如果自己搞一套实时流系统出来,也是可以的,但是。。。。
- 花费大量的时间在底层技术细节上:如何部署各种中间队列,节点间的通信,容错,资源调配,计算节点的迁移和部署,等等
- 花费大量的时间在系统的高可用上问题上:如何保证各种节点能够高可用稳定运行
- 花费大量的时间在系统扩容上:吞吐量需要扩容的时候,你需要花费大量的时间去增加节点,修改配置,测试,等等
- 国内,国产的实时大数据计算系统,唯一做得影响力特别大,特别牛逼的,就是
JStorm
,阿里国内顶尖 - JStorm,clojure编程预压,Java重新写了一遍,Galaxy流式计算的系统,百度,腾讯,也都自己做了,也能做得很好
- 普通公司非常困难的…
storm的特点
-
支撑各种实时类的项目场景
:实时处理消息以及更新数据库,基于最基础的实时计算语义和API(实时数据处理领域);对实时的数据流持续的进行查询或计算,同时将最新的计算结果持续的推送给客户端展示,同样基于最基础的实时计算语义和API(实时数据分析领域);对耗时的查询进行并行化,基于DRPC,即分布式RPC调用,单表30天数据,并行化,每个进程查询一天数据,最后组装结果 -
高度的可伸缩性
:如果要扩容,直接加机器,调整storm计算作业的并行度就可以了,storm会自动部署更多的进程和线程到其他的机器上去,无缝快速扩容 -
数据不丢失的保证
:storm的消息可靠机制开启后,可以保证一条数据都不丢,也不重复计算 -
超强的健壮性
:从历史经验来看,storm比hadoop、spark等大数据类系统,健壮的多的多,因为元数据全部放zookeeper,不在内存中,随便挂都不要紧,重启简单,稳定性和可用性很高 -
使用的便捷性
:核心语义非常的简单,开发起来效率很高开发API还是很简单的
大白话讲解
Storm的集群架构以及核心概念
Storm的集群架构
Nimbus,Supervisor,ZooKeeper,Worker,Executor,Task
Storm核心概念
Topology
:拓扑,务虚的一个概念Spout
:数据源的一个代码组件,就是可以实现一个spout接口,写一个java类,在这个spout代码中,可以自己尝试去数据源获取数据,比如说从kafka中消费数据bolt
:一个业务处理的代码组件,可以认为spout会将数据传送给bolt,各种bolt还可以串联成一个计算链条,也可以认为写java类实现一个bolt接口
一堆
spout+bolt
,就会组成一个topology
,就是一个拓扑,实时计算作业,spout+bolt,一个拓扑涵盖数据源获取/生产+数据处理的所有的代码逻辑
tuple
:就是一条数据,每条数据都会被封装在tuple中,在多个spout和bolt之间传递stream
:就是一个流,务虚的一个概念,抽象的概念,源源不断过来的tuple
,就组成了一条数据流
Storm的并行度以及流分组
- 对storm的核心的基本原理,门儿清,你都很清楚,集群架构、核心概念、并行度和流分组
- 掌握最常见的storm开发范式,spout消费kafka,后面跟一堆bolt,bolt之间设定好流分组的策略
- 在bolt中填充各种代码逻辑
- 了解如何将storm拓扑打包后提交到storm集群上去运行
- 掌握如何能够通过
storm ui
去查看你的实时计算拓扑的运行现状 - 如果说,恰巧没人负责维护storm集群,也没什么大数据的团队,那么你可能需要说再去深入学习一下storm
- 当然了,如果你的场景不是特别复杂,整个数据量也不是特别大,其实自己主要研究一下,怎么部署storm集群
什么是并行度,什么是流分组
比如设想一个拓扑结构,几个spout,几个bolt,各种流分组情况下,数据是怎么流向的,要求具体画出集群架构中的流向
worker,executor,task,supervisor,数据流向
-
并行度
:Worker->Executor->Task,没错,是Task
-
流分组
:Task与Task之间的数据流向关系,流分组策略
图中两个executor,bolt1,数据流向bolt2的策略,bolt1的每个task流向bolt2的那个task的策略
流分组策略
常用
Shuffle Grouping
:随机发射,负载均衡Fields Grouping
:根据某一个或者某些个fields,进行分组,如果这一个或者多个fields如果值完全相同的话,那么这些tuple
,就会发送给下游bolt
的其中固定的一个task
你发射的每条数据是一个
tuple
,每个tuple中有多个field作为字段,比如tuple,3个字段,name,age,salary,数据{“name”: “tom”, “age”: 25, “salary”: 10000} -> 1个tuple -> 3个field,name,age,salary
不常用
基本上用不到
All Grouping
Global Grouping
None Grouping
Direct Grouping
Local or Shuffle Grouping
storm 单词计数demo
storm wordcount
demo 程序,蕴含了很多的知识点:
- 写一个
Spout
- 写一个
Bolt
- api怎么用的:
OutputCollector
,Declarer
- 写一个
Topology
- 怎么设置
worker
,executor
,task
,流分组
资料地址:https://blog.csdn.net/qq_34246646/article/details/104596143
项目地址:eshop-study
切换到相应分支:
依赖
<dependency>
<groupId>org.apache.storm</groupId>
<artifactId>storm-core</artifactId>
<version>1.1.0</version>
</dependency>
<dependency>
<groupId>commons-collections</groupId>
<artifactId>commons-collections</artifactId>
<version