数据技术篇之实时技术

news2024/11/18 13:27:41

第5章 实时技术

  在大数据系统中,离线批处理技术可以满足非常多的数据使用场景需求,但在 DT 时代, 每天面对的信息是瞬息万变的,越来越多的应用场景对数据的时效性提出了更高的要求。数据价值是具有时效性的,在一条数据产生的时候,如果不能及时处理并在业务系统中使用,就不能让数据保持最高的“新鲜度”和价值最大化。因此阿里巴巴提出了流式实时处理技术来对离线批处理技术进行补充。
流式数据处理一般具有一下特征:

时效性高
常驻任务
性能要求高
应用局限性

5.1 流式架构

在这里插入图片描述
按照功能划分主要包括:

数据采集
数据处理
数据存储
数据服务

  • 数据采集

按照数据采集的种类可以划分为:

数据库变更日志:比如MySQL的binlog日志、Hbase的hlog日志、OceanBase的变更日志、Oracle的变更日志等。
引擎访问日志:比如用户访问网站产生的Apache引擎日志,搜索引擎的接口查询日志等

数据采集原则:

数据大小限制:当达到限制条件时,把目前采集到的新数据作为一批(例如512KB一批)。
时间阈值限制:当时间达到一定条件时,也会把目前采集到的新数据作为一批,避免在数据量少的情况下一直不采集(例如30秒写一批)

消息系统与数据中间件
在这里插入图片描述

消息系统
  消息系统是数据库变更的上游,所以它的延时数据比数据中间件低很多,但是其支持的吞吐量有限。一般会用作业务数据库变更的消息中转,比如订单下单、支付等消息。
消息中间件
  作为数据交换平台将采集的数据分发给下游,用来处理较大的业务数据(每天几十TB的容量)

时效性吞吐量
消息系统毫秒
数据中间件
  • 数据处理

阿里采用的刘就散引擎系统是阿里元提供的StreamCompute系统

StreamCompute系统涵盖了从数据采集到数据生产各个环节,力保流计算开发严谨、可靠。其提供的 SQL 语义的流式数据分析能力( StreamSQL ),让流数据分析门槛不再存在。它在Storm 的基础上包装了一层 SQL 语义,方便开发人员通过写 SQL 就可以实现实时计算,不需要关心其中的计算状态细节,大大提高了开发效,降低了流计算的门槛。当然,它也支持传统模式的开发,就像 Hadoop中的 Hive MapReduce 关系一样,根据不同的应用场景选择不同的方式。另外,StreamCompute 还提供了流计算开发平台,在这个平台上就可以完成应用的相关运维工作,不需要登录服务器操作 ,极大地提了运维效率。

业界较广泛使用的流式计算系统:

Twitter 开源的Storm 系统
雅虎开源的 S4 系统
Apache park Streaming
Flink

流数据处理原理,以Storm为例:
在这里插入图片描述

spout :拓扑的输人,从数据中间件中读取数据,并且根据自定义的分发规则发送给下游的 bolt ,可以有多个输人源。
bolt :业务处理单元,可以根据处理逻辑分为多个步骤,其相互之间的数据分发规则也是自定义的。

实时任务典型问题
(1)去重指标

去重情况分为:
  精确去重。在这种情况下,明细数据是必须要保存下来的,当遇到内存问题时,可以通过数据倾斜来进行处理,把一个节点的内存压力分到多个节点上。
  模糊去重。在去重的明细数据量非常大,而业务的精度要求不的情况下,可以使用相关的去重算法,把内存的使用 量降到千分之一甚至万分之一 ,以提高内存的利用率
去重方法
①布隆过滤器
  该算法是位数组算法的应用 不保存真实的明细数据,只保存明细数据对应哈希值的标记位。当然,会出现哈希值碰撞的情况,但是误差率可以控制,计算出来的去重值比真实值小。采用这个算法存储1亿条数据只需要 100 MB 空间。
  适用场景 统计精度要求不高,统计维度值非常多的情况。比如统计全网各个商家的 UV 数据,结果记录数达到上千万条。因为在各个维度之间,布隆过滤器是可以共用的
