Apache Flink 介绍
前言
Flink 是流
公式计算框架,为什么触动Flink?由于我目前负责监控平台的报警部分,所以我会将采集到的监控数据直接插入到kafka中,报警端会从kafka的topic中进行监控,需要阅读。实时数据并保存读取的监测数据。进行多次聚合/转换/计算等操作,将计算结果与报警规则阈值进行比较,采取相应的报警措施(钉钉群、邮件、短信、电话等)马苏。我画了一张简单的图,如下图所示。
当前报警区域架构为:当我刚加入公司时,我们的架构是所有监控数据都直接存储在ElasticSearch 中。之后报警就是寻找监控指标所需要的数据。幸运的是,ElasticSearch的搜索能力足够强大。但你发现问题了吗?这意味着所有监控数据都被收集起来,收集到的数据经过一些计算/转换/聚合,经过Kafka消息队列,存储在ElasticSearch中,并移动到ElasticSearch进行搜索。收集监测数据并制定报警策略。整个过程看起来对于监控来说是常识,但是在报警的情况下,如果一路上的链路出现问题,比如Kafka消息队列有延迟,或者写入ElasticSearch中存储的监控数据时会花费更长的时间和写入时间。询问的态度。由于不对称性,报警从ElasticSearch检索数据存在延迟。可能是30秒,也可能是1分钟,甚至更长,这样的话,报警信息肯定就不再具有报警的意义了。
为什么这么说?为什么需要监控报警平台呢?尽早发现问题,及时预警,帮助开发人员和运维人员及时处理和解决线上问题,避免给贵公司带来重大损失。别给我。
而且,现在越来越多的公司提供此类预警。这个怎么做?我们利用大数据和机器学习技术来分析周期性的历史数据,并利用这些数据来分析周期性(1天/7天/1个月/1季度/年)特定的监测指标来整理趋势图。我相信你一定能画出来。然后您可以按照这个趋势图,将您的监控指标当前的数据使用情况与趋势图进行比较,在即将达到报警规则阈值时提前发出预警。通过提前感知预警、提前发现问题,运维人员可以及早发现问题,避免损失,将损失降到最低。当然,这就是我正在尝试做的事情,我相信你可以从中学到很多东西。
结果我现在用的是Flink,一个常用的类似于Spark的流计算框架。
下面的感言也可以参考上述所有信息。谢谢。在介绍Flink之前,我们先来了解一下数据集的类型和数据操作模型的类型。
数据集的类型是什么:
1. 无限数据集:无限连续集成数据集
2. 受限数据集:不发生变化的受限数据集。
那么什么是通用无限数据集呢?
1. 用户与客户端的实时交互数据
2.应用程序实时生成的日志
3、金融市场实时交易记录
……
数据操作模型为:
1. 流式传输:只要产生数据,计算就会继续。
2. 批处理:运行预定时间的计算并在完成后释放计算机资源。
Flink 可以以流式或批量的方式处理有界或无界的数据集。
Flink 是什么 ?
Flink 整体结构
从下到上:
1、部署:Flink支持本地运行,可以运行在独立集群或者YARN或Mesos管理的集群上,也可以部署在云端。
2.执行:Flink的核心是分布式流数据引擎。也就是说,一次处理一个事件的数据。
3. API:数据流、数据集、表、SQL API。
4. 扩展库:Flink 还包括用于复杂事件处理、机器学习、图形处理和Apache Storm 兼容性的专用代码库。
Flink 数据流编程模型
Flink 为开发流式和批处理应用程序提供了不同级别的抽象。
· 底层提供有状态流。它通过Process Function 嵌入到DataStream API 中。这使用户可以自由地处理来自一个或多个流数据的事件并使用一致的、容错的状态。此外,用户可以注册事件时间并处理事件回调,从而允许他们以编程方式实现复杂的计算。
· DataStream/DataSet API 是Flink 提供的核心API,其中DataSet 处理有界数据集,DataStream 处理有界或无界数据流。用户可以通过各种方法(map/flatmap/window/keyby/sum/max/min/average/combining等)对数据进行变换/计算。
· Table API 是一种以表为中心的声明性DSL,表可以动态更改(当表示流数据时)。 Table API 提供了select、project、join、group by 和aggregation 等操作,但更易于使用(代码更少)。
您可以在表和数据流/数据集之间无缝切换,甚至可以通过编程方式将表API 与数据流和数据集混合使用。
· Flink 提供的最高抽象级别是SQL。这种抽象级别在语法和表达力上与Table API类似,但程序以SQL查询表达式的形式表达。 SQL 抽象与Table API 紧密配合,允许您直接针对Table API 中定义的表运行SQL 查询。
Flink 程序与数据流结构
Flink 应用程序的结构如上图所示。
1. Source: 数据源Flink 流处理和批处理的源有四种类型:基于本地集合的源、基于文件的源、基于网络套接字的源和自定义源。常见的自定义源包括Apache kafka、Amazon Kinesis Streams、RabbitMQ、Twitter Streaming API、Apache NiFi 等。当然,您也可以定义自己的来源。
2. 转换:Map/FlatMap/Filter/KeyBy/Reduce/Fold/Aggregations/Window/WindowAll/Union/Window join/Split/Select/Project等数据转换的各种操作。有许多操作可以让您将数据转换为您需要的数据并执行计算。
3. Sink:Flink 将变换和计算后的数据发送到的接收器。 Flink 中的常见接收器可能包括写入文件、打印、写入套接字和自定义接收器。常见的自定义接收器包括Apache kafka、RabbitMQ、MySQL、ElasticSearch、Apache Cassandra、Hadoop FileSystem 等。同样,您也可以定义自己的接收器。
为什么选择 Flink?
Flink是一个开源的分布式流处理框架。
即使存在无序或延迟加载的数据,也能提供准确的结果。
它是基于状态和容错的,允许无缝修复错误,同时保持应用程序的完整状态。
规模化经营。即使在数千个节点上运行,也能实现出色的吞吐量和低延迟。
之前,我们讨论了匹配数据集类型(有限与无限)和操作模型(批与流)。 Flink 的流计算模型支持许多对于通过无限数据集获得准确结果非常重要的功能,包括状态管理、无序数据处理和灵活的窗口。
· Flink保证状态计算的强一致性。 “有状态”意味着应用程序可以维护一段时间内生成的数据集合,Filnk 的检查点机制即使在出现故障时也能提供强一致性。
·
Flink 支持流计算和带有on-event 语义的窗口。即使在事件无序或延迟到达的数据流中,事件时间机制也允许您计算准确的结果。
除了提供数据驱动的窗口外,Flink 还支持基于时间、计数、会话等的灵活窗口。 Windows可以通过灵活的触发条件进行定制,以支持复杂的流模式。 Flink 窗口允许您模拟创建数据的真实环境。
Flink的容错能力是轻量级的,可以让系统在保持高并发的同时,保证相同时间内的强一致性。 Flink 以零数据丢失的方式从故障中恢复,但没有考虑可靠性和延迟之间的权衡。
Flink 保存点提供了有状态的版本机制,允许您更新应用程序并回滚历史数据,而不会丢失状态并最大限度地减少停机时间。
· Flink 设计用于在具有数千个节点的大型集群上运行。 Flink除了支持独立的集群部署之外,还支持YARN和Mesos部署。
· Flink 的程序本质上是并行和分布式的,算子分为算子子任务。操作员子任务的数量根据特定的操作员而变化。如下图所示,程序的每个运算符阶段的并行数可能会有所不同。 Source算子的并行度为2,但最终Sink算子的并行度为1。
独特的内存管理
Flink 在JVM 中提供自己的内存管理,使其独立于Java 默认的垃圾收集器。 使用散列、索引、缓存和排序有效地执行内存管理。
丰富的图书馆
Flink 拥有丰富的机器学习、图形处理、关系数据处理等库。 其架构允许轻松执行复杂的事件处理和警报。
分布式运行
flink作业提交架构流程如下图所示。
1,程序代码:我们创建的Flink应用程序代码。
2.作业客户端:作业客户端不是Flink程序执行的内部部分,而是任务执行的起点。作业客户端负责接受用户的程序代码,创建数据流,并将数据流发送给作业管理器进一步执行。 执行完成后,作业客户端将结果返回给用户。
3,作业管理器:主进程(也称为作业管理器)协调和管理程序的执行。 其主要职责包括任务调度、检查点管理、灾难恢复等。一个机器集群必须至少有一个master。 Master负责调度任务、协调检查点和灾难恢复。对于高可用性设置,您可以使用多个主服务器,但要确保其中一个是领导者,其他主服务器是备用服务器。作业管理器包含三个重要组件:actor系统、调度器和指向器
4. 任务管理器:接收作业管理器发送来的需要部署的任务。任务管理器是一种工作节点,它在JVM 内的一个或多个线程上执行任务。 任务执行的并行性由每个任务管理器中可用的任务槽决定。 每个任务代表分配给任务槽的一组资源。 例如,如果任务管理器有4 个插槽,则25% 的内存分配给每个插槽。 一个任务槽可以运行一个或多个线程。 同一套接字内的线程共享同一JVM。 同一JVM 中的任务共享TCP 连接和心跳消息。任务管理器中的槽代表具有固定内存的可用线程。请注意,插槽仅隔离内存,而不隔离CPU。默认情况下,Flink 允许子任务共享slot,即使它们是不同任务的子任务,只要它们来自同一个作业即可。这种共享提高了资源利用率。
技术合作加关注后请私信:“技术大牛”
版权声明:本文由今日头条转载,如有侵犯您的版权,请联系本站编辑删除。