参考007 - 大数据 - 系统架构 - 实时数仓架构_哔哩哔哩_bilibili
链接:https://pan.baidu.com/s/1QMOJVkRy4nKkjzoDryvQXw
提取码:fcoe
本文接着上一篇kafka和flink的入门到精通 1 大数据时代,分布式数据存储,数仓_水w的博客-CSDN博客
目录
一、系统架构
(1)数据来源:
(2)采集数据:
(3)数据存储:
(4)数据计算和展示:
二、实时数仓架构
◼ 架构模式:Lambda
讲解流程
三、Kafka
◼ Kafka安装以及使用
◼ 消息队列
➢ 消息系统传输数据的方式:
JMS:Java Message,和平台无关的一个消息服务接口。
➢ 消息队列产品的特性:
➢ 主流的消息系统
◼ 组件:Broker
◼ 组件:Topic
◼ 组件:Partition
◼ 组件:Replica
◼ 组件:Log
◼ 组件:通信RPC
为什么要讲实时数仓呢?因为我们现在的很多企业,离线数仓都已经搭建完毕了, 包括京东,百度,贝壳,快手。因为数据量太大了,传统的数据库已经装不下了。因此放到数据仓库中分层保存,建立不同的模型。
但是计算延时太长了,那么怎么能够快速得到结果?
大家更注重实时计算,所以现在的大厂都在尝试搭建实时数。
(1)采集数据
又提到离散数据分析,是因为在早期的时候技术不成熟,实时数据分析不够准确,为了保证数据的准确性,所以有的时候需要用离散数据做一些计算,然后将我们的计算结果变成最新的数据。所以在这种情况下,两套环境是需要同时运行的。
(2)数据统计和展示
为了用这两套程序,我们就得找两批人,一批会使用flink实时数据分析,另一批会使用spark数据分析。你会发现做的东西差不多,但是两批人成本较高。
后来,flink可以哦用来代替spark,这样就很好了,因为不需要两批人了。
讲解流程:
消息队列:一个系统向消息系统发送数据,另外一个系统向消息系统获取数据。
一个标准的消息系统中,分为三大组成部分:
1.消息系统,我们为什么需要?
在一个系统中,完成所有的功能不太现实。因为我们大量的请求会集中在同一台机器上,会导致当前的负载超过最大处能力,出现过载情况。
过载的出现就会导致部分的服务不可用。那么如果处置不当,就可能导致我们的服务出现雪崩。而且一个系统拆分成多个系统之后,就会导致其他的系统也出现问题。这种情况下我们并不会拿一个系统来实现所有的功能,会进行拆分。
比如, A系统的数据会给到B和C系统,是我们比较常见的。
缺陷:
如果A有大量数据传输,B和C不能及时消费,则会导致流量震荡,甚至导致全链路的服务雪崩。------->消封填谷,缓冲上下游瞬时突发流量,让其更加的平滑
改进:
2.消息系统怎么传输和接受数据?
要求:
(1)RabbitMQ:
(2)RocketMQ:
(3)Kafka:
(4)Pulsar:新兴的,开源,兼容Kafka
3.为什么选择Kafka?
首先因为与周边其他开源软件都会优先兼容它, 兼容性是最好的。其次
Kafka中提供消息读写服务的节点,称之为Broker。
分布式环境,多台机器形成集群,同时提供服务。
4.分布式集群的经典架构---主从,那么多个Broker应该如何管理?
Kafka使用的是zookeeper,严重依赖zookeeper。因此要先启动zookeeper,再启动Kafka。
xcall jps 查看当前虚拟机里的进程
可以看到“[0,1,2]”,说明每一个Broker节点在集群中具有唯一性标识,不重复。
Topic:承载消息逻辑的容器。在实际的使用中,用来区分不同的具体业务数据。是Kafka消息队列的标识,也可以认为消息队列的ID。
意味着会存储很多消息。 Topic可以是多个,
可以看到,当前只有一个名为test的Topic。
服务过载:大量请求集中到一个节点时,就会导致服务过载,雪崩。
为了负载均衡,把一个队列拆成多个队列,把拆分后的队列放在不同的服务节点中--->拷贝。等同于把一份完整的数据拆成多份。
Partition:把一个队列拆成多个队列(称之为:分区),让数据可以均匀分配,达到负载均衡。
而且因为数据是放在不同节点的,所以可以适应任意大小的数据。当发现不够的时候,可以添加Topic,因此Topic可以是任意大小,扩容起来是非常方便的。
可以看到,这里的“[0]”表示只有一个分区,分区号是0。
5.所有分区的数据合在一起是完整的数据,如果某一个节点宕掉了,那么该服务肯定不可用了(黑色)。怎么办?
如果某一个节点宕掉了,就会导致该节点的数据不可用。所以为了保证数据的高可靠,不丢失数据,它提供了副本机制。
Replica:为了保证数据的高可靠性,为每个分区提供了多个副本机制。多个副本直接形成了主从。
其中一个称之为leader(主)副本,其他副本统称为fllower(从)副本。
图中有两个副本,leader(主)副本和fllower(从)副本。但是这样画是不合理的,我们应该把它们分开在不同的节点中。 多个副本应该放置在不同的节点上。
6.那么到底在三台机器上,有多少副本是合适的呢?最多有多少?
副本的数量应该不超过节点的数量,因为没有意义。
leader(主)副本主要用于读写请求;
fllower(从)副本:主要用于备份,不参与读写;数据都来自于leader。
7.那么我们选择哪一个当作leader?选择哪一个当作fllower?
leader和fllower,主要是争抢资源,抢到了就是leader。
可以看到,leader是2号,说明2号抢到了资源。
每个分区可以认为是一个无限长度的数组队列,新的数据可以追加到这个数组中,数据在分区中的位置(称之为:偏移量)。
那么一个分区的数据都放在一起,内存无法放置太多,所以肯定要写入磁盘。磁盘IO会极大影响写入速度,为了性能考虑,磁盘文件不能随机访问。所以需要顺序写入数据。
如果所有的数据都写入一个文件,也不行。如果想要能够快速消费消息,我们需要将文件拆分(称之为:Seqment),默认情况下是1GB。
为了能够快速访问文件中的数据,kafka还会生成索引文件。
8.文件存哪里了?
查看文件的存放路径,
后缀为.index就是索引文件,后缀为.log的就是日志文件。日志文件的命名是针对于整个分区来讲数据的偏移量是多少。
查看log日志文件里的内容,
其中,“payload”就是数据本身。
查看索引文件里的内容,
其中,“offest”是数据的偏移量,“position”是数据的物理偏移量。
首先,我们要搞清楚,Java的进程是什么?JVM?执行java的一个应用程序(Java Test),会启动一个java虚拟机,也即是说会启动一个进程,名字叫Test。
其次,scala语言是基于java语言的,很多语法类似。所有Test一定存在main方法(是可以直接执行的)。
main方法里有“buildServer(serverProps)”构建了一个服务器,其中包括依赖zookeeper以及Broker。