使用Kafka、Flink、Druid构建实时数据系统架构

1. 背景

对于很多数据团队来说,要满足实时需求并不容易。为什么?因为作流程(数据采集、预处理、分析、结果保存)涉及大量等待。等待数据发送到 ETL 工具,等待数据批量处理,等待数据加载到数据仓库中,甚至等待查询完成运行。

但开源领域有一个解决方案:Kafka、Flink和Druid一起使用时,可以创建一个实时数据架构,减少这些等待时间。在这篇文章中,我们将探讨如何利用Kafka、Flink、Druid实现广泛的实时数据系统架构。

2. 构建实时数据系统

什么是实时数据系统?想象一下任意一个后台系统或服务器端系统,它们利用数据来实时提供决策依据,这些数据包数据括警报、监控、仪表板、分析和个性化建议。

构建这种实时数据系统就是 Kafka-Flink-Druid (KFD) 架构的用武之地。

这种架构可以轻松构建实时数据应用系统,例如可观测性、物联网/遥测分析、安全检测/诊断以及高吞吐量和 QPS 下面向客户的洞察。

让我们看看它们如何一起使用。

3. 流数据管道:Kafka

Kafka在过去几年中已成为流数据事实上的标准。在此之前,RabbitMQ、ActiveMQ和其他消息队列系统被用来提供各种消息传递模式,将数据从生产者分发到消费者,但存在规模限制。

目前,Kafka 已经无处不在。这是因为 Kafka 的架构远远超出了简单的消息传递范围。 Kafka 非常适合大规模的流数据传输,并具有容错性和数据一致性,以支持关键任务。

4. 流处理:Flink

随着 Kafka 提供实时数据,需要合适的消费者来实时利用其速度和规模。流行的选择之一是Flink。

为什么选择Flink?首先,Flink 凭借其统一的批处理和流处理引擎,在大规模处理连续数据流方面具有独特的优势。Flink 非常适合作为 Kafka 的流处理器,因为它无缝集成并保证每个事件仅处理一次,即使系统出现故障也是如此。

使用它很简单:连接到 Kafka的Topic,定义查询逻辑,然后连续发出结果。也就是“设置好后就可以忘记它”。这使得 Flink 对于立即处理流和可靠性至关重要的场景来说非常通用。

以下是 Flink 的一些常见使用场景:

  • 丰富与转化
  • 持续监控和警报

2.1 丰富与转化

如果流在使用之前需要进行数据操作(例如修改、重组数据),Flink 是对这些数据流进行更改的理想引擎。

例如,假设我们有一个物联网的用例,用于处理智能建筑中的温度传感器。传入 Kafka 的每个数据流都具有以下 JSON 结构:

{"sensor_id": "SensorA","temperature": 73.4,"timestamp": "2023–07–10T10:00:00"
}

如果每个传感器 ID 需要与位置映射,并且温度需要以摄氏度为单位,Flink 可以将 JSON 结构更新为:

{"sensor_id": "SensorA","location": "Room 101","temperature_Fahreinheit": 73.4,"timestamp": "2023–07–10T10:00:00"
}

将其直接发送到应用程序或发送回 Kafka。

Flink 的优势在于它能够大规模实时处理大量 Kafka 流(每秒处理数百万个事件) 。此外,对数据的丰富与转化处理通常是一个无状态过程,其中每个数据记录都可以修改而无需维护持久状态,从而使其工作量最小且性能也很高。

2.2 持续监控和警报

Flink 的实时连续处理和容错能力的结合也使其成为实时检测和响应的理想解决方案。

当检测灵敏度非常高(例如亚秒级)并且采样率也很高时,Flink 的连续处理非常适合作为数据服务层,用于监视条件并相应地触发警报和操作。

Flink 具有警报功能的一个优点是它可以支持无状态和有状态警报。阈值或事件触发器(例如“当温度达到 X 时发送通知”)很简单,但并不总是足够智能。因此,在警报需要由需要记住状态的复杂模式驱动的用例中,甚至需要在连续的数据流中聚合指标(例如总和、平均值、最小值、最大值、计数等),Flink 可以监控并记录数据。更新状态以识别偏差和异常。