②基数估计
  该算法也是利用哈希的原理,按照数据的分散程度来估算现有数集的边界,从而得出大概的去重值总和。这里估算的去重值可能比真实值大,也可能比真实值小。采用这个算法存储1亿条数据只需要几 KB内存。
  适用场景:统计精度要求不高,统计维度非常粗的情况。比如整个大盘的 UV 数据,每天的结果只有一条记录。基数估计在各个维度值之间不能共用,比如统计全天小时的 UV 数据,就需要有24个基数估计对象,因此不适合细粒度统计的场景。

(2)数据倾斜

解决方法:
①去重指标分桶
  通过对去重值进行分桶 Hash,相同的值一定会被放在同一个桶去重,最后再把每个桶里面的值进行加和就得到总值,这里利用了每个桶的CPU 和内存资源。
②非去重指标分桶
  数据随机分发到每个桶中,最后再把每个桶的值汇总,主要利用的是各个桶的CPU能力。

(3)事务处理

保证事务的幂等性:
① 超时时间:由于数据处理是按照批次来进行的,当一批数据处理超时时,会从拓扑的spout端重发数据。另外,批次处理的数据量不宜过大,应该增加一个限流的功能(限定一批数据的记录数或者容量等),避免数据处理超时。
② 事务信息:每批数据都会附带 一个事务 ID 的信息,在重发的情况下,让开发者自己根据事务信息去判断数据第一次到达和重发时不同的处理逻辑。
③ 备份机制:开发人员需要保证内存数据可以通过外部存储恢复,因此在计算中用到的中间结果数据需要备份到外部存储中。

  • 数据存储

实时任务在运行过程中,会计算很多维度和指标,这些数据需要放在一个存储系统中作为恢复或者关联使用。其中会涉及三种类型的数据:

中间计算结果:在实时应用处理过程中,会有一些状态的保存(比如去重指标的明细数据),用于在发生故障时,使用数据库中的数据恢复内存现场。
最终结果数据:指的是通过 ETL 处理后的实时结果数据,这些数据是实时更新的,写的频率非常高,可以被下游直接使用。
维表数据:在离线计算系统中,通过同步工具导人到在线存储系统中,供实时任务来关联实时流数据。后面章节中会讲到维表的使用方式。

对于海量数据的实时计算,一般会采用非关系型数据库,以应对大量的多并发读写。下面是在数据统计中表名设计的一些时间经验:

(1)表名设计
  设计规则:汇总层标识+数据域+主维度+时间维度
例如: dws_trd_slr_dtr ,表示汇总层交易数据,根据卖家( slr )主维度+0点截至当日( dtr )进行统计汇总。
  这样做的好处是,所有主维度相同的数据都放在一张物理表中,避免表数量过多,难以维护。另外,可以从表名上直观地看到存储的是什么数据内容,方便排查问题。
(2)rowkey 设计
  设计规则: MD5 +主维度+维度标识+子维度1 +时间维度+子维度2
  例如:卖家 ID的MD5 前四位+卖家ID+ app+ 一级类目ID+ ddd +二级类目ID
  以MD5 前四位作为 rowkey 的第一部分,可以把数据散列,让服务器整体负载是均衡的,避免热点问题。在上面的例子中,卖家 ID于主维度 ,在查数据时是必传的。每个统计维度都会生成一个维度标识以便在 rowkey 上做区分。

  • 数据服务
    实时数据落地到存储系统中后,使用方就可以通过统一的数据服务获取到实时数据。

5.2 流式数据模型

  • 数据分层

流数据模型整体上分为五层:

(1)ODS :订单粒度的变更过程, 一笔订单有多条记录。
(2)DWD:订单粒度的支付记录,一笔订单只有一条记录
(3)DWS:卖家的实时成交金额,一个卖家只有一条记录,并且指标在实时刷新。
(4)ADS: 外卖地区的实时成交金额,只有外卖业务使用
(5)DIM :订单商品类目和行业的对应关系维表。

在这里插入图片描述

  • 数据关联

