构建实时数据架构-Flink和Druid的强大组合-Apache-Kafka (数据实时化)
译者|陈峻
审校|重楼
如今,关于经常使用批处置上班流程的数据团队而言,要满足业务的实时要求并非易事。从数据的交付、处置到剖析,整个批处置上班流往往须要少量的期待,其中包含:期待数据被发送到ETL工具处,期待数据被批量处置,期待数据被加载到数据仓库,甚至须要期待查问的成功。
不过,开源环球已对此有了处置打算:经过Kafka、Flink和Druid的协同经常使用,咱们可创立一个实时数据架构,以消弭上述期待形态。如下图所示,该数据架构可以在从事情到剖析、再到运行的整个数据上班流程中,无缝地提供数据的新颖度、裁减性和牢靠性。
目前,、、和等出名公司,都在同时经常使用这三种由互补的数据流原生技术构建的运行,来共同处置各种实时用例。
用于实时运行的开源数据架构
上图展现的架构能够使得构建可观察性、物联网与遥测剖析、安保检测与诊断、面向客户的洞察力、以及共性化介绍等实时运行,变得繁难且易于成功。上方,咱们将和您讨论此类工具的各个组成局部,以及它们将如何被联合起来成功宽泛的实时运行。
流管道:ApacheKafka
过去,RabbitMQ、ActiveMQ、以及其余被用来提供各种信息传递形式的信息队列系统,只管可以将数据从消费者散发到消费者处,然而其可裁减性十分有限。而随着ApacheKafka的出现,以及被80%的财产100强企业所经常使用,它已成为了流式数据的实践规范。其基本要素在于,Kafka架构远不止繁难的信息传递,其多性能性使之十分适宜在大规模的互联网上启动数据传达输。而其容错性和数据分歧性,则可以支持各类关键性义务运行。同时,由KafkaConnect提供的各种衔接器,也可与任何数据源相集成。
作为实时数据流平台的ApacheKafka
流处置:ApacheFlink
Kafka只管能够提供实时数据,然而用户在须要统筹实时效率和裁减性时,往往会选用ApacheFlink。作为一个高吞吐量且一致的数据流批处置引擎,Flink的共同长处在于能够大规模处置延续的数据流。而作为Kafka的流处置器,Flink可以无缝地集成并支持准确的一次性性语义(exactly-oncesemantics)。也就是说,即使在系统出现缺点时,它也能保障每个事情被准确地处置一次性。
详细而言,它会衔接到Kafka主题,定义查问逻辑,而后延续输入结果,正所谓设置好就不用管它(setitandforgetit)。这使得Flink十分适用于对数据流的即时处置和牢靠性要求较高的运行案例。以下是Flink的两个经常出现用例:
填充与转换
假设数据流在经常使用之前须要启动诸如:修正、增强或重组数据等操作,那么Flink是对此类数据流启动操作的理想引擎。它可以经过继续处置,来坚持数据的新颖度。例如,假定咱们有一个装置在默认修建中的、温度传感器的、物联网遥测用例。其每一个被捕捉的Kafka事情,都具有以下JSON结构:
{"sensor_id":"SensorA,""temperature":22.5,"timestamp":2023-07-10T10:00:00}
假设每个传感器的ID都须要映射到一个位置,而且温度须要以华氏度为单位的话,那么Flink可以将JSON结构更新为:
{sensor_id:SensorA,location:Room101,temperature_Fahreinheit:73.4,timestamp:2023-07-10T10:00:00}
并且将其间接发送到运行程序,或间接发回Kafka。
Flink数据处置的结构化表格示例
Flink在这方面的长处在于其处置大规模Kafka数据流的实时速度。此外,填充和转换通常是一个有形态的环节。每个数据记载都可以被修正,且无需保养其耐久形态。因此全体上班量最小,且性能较高。继续监控和警报
经过将Flink的实时继续处置和容错性能相联合,咱们可认为各种关键性运行的实时检测和照应需求,设计出理想的处置打算。例如:当须要具有高检测灵敏度(如:亚秒级)和高采样率时,Flink的继续处感性能就十分适宜作为数据服务层,被用于监控条件,触发警报,进而采取相应的执行。
Flink在警报方面的长处关键体如今:它既能够支持有形态警报,也可以支持有形态警报。例如:像温度到达X时,通知消防队这样的阈值或事情触发条件只管繁难,但不够默认。在一些实在的经常使用案例中,警报须要由能够坚持形态的复杂形式驱动,甚至须要在继续的数据流中汇总各名目的(如:总量、平均值、最小值、最大值、以及计数等),而Flink则可以监控和更新形态,以及时发现偏向和意外。
值得留意的是,经常使用Flink启动监控和警报时,往往须要继续经常使用系统CPU来依据阈值和形式评价条件。这与只在执行查问时,才用到CPU的数据库有所不同。因此,您须要最善报前了解待开发的运行能否须要继续经常使用CPU。
实时剖析:ApacheDruid
总的说来,ApacheDruid完善了数据架构,能够与Kafka和Flink一同成为支持实时剖析的数据流消费者。只管它是一个被用于剖析的数据库,然而其设计中心和用途与其余数据库、以及数据仓库有较大的不同。
首先,因为Druid是数据流原生的,因此,Druid和Kafka之间不须要衔接器,它可以间接衔接到Kafka主题,并且支持准确的一次性性语义。同时,Druid也被设计为用于大规模地加快捕捉流数据,并在事情抵达时,立刻在内存中启动查问。
Druid如何与Kafka原生集成,以成功数据流捕捉
在查问方面,Druid是一种高性能的实时剖析数据库,可以在大规模和负载条件下,提供亚秒级的查问。它十分适用于那些对性能极端敏感,并且须要处置从TB到PB的数据(例如:聚合、过滤、GroupBy、以及复杂衔接等)和高查问体量的用例。Druid岂但能够继续提供快如闪电的查问,而且可以轻松从一台笔记本电脑裁减为由1000个节点组成的集群。这就是Druid被称为实时剖析数据库的要素。以下是Druid与Flink的互补用例:
高度交互式查问
工程团队可以经常使用Druid支持包含:各种外部(即经营)和外部(即面向客户)触及到可观察性、安保性、产品剖析、物联网与遥测、制作经营等数据密集型剖析运行。其外围特点包含:
这些运行要么具有交互性很强的数据可视化、以及分解结果集的用户界面,并得益于Druid的加快,能够十分灵敏地即时更改查问;要么在很多状况下,它们应用Druid的运行程序接口(API)来提高查问速度,从而为决策上班流提供依据。
下图展现的是一个由ApacheDruid支持的剖析运行示例。
图片起源:Confluent的ConfluentHealth+仪表板
妇孺皆知,由ApacheKafka原创的Confluent,可以经过ConfluentHealth+为客户提供剖析服务。上图中的应用具有高度交互性。通常,事情会以每秒500万次的速度流向Kafka和Druid,该运行经过提供350QPS的服务,来深化洞察客户的Confluent环境。
实时历史数据
Druid与实时数据架构的关联之处在于,它可以提供实时数据与历史数据相联合的交互式数据体验,从而提供更丰盛的语境。
假设说Flink擅长回答如今出现着什么(即收回Flink义务的以后形态)的话,那么Druid则在技术上能够回答如今出现的与之前相比有何不同,哪些要素或条件对结果发生了影响。回答这些疑问将有助于消弭误报,帮忙检测新的趋向,进而做出更有洞见的实时决策。
要回答与以前相比状况如何?的不懂,咱们往往须要以过去的某一天、一周、一年或其余期间跨度,来启动相关性剖析。而要回答哪些要素或条件影响了却果,咱们则须要开掘完整的数据集。因为Druid是一个能够实时剖析的数据库,因此它可以捕捉可供实时洞察的数据流,同时它也会耐久性地保留数据,以便随时查问多维度的历史信息。
Druid的查问引擎如何处置实时和历史数据
假定咱们正在构建一个用于监控登录可疑行为的运行程序,那么咱们或许宿愿在五分钟的期间窗口内设置一个阈值--更新并颁布登录尝试的形态。仰仗Druid,以后的登录尝试可以与历史数据相关联,以识别过去未出现、但确实被应用过的登录安保破绽。据此,历史背景将有助于确定以后的登录重复尝试能否属于反常行为。
此外,假设您的运行程序须要接纳大型批处置文件,且对瞬息万变的事情启动少量剖析(如:以后形态、各种聚合、分组、期间窗口、以及复杂衔接等),同时还要提供历史背景,并经过高度灵敏的运行程序接口来检索数据集,那么这些都是Druid的长处所在。
选用Flink和Druid的审核表
可见,Flink和Druid都是为流数据而构建的。只管它们有着一些上档次的相似之处,例如:都属于内存外部(in-memory)、都能裁减、都能并行,然而正如前文所述,它们的架构实践上是为齐全不同的用例而构建的。上方,我为您整顿了一份繁难的、基于上班量来判别该如何选用的审核表:
总的说来,在大少数状况下,您的选用不会是非Druid即Flink,而是既Druid又Flink。它们各自的技术特性使得两者能够共同支持各种实时运行。
小结
随着企业关于数据实时性的要求越来越高,数据团队须要从新思考端到端的数据上班流程。这就是为什么许多公司已将Kafka+Flink+Druid作为构建实时运行的开源数据架构的要素。
译者引见
陈峻(JulianChen),51CTO社区编辑,具有十多年的IT名目实施阅历,擅长对内外部资源与危险实施管控,专一传达网络与信息安保常识与阅历。
原文题目: BuildingaReal-Time>
Tags:点击:()评论:()如何经常使用Python、ApacheKafka和云平台构建强健的实时数据管道译者|李睿审校|重楼在当今竞争强烈的市场环境中,为了生活和开展,企业肯定能够实时搜集、处置和照应数据。无论是检测欺诈、共性化用户体验还是监控系统,如今都须要凑近即时...【详细内容】2024-01-26Search: 点击:(46)评论:(0)参与收藏 ApacheRocketMQ5.0腾讯云落地通常ApacheRocketMQ开展历程回忆RocketMQ最早降生于淘宝的在线电商买卖场景,经过了历年双十一大促流量洪峰的打磨,2016年募捐给Apache社区,成为Apache社区的顶级名目,并在国...【详细内容】2023-12-13Search: 点击:(129)评论:(0)参与收藏 应用ApacheKafka、Flink和Druid构建实时数据架构译者|陈峻审校|重楼如今,关于经常使用批处置上班流程的数据团队而言,要满足业务的实时要求并非易事。从数据的交付、处置到剖析,整个批处置上班流往往须要少量的期待,其中包含:等...【详细内容】2023-12-11Search: 点击:(227)评论:(0)参与收藏 Contentsquare经常使用微服务和ApacheKafka来发送通知作者|RafalGancarz译者|平川筹划|TinaContentsquare平台的许多场景都须要通知性能。作为其微服务架构的一局部,该公司创立了一个跨多个服务的通用途理打算。在成功过...【详细内容】2023-10-29Search: 点击:(331)评论:(0)参与收藏 如何确定ApacheKafka的大小和规模作者丨AndrewMills编译丨云昭调整或裁减Kafka以取得最佳老本和性能的第一步是了解数据流平台如何经常使用资源。这里给一些适用的倡导。成功ApacheKafka的团队,或许裁减他们对...【详细内容】2023-10-23Search: 点击:(323)评论:(0)参与收藏 什么让ApacheKafka如此加快?Kafka支持高吞吐量、高度散布式、容错性强的平台,能够以低提前传递信息。有几种技术使ApacheKafka如此加快:低提前信息传递批量数据和紧缩水平裁减低提前信息传递大多...【详细内容】2023-09-12Search: 点击:(350)评论:(0)参与收藏 Go言语开发者的ApacheArrow经常使用指南:内存治理假设你看了上一篇《Go言语开发者的ApacheArrow经常使用指南:数据类型》[1]中的诸多Go操作arrow的代码示例,你很或许会被代码中少量经常使用的Retain和Release方法搞晕。不光大家有这...【详细内容】2023-09-11Search: 点击:(264)评论:(0)参与收藏 ApacheIceberg在严选批流一体的通常Iceberg是数据湖处置打算中比拟抢手的打算之一,通罕用于批流一体中数据存储的组织成功,宿愿经过本文让大家了解到严选是如何从老的Lambda架构更新到基于Iceberg的批流一体架构...【详细内容】2023-09-04Search: 点击:(281)评论:(0)参与收藏 Set汇合工具类Apache之SetUtils本文关键讲述:汇合工具类Apache之org.apache.commons.collections4.SetUtils上文引见了关于ListUtils的实例,本文咱们对SetUtils的局部用法启动展示。一、判别两Set汇合能否...【详细内容】2023-08-14Search: 点击:(222)评论:(0)参与收藏 ApacheSpark的新编程言语EnglishSDKforSpark:将英语作为一种新的编程言语,将生成式AI当做编译器,将Python视作字节码!本文关键引见了ApacheSpark的英语软件开发套件(SDK)的关键性和目的,以及...【详细内容】2023-07-07Search: 点击:(238)评论:(0)参与收藏 ▌繁难百科介绍关于微服务架构监控应该遵守的准绳随着软件交付形式的改革,微服务架构的兴起使得软件开发变得愈加加快和灵敏。在这种状况下,监控系统成为了微服务控制系统的外围组成局部。随着软件的复杂性始终参与,了解系统的...【详细内容】2024-04-03步步运维步步坑Tags:架构 点击:(4)评论:(0)参与收藏 大模型运行的10种架构形式作者|曹洪伟在塑造新畛域的环节中,咱们往往依赖于一些经过通常验证的战略、方法和形式。这种观念关于软件工程畛域的专业人士来说,曾经习认为常,设计形式已成为程序员们的重...【详细内容】2024-03-27InfoQTags:架构形式 点击:(13)评论:(0)参与收藏 哈啰云原生架构落地通常一、弹性伸缩技术通常1.全网容器化后一线研发的经常使用疑问全网容器化后一线研发会面临一系列经常使用疑问,包含机遇、容量、效率和老本疑问,弹性伸缩是云原生容器化后的肯定技术选用...【详细内容】2024-03-27哈啰技术微信群众号Tags:架构 点击:(10)评论:(0)参与收藏 DDD与CQRS才是黄金组合在日常上班中,你能否也遇到过上方几种状况:经常使用一个已有接口启动业务开发,上线后出现重大的性能疑问,被老板当众质疑:你为什么不经常使用缓存接口,这个接口所有走数据库,这怎样能扛...【详细内容】2024-03-27dbaplus社群Tags: 点击:(11)评论:(0)参与收藏 高并发架构设计(三大利器:缓存、限流和升级)软件系统有三个谋求:高性能、高并发、高可用,俗称三高。本篇讨论高并发,从高并发是什么到高并发应答的战略、缓存、限流、升级等。引言1.高并发背景互联网行业迅速开展,用户量剧...【详细内容】2024-03-13阿里云开发者Tags:高并发 点击:(5)评论:(0)参与收藏 如何判别架构设计的优劣?架构设计的基本准绳是十分关键的,它们指点着咱们如何构建牢靠、可保养、可测试的系统。上方是这些准绳的转换表白形式:繁难即美(KISS):KISS准绳的外围理想是坚持繁难。在设计系统...【详细内容】2024-02-20二进制跳动微信群众号Tags:架构设计 点击:(36)评论:(0)参与收藏 详解基于SpringBoot的WebSocket运行开发在现代Web运行中,实时交互和数据推送的需求日益增长。WebSocket协定作为一种全双工通讯协定,准许服务端与客户端之间建设耐久性的衔接,实事实时、双向的数据传输,极大地优化了用...【详细内容】2024-01-30ijunfu今天头条Tags:SpringBoot 点击:(8)评论:(0)参与收藏 PHP+Go开发仿简书,实战高并发高可用微服务架构来百度APP畅享高清图片//下栽のke:chaoxingit.com/2105/PHP和Go言语联合,可以开收回高效且稳固的仿简书运行。在成功高并发和高可用微服务架构时,咱们可以驳回一些关键技术。首...【详细内容】2024-01-14547蓝色星球Tags:架构 点击:(114)评论:(0)参与收藏 GraalVM与SpringBoot3.0:减速运行性能的完美融合在2023年,SpringBoot3.0的颁布标记着Spring框架对GraalVM的片面支持,这一支持是对Spring技术栈的关键补充。GraalVM是一个高性能的多言语虚构机,它提供了Ahead-of-Time(AOT)编...【详细内容】2024-01-11王建设Tags:SpringBoot 点击:(124)评论:(0)参与收藏 SpringBoot虚构线程的性能还不如Webflux?早上看到一篇关于SpringBoot虚构线程和Webflux性能对比的文章,感觉还不错。内容较长,抓重点给大家引见一下这篇文章的外围内容,繁难大家加快浏览。测试场景作者驳回了一个尽可...【详细内容】2024-01-10互联网架构小马哥Tags:SpringBoot 点击:(115)评论:(0)参与收藏Flink:特性、概念、组件栈、架构及原理分析
简单之美 | Apache Flink:特性、概念、组件栈、架构及原理分析
Apache Flink是一个面向分布式数据流处理和批量数据处理的开源计算平台,它能够基于同一个Flink运行时(Flink Runtime),提供支持流处理和批处理两种类型应用的功能。现有的开源计算方案,会把流处理和批处理作为两种不同的应用类型,因为他们它们所提供的SLA是完全不相同的:流处理一般需要支持低延迟、Exactly-once保证,而批处理需要支持高吞吐、高效处理,所以在实现的时候通常是分别给出两套实现方法,或者通过一个独立的开源框架来实现其中每一种处理方案。例如,实现批处理的开源方案有MapReduce、Tez、Crunch、Spark,实现流处理的开源方案有Samza、Storm。Flink在实现流处理和批处理时,与传统的一些方案完全不同,它从另一个视角看待流处理和批处理,将二者统一起来:Flink是完全支持流处理,也就是说作为流处理看待时输入数据流是无界的;批处理被作为一种特殊的流处理,只是它的输入数据流被定义为有界的。基于同一个Flink运行时(Flink Runtime),分别提供了流处理和批处理API,而这两种API也是实现上层面向流处理、批处理类型应用框架的基础。 基本特性 关于Flink所支持的特性,我这里只是通过分类的方式简单做一下梳理,涉及到具体的一些概念及其原理会在后面的部分做详细说明。 流处理特性 支持高吞吐、低延迟、高性能的流处理 支持带有事件时间的窗口(Window)操作 支持有状态计算的Exactly-once语义 支持高度灵活的窗口(Window)操作,支持基于time、count、session,以及data-driven的窗口操作 支持具有Backpressure功能的持续流模型 支持基于轻量级分布式快照(Snapshot)实现的容错 一个运行时同时支持Batch on Streaming处理和Streaming处理 Flink在JVM内部实现了自己的内存管理 支持迭代计算 支持程序自动优化:避免特定情况下Shuffle、排序等昂贵操作,中间结果有必要进行缓存
API支持 对Streaming数据类应用,提供DataStream API 对批处理类应用,提供DataSet API(支持Java/Scala)
Libraries支持 支持机器学习(FlinkML) 支持图分析(Gelly) 支持关系数据处理(Table) 支持复杂事件处理(CEP)
整合支持 支持Flink on YARN 支持HDFS 支持来自Kafka的输入数据 支持Apache HBase 支持Hadoop程序 支持Tachyon 支持ElasticSearch 支持RabbitMQ 支持Apache Storm 支持S3 支持XtreemFS
基本概念 Stream & Transformation & Operator 用户实现的Flink程序是由Stream和Transformation这两个基本构建块组成,其中Stream是一个中间结果数据,而Transformation是一个操作,它对一个或多个输入Stream进行计算处理,输出一个或多个结果Stream。当一个Flink程序被执行的时候,它会被映射为Streaming Dataflow。一个Streaming Dataflow是由一组Stream和Transformation Operator组成,它类似于一个DAG图,在启动的时候从一个或多个Source Operator开始,结束于一个或多个Sink Operator。下面是一个由Flink程序映射为Streaming Dataflow的示意图,如下所示:
比如从Source[1]到map()[1],它保持了Source的分区特性(Partitioning)和分区内元素处理的有序性,也就是说map()[1]的Subtask看到数据流中记录的顺序,与Source[1]中看到的记录顺序是一致的。 Redistribution模式
这种模式改变了输入数据流的分区,比如从map()[1]、map()[2]到keyBy()/window()/apply()[1]、keyBy()/window()/apply()[2],上游的Subtask向下游的多个不同的Subtask发送数据,改变了数据流的分区,这与实际应用所选择的Operator有关系。另外,Source Operator对应2个Subtask,所以并行度为2,而Sink Operator的Subtask只有1个,故而并行度为1。 Task & Operator Chain 在Flink分布式执行环境中,会将多个Operator Subtask串起来组成一个Operator Chain,实际上就是一个执行链,每个执行链会在TaskManager上一个独立的线程中执行,如下图所示:
在Flink集群启动的时候,TaskManager会向JobManager注册,如果注册成功,则JobManager会向TaskManager回复消息AcknowledgeRegistration。 SubmitJob
Flink程序内部通过Client向JobManager提交Flink Job,其中在消息SubmitJob中以JobGraph形式描述了Job的基本信息。 CancelJob
请求取消一个Flink Job的执行,CancelJob消息中包含了Job的ID,如果成功则返回消息CancellationSuccess,失败则返回消息CancellationFailure。 UpdateTaskExecutionState
TaskManager会向JobManager请求更新ExecutionGraph中的ExecutionVertex的状态信息,更新成功则返回true。 RequestNextInputSplit
运行在TaskManager上面的Task,请求获取下一个要处理的输入Split,成功则返回NextInputSplit。 JobStatusChanged
ExecutionGraph向JobManager发送该消息,用来表示Flink Job的状态发生的变化,例如:RUNNING、CANCELING、FINISHED等。 TaskManager TaskManager也是一个Actor,它是实际负责执行计算的Worker,在其上执行Flink Job的一组Task。每个TaskManager负责管理其所在节点上的资源信息,如内存、磁盘、网络,在启动的时候将资源的状态向JobManager汇报。TaskManager端可以分成两个阶段: 注册阶段
TaskManager会向JobManager注册,发送RegisterTaskManager消息,等待JobManager返回AcknowledgeRegistration,然后TaskManager就可以进行初始化过程。 可操作阶段
该阶段TaskManager可以接收并处理与Task有关的消息,如SubmitTask、CancelTask、FailTask。如果TaskManager无法连接到JobManager,这是TaskManager就失去了与JobManager的联系,会自动进入“注册阶段”,只有完成注册才能继续处理Task相关的消息。 Client 当用户提交一个Flink程序时,会首先创建一个Client,该Client首先会对用户提交的Flink程序进行预处理,并提交到Flink集群中处理,所以Client需要从用户提交的Flink程序配置中获取JobManager的地址,并建立到JobManager的连接,将Flink Job提交给JobManager。Client会将用户提交的Flink程序组装一个JobGraph, 并且是以JobGraph的形式提交的。一个JobGraph是一个Flink Dataflow,它由多个JobVertex组成的DAG。其中,一个JobGraph包含了一个Flink程序的如下信息:JobID、Job名称、配置信息、一组JobVertex等。 组件栈 Flink是一个分层架构的系统,每一层所包含的组件都提供了特定的抽象,用来服务于上层组件。Flink分层的组件栈如下图所示:
了解YARN的话,对上图的原理非常熟悉,实际Flink也实现了满足在YARN集群上运行的各个组件:Flink YARN Client负责与YARN RM通信协商资源请求,Flink JobManager和Flink TaskManager分别申请到Container去运行各自的进程。通过上图可以看到,YARN AM与Flink JobManager在同一个Container中,这样AM可以知道Flink JobManager的地址,从而AM可以申请Container去启动Flink TaskManager。待Flink成功运行在YARN集群上,Flink YARN Client就可以提交Flink Job到Flink JobManager,并进行后续的映射、调度和计算处理。 Runtime层
Runtime层提供了支持Flink计算的全部核心实现,比如:支持分布式Stream处理、JobGraph到ExecutionGraph的映射、调度等等,为上层API层提供基础服务。 API层
API层主要实现了面向无界Stream的流处理和面向Batch的批处理API,其中面向流处理对应DataStream API,面向批处理对应DataSet API。 Libraries层
该层也可以称为Flink应用框架层,根据API层的划分,在API层之上构建的满足特定应用的实现计算框架,也分别对应于面向流处理和面向批处理两类。面向流处理支持:CEP(复杂事件处理)、基于SQL-like的操作(基于Table的关系操作);面向批处理支持:FlinkML(机器学习库)、Gelly(图处理)。 内部原理 容错机制 Flink基于Checkpoint机制实现容错,它的原理是不断地生成分布式Streaming数据流Snapshot。在流处理失败时,通过这些Snapshot可以恢复数据流处理。理解Flink的容错机制,首先需要了解一下Barrier这个概念:Stream Barrier是Flink分布式Snapshotting中的核心元素,它会作为数据流的记录被同等看待,被插入到数据流中,将数据流中记录的进行分组,并沿着数据流的方向向前推进。每个Barrier会携带一个Snapshot ID,属于该Snapshot的记录会被推向该Barrier的前方。因为Barrier非常轻量,所以并不会中断数据流。带有Barrier的数据流,如下图所示:
接收到Barrier n的Stream被临时搁置,来自这些Stream的记录不会被处理,而是被放在一个Buffer中 一旦最后一个Stream接收到Barrier n,Operator会emit所有暂存在Buffer中的记录,然后向Checkpoint Coordinator发送Snapshot n 继续处理来自多个Stream的记录
基于Stream Aligning操作能够实现Exactly Once语义,但是也会给流处理应用带来延迟,因为为了排列对齐Barrier,会暂时缓存一部分Stream的记录到Buffer中,尤其是在数据流并行度很高的场景下可能更加明显,通常以最迟对齐Barrier的一个Stream为处理Buffer中缓存记录的时刻点。在Flink中,提供了一个开关,选择是否使用Stream Aligning,如果关掉则Exactly Once会变成At least once。 调度机制 在JobManager端,会接收到Client提交的JobGraph形式的Flink Job,JobManager会将一个JobGraph转换映射为一个ExecutionGraph,如下图所示:
迭代机制 机器学习和图计算应用,都会使用到迭代计算,Flink通过在迭代Operator中定义Step函数来实现迭代算法,这种迭代算法包括Iterate和Delta Iterate两种类型,在实现上它们反复地在当前迭代状态上调用Step函数,直到满足给定的条件才会停止迭代。下面,对Iterate和Delta Iterate两种类型的迭代算法原理进行说明: Iterate
Iterate Operator是一种简单的迭代形式:每一轮迭代,Step函数的输入或者是输入的整个数据集,或者是上一轮迭代的结果,通过该轮迭代计算出下一轮计算所需要的输入(也称为Next Partial Solution),满足迭代的终止条件后,会输出最终迭代结果,具体执行流程如下图所示:
Delta Iterate Operator实现了增量迭代,它的实现原理如下图所示:
另外,Flink还提供了3个参数来配置Backpressure监控行为: 参数名称 默认值 说明
-interval 默认1分钟,表示采样统计结果刷新时间间隔
-samples 100 评估Backpressure状态,所使用的堆栈跟踪调用次数
-between-samples 50 默认50毫秒,表示对一个Job的每个Task依次调用的时间间隔
通过上面个定义的Backpressure状态,以及调整相应的参数,可以确定当前运行的Job的状态是否正常,并且保证不影响JobManager提供服务。 参考链接
NoSQL:如何使用NoSQL架构构建实时广告系统
JDNoSQL平台是什么JDNoSQL平台是一个分布式面向列的KeyValue毫秒级存储服务,存储结构化数据和非机构化数据,支持随机读写与更新,灵活的动态列机制,架构上支持水平扩容,提供高并发、低延迟、高可用、强一致数据库服务,可满足各种业务场景。 完善的平台支持,支持业务自助化建表,查看监控,在线DDL等。 1.1 JDNoSQL所处生态的位置从上图可以看出,JDNoSQL是一种构建在HDFS之上的分布式、面向列的存储系统。 在需要实时读写、随机访问超大规模数据集时,可以使用JDNoSQL。 目前市面上的一些关系类型数据库,在构建时并没有考虑超大规模和分布式的特点。 许多商家通过复制和分区的方法来扩充数据库使其突破单个节点的界限,但这些功能通常都是事后增加的,安装和维护都很复杂。 同时,也会影响RDBMS的特定功能,例如联接、复杂的查询、触发器、视图和外键约束这些操作在大型的RDBMS上的代价相当高,甚至根本无法实现。 JDNoSQL从另一个角度处理伸缩性问题。 它通过线性方式从下到上增加节点来进行扩展。 JDNoSQL不是关系型数据库,也不支持SQL目前可以通过JDPhoenix支持SQL,但是它有自己的特长,这是RDBMS不能处理的,JDNoSQL巧妙地将大而稀疏的表放在商用的服务器集群上。 JDNoSQL有如下特点:大:一个表可以有上亿行,上百万列。 面向列:面向列表(簇)的存储和权限控制,列(簇)独立检索。 稀疏:对于为空(NULL)的列,并不占用存储空间,因此,表可以设计的非常稀疏。 无模式:每一行都有一个可以排序的主键和任意多的列,列可以根据需要动态增加,同一张表中不同的行可以有截然不同的列。 数据多版本:每个单元中的数据可以有多个版本,默认情况下,版本号自动分配,版本号就是单元格插入时的时间戳。 数据类型单一:JDNoSQL中的数据都是字符串,没有类型。 应用场景NoSQL在京东的使用主要涉及一下场景:时序型业务(监控,IOT)消息订单(订单/保单,聊天记录)CUBE分析(实时宽表,报表,搜索推荐)监控(UMP/MDC/CAP/JDH)Feeds流业务(评价信息,问答信息,瀑布流,朋友圈)AI Storage(用户特征、NLP语料、模型存储)时空数据(轨迹、气象网络)金融业务(关联分析、信用分析、风控/白条/支付/资管)2.1 基于NoSQL的广告实时计算系统2.1.1 网络广告的几个大特性:相对传统广告,网络广告呈现出一些自身特点,了解这些特点,是网络广告营销策略实质的基础。 网络广告的特点如下:传播范围广:网络广告的传播范围广,不受时空的限制,可以通过互联网把广告信息全天候不间断的传播到世界各地。 我国网民数量巨大,而且还在快速发展,这些网民有较高的消费能力,是网络广告的受众,可以在世界任何地方的互联网上随意的浏览广告,这种传播效果是任何一种传统媒体都无法达到的。 非强迫性传播资讯:网络广告属性按需广告,具有报纸分类广告的性质,却不需要受众彻底浏览,可以自由查询,并根据潜在顾客的需要主动呈现和展示,这样就节省了整个社会的注意力资源,提高了广告的针对性和有效性。 受众数据量可精准统计:传统的媒体广告,很难精准知道有多少人接触了广告信息,互联网广告,可以通过权威、公正的流量统计系统,精准统计每个广告的浏览人数以前这些用户查阅时长和地域分布,从而有利于正确的评估广告效果,进一步优化广告投放策略。 灵活的时效性:互联网广告能按需要及时更新广告内容。 强烈的交换性和感官性:网络广告的载体基本都是多媒体,超文本等,需要受众对产品感兴趣,仅需要点击进一步了解更多、更详细、更生动的信息,甚至还能让消费者亲自体验产品,服务和品牌,通过虚拟现实技术,可以让顾客身临其境。 2.1.2 网络广告的数据类型:网络广告相关的采集数据很多种,其中最关键的有四类:展现、点击、行为、和第三方数据监控。 广告展现数据广告展现数据是指广告位获得的展现的数据,一般该数据都需要发送到服务器端,用于广告展现量(adpv)的统计分析。 一般数据包含日期、用户ID、广告ID和IP等信息。 下面是一种广告展现的数据格式,其中JSON字段扩展:2015-01-13 19:11:55{00D81D1D-00A291-0E2300-87DBCE0DA90} {“adia”,asid: 2,aspid:0,ptime: 14,ag:4,5.20,26.1908,ecode: 15,type:2,dp1: 1,adpid:0,dsp: 0,source: s}61.237.239.3 天津 天津市广告点击数据广告点击数据是指各个广告位获取的用户点击的数据,一般该数据也都需要发送到服务器端,用于广告点击量(adclick)的统计分析。 一般点击数据包含日期、用户ID、广告ID和IP等信息。 下面是一种广告点击的数据格式,与广告展示并没有多少区别:2015-01-13 00:11:06{DC3-000C84-2345FB-DB768EC56} {wid:13,aid: ,vid,adid: ,asid:1,aspid: 1,mid,mg: 155,area:13,dsp: 3} 175.8.146.246 湖南省 长沙市广告行为数据广告行为数据是指广告位获得的用户下载、安装或者交易的数据,一般该数据也都需要发送到服务器端,用于广告行为(adaction)的他那个就分析。 一般行为数据包含日期、用户ID、广告ID和IP等信息。 下面是一种广告行为的数据格式,与广告展示数据也没有多少区别,只是JSON扩展字段总的一些信息不同:2015-01-13 09:59:39{D26AD-565D01-C2238-FC0A0} {adid,asid: 562, aspid:12,type: 1} 120.29.183.47 福建省 宁德市第三方监控数据为使得广告主方便了解目标消费的网络媒体浏览习惯,转化成顾客的概率等,并且获取公正、客观、权威的统计信息,非常的有必要使用第三方广告监控公司参与广告投放的监控。 而第三方的监控也会生产监控数据,包含日期、广告ID和用户ID等。 下面是第三方监控数据的示例:2014-12-31 108A451BD3787_22E6_D020_786DF2695B {000AD-19DDC2-971F26-36F}2.1.3. 广告数据的挑战数据价值随着时间的流逝而降低,所以事件出现后必须尽快对他们进行处理,最好数据出现后便立刻能对其进行处理,发生一个事件进行一次处理,而不是缓存起来成批再处理,在数据流模型中,需要处理的输入数据(全部或是部分)并不存储在可随机访问的磁盘或是内存中,他们以一个或是多个“连续数据流”的形式到达。 数据不同于传统的存储关系模型,主要有一下几个方面特点:流中的数据元素在线到达,需要实时处理系统无法控制将要处理的新到达的数据元素的顺序,无论这些数据元素是在一个数据流中还在跨多个数据流;也即重放的数据流可能和上次数据流的元素顺序不一致。 数据流的潜在大小也许是无穷无尽的。 一旦数据流中的某个元素经过处理,要么被丢弃,要么被归档存储。 2.1.4 系统主要功能该系统目前只为广告业服务,要求广告展现数据和广告点击数据能够实时的反映到库存系统,库存系统可以根据现有投放量计算之后的投放策略。 同时,能提供某些广告在月每天的展现量统计,并且可以分省,市和用户三个维度统计。 在满足上面功能的前提下,对系统性能要求延时在30秒内,支持峰值在TPS=500W的访问请求。 2.1.5. 系统架构根据前面的需求分析,设计目标和主要功能的要求,将整个广告实时计算系统划分为六层:日志接收层、生产者层、消费队列层、消费者层、业务逻辑层和存储层。 其中消息队列选用京东JDQ实时数据管道,提供基于Kafka实现的高吞吐的分布式消息队列,供流式计算场景使用,业务逻辑层选用京东JRC 流式计算,提供基于Flink的流式计算引擎,用于流式计算,存储选用高并发、低延迟、高可用,满足千万级QPS高吞吐、随机读写的NoSQL分布式存储。 架构图如下:日志接收层该层是数据源头,通过日志接收工具生产本地日志文件。 常用的接收工具包括Scribe、Nginx、Syslog-ng和Apache Http Server等,接收后这些数据流将存储到本地磁盘文件中。 生产者层该层是数据传输层,用于将日志文件从本地发生到Kafka集群,实时监控指定的文件或是目录,提取增量数据发送到Kafka集群。 消息队列层该层是Kafka集群,负责输入数据的负载均衡、消息缓冲、同时具备高吞吐、水平扩展性好等特征。 消息队列层之所以选择Kafka,是因为Kafka侧重吞吐量的特性,并且具备缓冲的功能。 消费者层该层应用消费kafka队列中的消息,并且将消息数输入到业务逻辑层,是承上启下的子层。 由于业务逻辑层使用Flink框架,所有消费层需要连通Kafka和Flink两个集群。 业务逻辑层该层是实现需求的重要子层,使用Flink框架,能够非常方便的部署不同规则的业务需求,并且可以实现快速计算。 存储层目标存储选择使用的分布式存储NoSQL,可以满足高吞吐低延时实时更新、查找某些特定场景的的业务需求,也可以满足水平扩展的需求。 2.1.6. 表设计为满足最终结果的实时查询和周期性统计需求,将结果数据存在NoSQL中,首先需要定义表的结构。 因为数据包括广告展现和广告点击两类无关联的数据,并且业务方向也不同,所以需要创建两个表来存储这两类数据的统计结构。 广告实时展现统计表广告实时展示统计表的结构设计如下:其中,行建的设计非常关键,该表包含三种类型的行建,分别以省名称、市名称和uid作为区分,用于更高效地统计这三个维度的数据;列族和列的数量都是1。 下面是广告实时统计表的一行数据实例,其中value字段采用十六进制字节码表示,是长整型。 _{2EEBEE83-EEE4-EAE6-1F0D-A27ABFC}_ column=pv:cnt,timestamp=83,value= \\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x02广告实时点击统计表广告实时点击统计表的结构设如下:相比广告实时展现统计表,实时点击统计表明显简单一些,行建只有一种类型:adid_加上日期,很常规的一种设计方案;列族和列的数据量都是1。 下面是广告实时点击统计表的一行数据示例,其中value字段采用十六进制字节码表示,是长整型。 _ column=clk:cnt, timestamp=61, value=\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x062.1.7. 使用NoSQL统计数据根据上面表结构设计的描述和实现,该结构支持下面的多种实时查询的需求:某个广告在某省的当前投放量。 某个广告在某市的当前投放量。 某个广告在某个用户客户端上的当前投放量某个广告的当前点击量某个广告在累计一段时间内(如一个月)的某个省的历史投放趋势某个广告在累计一段时间内(如一个月)的某个市的历史投放趋势某个广告在累计一段时间内(如一个月)的某个用户客户端上的历史投放趋势某个广告在累计一段时间内(如一个月)的点击量趋势以上提到的这些需求,通过封装NoSQL客户端可以非常方便的实现,并且满足实时性的需求。 前端数据可视化可以借助开源的JavaScript的框架快速实现,如:echarts,highcharts, 等总结根据Gartner的预计,全球非关系型数据库(NoSQL)在2020~2022预计保持在30%左右高速增长,远高于数据库整体市场。 伴随着NoSQL和大数据技术的兴起和发展,基于NoSQL及NoSQL生态构建的低成本一站式数据处理平台正在蓬勃发展。 目前支持:NoSQLAPI、关系PhoenixSQL、时序OpenTSDB、全文检索Solr/ES、时空GeoMesa、图HGraph、分析Spark on HBase等。 随着NoSQL的高速发展,NoSQL用户群体越来越庞大,未来NoSQL及NoSQL生态也会更好的满足各种业务场景。 NoSQL:如何使用NoSQL架构构建实时广告系统标签:相关如何使用ptime不同的echarts描述获得pen高并发
免责声明:本文转载或采集自网络,版权归原作者所有。本网站刊发此文旨在传递更多信息,并不代表本网赞同其观点和对其真实性负责。如涉及版权、内容等问题,请联系本网,我们将在第一时间删除。同时,本网站不对所刊发内容的准确性、真实性、完整性、及时性、原创性等进行保证,请读者仅作参考,并请自行核实相关内容。对于因使用或依赖本文内容所产生的任何直接或间接损失,本网站不承担任何责任。