需要考虑的一点是,使用 Flink 进行监控和警报需要持续的运算,因此很消耗 CPU,在使用时最好评估是否需要持续运算。

5. 实时分析:Druid

Druid与Kafka和Flink一起成为支持实时分析的流消费者。虽然它是一个用于分析的数据库,但它的用途与其他数据库和数据仓库有很大不同。

首先,Druid 它也是流原生的。事实上,Kafka 不需要连接器,因为它直接连接到 Kafka的Topic,并且支持一次性语义。Druid 还设计用于快速大规模获取流数据,并在事件到达时立即查询内存中的事件。

在查询方面,Druid 是一个高性能、实时分析数据库,可在大规模和负载下提供亚秒级查询。如果用例对性能敏感并且需要处理TBS具有PBS高查询量的数据(例如聚合、过滤器、GroupBy、复杂联接等),那么 Druid 是一个理想的数据库,因为它的查询速度足够快,并且可以轻松地做水平扩展。

这就是为什么 Druid 被称为实时分析数据库:它是为实时数据满足实时查询而设计的。

以下是 Druid 的优点:

  • 高度互动的查询
  • 实时历史数据

5.1 高度互动的查询

使用 Druid 来支持数据密集型程序,涉及可观察性、安全性、产品分析、物联网/遥测、制造操作等。由 Druid 具有以下特点:

  • 大规模性能: 需要对大型数据集进行丰富分析查询的亚秒级读取性能而无需预先计算的应用程序。即使应用程序的用户通过 TB-PB 规模的大量随机查询进行任意分组、过滤和切片/切块,Druid 也具有高性能。
  • 高查询量: 分析查询 QPS 要求高的应用程序。
  • 时间序列数据: 提供时间维度数据洞察的应用程序(Druid 的优势但不是限制)。由于其时间分区和数据格式,Druid 可以非常快速地大规模处理时间序列数据。这使得基于时间的WHERE过滤器变得异常快。

这些应用程序要么具有非常交互式的数据可视化的界面,在动态更改查询方面具有很大的灵活性(因为 Druid 非常快),要么在许多情况下,它们利用 Druid 的 API 来大规模提高查询速度。在Druid的应用案例中,可支持每秒500万个事件流入Kafka和Druid,并使用Druid支持350 QPS。

Druid的使用不仅限于流数据,也可以提供实时数据与历史数据相结合的交互式数据体验,以获得更丰富的上下文。

虽然 Flink 非常擅长回答“现在正在发生什么”,但 Druid 可以回答“现在正在发生什么,与之前相比如何,以及哪些因素影响了这一结果”。这些问题加在一起非常强大,因为它们可以消除误报、帮助发现新趋势。

例如,假设我们正在构建一个应用程序来监视安全登录是否存在可疑行为。我们可能想在 5 分钟窗口内设置一个阈值:即尝试登录的行为发生的次数。这对于 Flink 来说很容易。但使用 Druid,当前的登录尝试还可以与历史数据相关联,以识别过去没有安全漏洞的类似登录峰值。

因此,当应用程序需要针对快速变化的事件提供大量分析(例如当前状态、各种聚合、分组、时间窗口、复杂连接等)时,还需要提供历史背景并通过高度集成的方式探索该数据集。这种场景非常时候Druid。

Flink 和 Druid 的决策清单

Flink 和 Druid 都是为流数据而构建的。虽然它们有一些高级相似之处——都在内存中,都可以扩展,都可以并行化——但它们的架构实际上是为完全不同的用例构建的,这里列出一份简单的决策清单,以便选择Druid还是Flink:

  1. 是否需要在流数据上实时转换或连接数据? 选择Flink
  2. 您需要同时支持许多不同的查询吗? 选择Druid
  3. 指标是否需要不断更新或汇总? 选择Flink
  4. 分析是否更复杂,是否需要历史数据进行比较? 选择Druid
  5. 是否在选择程序可视化的方案? Flink + Druid