在流式计算中常常需要把两个实时流进行主键关联,以得到对应的时明细表。下图为订单信息表和支付信息表关联示意图
在这里插入图片描述
  上面的例子中,实时采集两张表的数据,每到来一条新数据时都在内存中的对方表截至当前的全量数据中查找,如果能查找到,则说明关联成功,直接输出 :如果没查找到 ,则把数据放在内存中的自己表数据集合中等待。另外,不管是否关联成功,内存中的数据都需要备份到外部存储系统中,在任务重启时,可以从外部存储系统中恢复内存数据这样才能保证数据不丢失。因为在重启时,任务是续跑的,不会重新跑之前的数据。
  另外,订单记录的变更有可能发生多次(比如订单的多个字段多次更新),在这种情况下 需要根据订单 ID 去重,避免A表和B表多次关联成功;否则输出到下游就会有多条记录,这样得到的数据是有重复的。

  • 维表使用

(1)为什么使用维表

数据无法及时准备好
无法准确的获取全量的最新数据
数据的无序性

(2)维表的使用形式

全量加载
增量加载

5.3 大促特征和保障

  • 大促特征

毫秒级延时
洪峰明显
高保障性

  • 大促保障

(1)如何进行实时任务优化

独占资源和共享资源策略
合理选择缓存机制,尽量降低读写库次数
计算单元合并,降低拓扑层级
内存对象共享,避免字符拷贝
在高吞吐量和低延时间取平衡

(2)如何进行数据链路保障

进行多机房容灾、异地容灾。下图为多机房容灾示意图
在这里插入图片描述

(3)如何进行压测

数据压测:数据压测主要是蓄洪压测,就是把几个小时甚至几天的数据积累下来,并在某个时刻全部放开。
产品压测
① 产品本身压测
收集大屏服务端的所有读操作的 URL ,通过压测平台进行压测流量回放,按照 QPS: 500次/秒的目标进行压测。在压测过程中不断地迭代优化服务端的性能,提升大屏应用处理数据的性能。
② 前端页面稳定性测试
将大屏页面在浏览器中打开,并进行8到24 小时的前端页面稳定性测试。监控大屏前端 JS 对客户端浏览器的内存、 CPU 等的消耗,检测出前端 JS 内存泄漏等问题并修复,提升前端页面的稳定性。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/82491.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

霸榜,这本《程序员如何向架构师转型》在Github已持续置顶两月

前言 企业架构在过去十年中取得了长足的进步。随着越来越多新技术出现,充分利用这些因素来将企业架构创建得更好十分重要。通过将新技术集成到企业架构中,即使在困难时期,也能取得丰硕的成果。 现代企业架构师的 5 个特征: 1. …

移动端插件-IScroll列表滑动、区块滑动