大多数情况下,答案不是 Druid 或 Flink,而是 Druid 和 Flink。每一个都提供了技术特性,使它们非常适合支持广泛的实时数据应用程序。

结论

企业对数据团队的实时性要求越来越高。这意味着需要端到端地重新考虑数据工作流程。这就是为什么许多公司转向 Kafka-Flink-Druid 作为构建实时数据应用程序的事实上的开源数据架构。他们是完美的三人组。

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

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

相关文章

Vulhub靶场-KIOPTRIX: LEVEL 1.1

目录 环境配置 端口扫描 漏送发现 漏送利用 提权(内核漏洞提权) 环境配置 环境配置的过程同主页该专栏第一个靶场,不在赘述。 端口扫描 首先通过arp-scan并根据靶机的mac地址确定靶机的IP地址 然后对靶机进行一个扫描 首先扫描到OpenS…

C++--STL学习笔记

参考教程:黑马程序员匠心之作|C教程从0到1入门编程,学习编程不再难_哔哩哔哩_bilibili 软件界一直希望建立一种可重复利用的东西,C的面向对象和泛型编程思想,目的就是复用性的提升。 大多情况下,数据结构和算法都未能有一套标准,…

线程(线程基本概念、java实现多线程、使用多线程、线程的生命周期、线程同步、线程死锁)

(一)线程基本概念 一、 程序, 进程, 线程的概念 程序: 使用某种语言编写一组指令(代码)的集合,静态的 进程: 运行的程序,表示程序一次完整的执行, 当程序运行完成, 进程也就结束了 个人电脑: CPU 单个, 双核, CPU的时间分片, 抢占式 每个独立执行的程…

OpenCV快速入门:目标检测——轮廓检测、轮廓的距、点集拟合和二维码检测

文章目录 前言一、轮廓检测1.1 图像轮廓的概念1.2 轮廓检测算法简介1.3 轮廓检测基本步骤1.4 轮廓检测函数说明1.4.1 轮廓发现1.4.2 轮廓面积1.4.3 轮廓周长1.4.4 轮廓外接多边形1.4.5 点到轮廓距离1.4.6 凸包检测 1.5 轮廓检测代码实现 二、轮廓的距2.1 几何距2.2 中心距2.3 H…

ssh远程连接不了虚拟机ubuntu

直奔主题 1. 确保linux安装了ssh2.查看网络适配器是否启用3.连接成功 1. 确保linux安装了ssh sudo apt-get install openssh-server2.查看网络适配器是否启用 3.连接成功

VBA技术资料MF85:将工作簿批量另存为PDF文件

我给VBA的定义:VBA是个人小型自动化处理的有效工具。利用好了,可以大大提高自己的工作效率,而且可以提高数据的准确度。我的教程一共九套,分为初级、中级、高级三大部分。是对VBA的系统讲解,从简单的入门,到…

如何实现车机体验”遥遥领先”?头部玩家已经给出答案

车机与手机的深度融合,通过跨终端互联互通实现全场景、沉浸式的用户体验,正在成为各大高端智能汽车品牌的新战场。 此前,已经有华为、苹果几大手机巨头已经纷纷开启“造车”业务,同时吉利等车企也反向进入手机领域,各…

TransmittableThreadLocal - 线程池中也可以传递参数了

一、InheritableThreadLocal的不足 InheritableThreadLocal可以用于主子线程之间传递参数,但是它必须要求在主线程中手动创建的子线程才可以获取到主线程设置的参数,不能够通过线程池的方式调用。 但是现在我们实际的项目开发中,一般都是采…

快来看看你的手表是否有忘记关闭的应用在后台偷偷耗电?

在这个智能化的时代,手表已经不仅仅是用来看时间的工具,它更是我们生活的助手,从消息提醒到健康监测,它似乎无所不能。但与此同时,你是否注意到手表电量的续航有时长,有时慢?有可能,…

C语言每日一题(33)随机链表的复制

力扣138 随机链表的复制 题目描述 给你一个长度为 n 的链表,每个节点包含一个额外增加的随机指针 random ,该指针可以指向链表中的任何节点或空节点。 构造这个链表的 深拷贝。 深拷贝应该正好由 n 个 全新 节点组成,其中每个新节点的值都…

解锁OpenAI潜力:OpenAI 全面解析与最佳实践

该项目是由OpenAI公司提供的一个大型代码库,其中包含了各类与OpenAI API相关的代码示例和最佳实践。 此项目名为OpenAI Cookbook,目的是为了帮助使用者更有效地利用OpenAI API,将其应用于自己的工作和生活中。具体来说,可以解决一…

打码平台之图鉴的使用步骤

打码平台之图鉴 背景: ​ 今天给大家推荐一个我一直使用的验证码识别平台,图鉴,我没有收费,我只是觉得这个网站使用方便,支持验证码种类多,好了,话不多说,上教程! 注册…

SmartX 超融合 5.1 版本有哪些新特性和技术提升?

近日,SmartX 正式发布了超融合产品组合 SmartX HCI 5.1 版本,以全面升级的超融合软件、分布式块存储、容器管理与服务、软件定义的网络与安全等组件,为虚拟化和容器负载在计算、存储、网络和管理层面提供统一的架构和生产级别的能力支持。本期…

2024年测试工程师必看文章系列之python+pytest接口自动化(1)-接口测试

一般我们所说的接口即API,那什么又是API呢,百度给的定义如下: API(Application Programming Interface,应用程序接口)是一些预先定义的接口(如函数、HTTP接口),或指软件系…

如何在AIX操作系统上修改Java环境变量

AIX操作系统是IBM的Unix操作系统,通常用于企业级应用和服务器环境。在AIX上配置Java环境变量是执行Java应用程序和开发Java代码的重要步骤。本文将详细介绍如何在AIX上修改Java环境变量,并提供具体示例来帮助你完成这个任务。 步骤1:确定Java…

matlab如何实现任意长序列所有排列方式

最近被问到一个问题,如何计算一个由3个0和3个1组成的序列的所有组合情况,处理这个问题我没有找到特别恰当的函数(如果有能直接做的函数欢迎评论告知),所以采用比较接近需求的perms函数来解决这个问题 首先看perms函数…

许战海战略文库|三步成就技术品牌:奥迪如何打造Quattro技术品牌?

引言:在当前全球化和信息化快速发展的背景下,技术品牌的打造不仅是企业竞争力提升的重要途径,也是企业实现长远发展的基石。技术品牌的建设并非一蹴而就的过程,而是需要企业准确把握市场趋势发掘自身核心竞争力,并通过长期的积累和推广逐渐在市场中树立起良好的技术…

视频监控管理平台EasyCVR告警查询拖动条无法显示,该如何解决?

视频汇聚/视频云存储/集中存储/视频监控管理平台EasyCVR能在复杂的网络环境中,将分散的各类视频资源进行统一汇聚、整合、集中管理,实现视频资源的鉴权管理、按需调阅、全网分发、云存储、智能分析等,视频智能分析平台EasyCVR融合性强、开放度…

JSON.toJSONString/JSONObject.toJSONString将实体类对象转换成JSON字符串时,多出了params字符串[记录贴]

我这里是给与了实体类一些固定的默认值,转换莫名其妙多出了params参数,回头深挖一下 **光看代码了 被偷了后方,忘记继承了还 ** 将实体类转换成JSON格式,三种写法都是一样的,内核都是阿里巴巴的 System.out.println(…

[Docker]七.配置 Docker 网络

一.Docker0 网络 1.多个容器之间如何通信,是否可以直接连接 默认启动的所有容器都会加入到docker0这个网络中,所有各个容器件是可以直接通信的 先看看网卡信息: 启动几个容器来演示一下: #启动mycentos这个容器 [rootlocalhost zph]# docker run -it -d --name mycentos d757…