iScrol l是一个高性能,资源占用少,无依赖,多平台的javascript滚动插件(4kb)。 官方: iScroll 访问不了 (iscrolljs.com) iScroll github (https://github.com/cubiq/iscroll) -> build 文件夹 包含各个版本 iScroll 中文…

国内智能手表行业数据浅析

大家好,这里是小安说网控。 智能手表,作为智能穿戴的一种,大大方便了人们的生活。 2022年9月份,我国智能手表产量当期值695.6万个,同比增长21.4%;10月份当期值为552.6万个,同比下滑16.5%。1-10月…

宝塔面板打不开怎么登录进入宝塔页面

浏览器新建标签页,输入服务器公网地址ip,后面加:8888,例如 1.2.3.4:8888 (服务器公网地址IP可在云服务器 → 实例→公网IP 查看) 删除默认用户名,创建设置你的用户名和密码,确定,登陆…

基于不可否认技术的珍贵古籍线上交易系统设计与实现(JavaWeb的图书商城系统)

目 录 摘 要 I ABSTRACT I 引言 1 1 绪论 1 1.1 课题背景与意义 1 1.2 本文的总体结构 1 2 开发工具及技术 2 2.1 开发工具 2 2.1.1 前台使用技术 2 2.1.2 后台使用技术 2 2.1.3 后端使用技术 3 2.2 B/S架构 3 2.3 软硬件需求 3 3 系统的需求分析和概要设计 3 3.1 可行性分析 3…

IPv6升级转换最新消息,全在这一篇了!-中科三方

工信部部长苗圩:加快“双千兆”建设,提升IPv6网络服务能力 工信部部长苗圩在第19届中国互联网大会上指出,过去一年,互联网行业扎实推进各项工作,在基础设施建设、产业实力提升、融合应用深化等方面不断取得新的…

JavaSE03

Idea中自动生成构造器和get,set的快捷键:altinsert 关于继承的访问: this和super的用法: 子类中的所有构造方法默认都会访问父类中无参构造方法 重写: 重写注意:1.父类中的私有方法,子类不能重写。2.子…

火遍全网的chatGPT(文末有彩蛋)

最近网上非常火爆的CHATGPT,它是OpenAI开发的一款开源的自然语言处理 (NLP) 模型,用于实现对话生成和语言模型预测。CHATGPT 模型基于 GPT-3 (Generative Pretrained Transformer 3) 模型构建,拥有语言理解和文本生成能力。CHATGPT 模型可以用…

分库分表、Memory引擎、代理逐渐、主从复制、IP直连问题

文章目录几千万数据量大表做MySQL主从崩了,该如何优化?为啥禁用IP直连为啥主键使用代理主键,而不是业务主键报表分析使用ESExplain 可视化Visual_Explain一致性Hash解决MySQL分库库容问题不建议在 Docker 中跑 Mysql优雅地进行数据归档倒排索…

《自己动手写CPU》学习记录(8)——第7章/Part 1

目录 引言 致谢 指令说明 add、addu、sub、subu、slt、sltu addi、addiu、slti、sltiu clo、clz multu、mult、mul 设计 宏定义 译码模块 指令执行模块 仿真 仿真程序 仿真结果 引言 随章节进度继续推进,本章继续实现 算术运算 指令等其他操作指令。…

CVPR2020-Meshed-Memory Transformer for Image Captioning

论文地址:Meshed-Memory Transformer for Image Captioning (thecvf.com) Background 本文在transformer的基础上,对于Image Caption任务,提出了一个全新的fully-attentive网络。在此之前大部分image captioning的工作还是基于CNN进行特征提…

error: (-215:Assertion failed) !ssize.empty() in function ‘cv::resize‘

网上以及说来很多方法了, 1.图片路径写成了如下形式:C:\Users\Desktop\test 正确的应该为:C:/Users/Desktop/test/ (在程序中斜杠‘\’有转义字符含义) 2.图片路径少写了一个斜杠(图片存放在test文件夹中&…

深度强化学习

参考1. 引言 — 动手学深度学习 2.0.0 documentation 深度强化学习(deep reinforcement learning)将深度学习应用于强化学习的问题,是非常热门的研究领域。 突破性的深度Q网络(Q-network)在雅达利游戏中仅使用视觉输入…

easy-jenkins自动化部署

项目简介 easy-jenkins是一款可以对本地项目进行一键自动化部署的一款简易工具,可以很方便地将平常我们java开发中的springboot项目自动打包成jar包以及vue等前端项目也进行一键构建上传服务器进行部署,更加简化了jenkins的繁琐配置,对于使用者来说更加友好与方便 我们在使用时…

五面阿里巴巴拿offer后定级P6:分享Java面经及答案总结

一面(电话) 说说对JVM的理解 treemap和hashmap有什么区别? Java多线程的的5大状态图流转 mysql主键和唯一索引的区别 说说最近的项目 如何实现session共享,用redis如何实现 缓存击穿的概念和解决方案 说说微服务,微服务之间如何管理 二…

Python tkinter -- 第18章 画布控件之线段(line)

**18.2.17 create_line(coords, options) 根据 coords 给定的坐标,在画布上创建一条或多条线段。 如果给定的坐标超过两个点,则会首尾相连变成一条折线。 #直线 import tkinter as tk roottk.Tk() root.geometry(320x240) b1tk.Canvas(root) b1.create_…

[附源码]JAVA毕业设计疫情下图书馆管理系统(系统+LW)

[附源码]JAVA毕业设计疫情下图书馆管理系统(系统LW) 项目运行 环境项配置: Jdk1.8 Tomcat8.5 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目…

正点原子-freeRTOS

裸机与操作系统的区别 1、操作系统可以实现多线程,虽然同一时间只能做一件事但是切换很快,裸机要轮流执行很慢 2、操作系统可以抢占线程,裸机只能使用中断实现,很慢,不实时 3、操作系统在等待延时的时候&#xff0c…

进程/线程篇

1.进程 1.1.进程PCB PCB是进程存在的唯一标识:进程消失了,PCB也随之消失 1.1.1.PCB包含哪些信息 进程描述信息 进程标识符:标识各个进程,每个进程有唯一的标识符用户标识符:进程归属的用户,用户标识符主…