在这个数据爆炸的时代,如何快速、高效地处理海量数据一直是大数据从业者面临的难题。Flink,作为一个实时流处理引擎框架,性能卓越、灵活性强、技术趋势良好,正在逐渐成为实时计算领域新宠。本篇文章将为您深入剖析 Flink 处理海量数据的性能与优势,并从实际案例中探索如何通过 Flink 实时处理百万级数据。让我们一起来了解吧!
Flink 的核心思想是流计算。流计算是将数据分为连续不断的数据流,然后在数据流上执行计算的过程。由于数据的连续性和无限性,Flink 可以处理无限的数据造成的延迟,在处理大数据流的时候具有以下特点:
流计算是指用用来处理无限流数据的处理方式,对于搜索推荐、广告投放、物联网、资金风险管理等很多业务场景中需要执行的实时计算,都是非常典型的流计算模式的应用场景。Flink 流处理引擎可以支持如下数据计算应用场景:
Flink 能够实时处理百万级数据的数据预处理,实际上是依靠其很强的数据处理能力以及灵活的流式计算架构。下面从数据清洗和合并、数据心跳和校验、数据抽样和压缩三个方面来讲解
Flink 提供了内置的算子来对数据进行清洗和合并。使用Filter
和Map
算子可以清除不符合条件的数据并且将符合条件的数据进行合并,这样可以将数据进行归一化。除此之外,Flink 还提供了其他一些算子,如FlatMap
、Reduce
、Aggregate
等等,可以帮助用户完成特定数据的加工处理。
通过下面的代码实现在接收数据流时,清除“NULL”数据和重复数据,并合并来自不同数据通道而来的多个数据属性
//将原始数据输入流转换作 count
val countStream = inputStream
.map{x => x.split}
.filter{x => x != "null" && checkDuplicate(x)} // 过滤掉 NULL 数据和重复数据信息
.map{x => (x(1), if (x(2) <= 2) "small" elseif (x(2) <= 4) "middle" else "big", x(3).toDouble)}.keyBy(0,1)
.sum(2) // 按照key聚合求和,完成数据合并操作
Flink 提供了心跳机制和 Check sum 机制来实现数据流出现错误或不一致时的检测。使用HeartbeatCoMapper
和Connect
算子来检查和确保数据处于活动状态,如果处于非活动状态会通知返回值不匹配的数据和数据源。Map
和Reduce
函数都支持数据校验处理,针对位错误率,可以根据特定的已知或未知数据算法,利用差错码进行 CRC 校验和多路访问即可实现数据完整性的保护,如反向采样、周期访问和渐进计算、数据复制等等。
如果处理的是海量数据,项目的保存和储存一方面是低效,压缩方案能让存储成本降低,占用更小空间。而数据抽样能一定程度上提升效率,如果例大数据场景下使用,基于稳定标准和错误率抽样算法与桌面的抽象取样类似。总之情形是需要考虑并行的计算资源的匹配合理,一定可以在这方面获得省时、俭责的效果。
Flink 能够实时处理百万级数据的动态划分和优化,主要是依靠其流式计算特性,以及灵活可扩展的分布式执行和调度框架。下面从数据分布和资源划分、数据切片和归并、动态负载均衡和调度三个方面来讲解。
数据分布和资源划分是 Flink 实时处理数据的基础。Flink 会根据任务的并行度、数据大小和位置等因素将数据划分,同时将资源与任务进行匹配,确保资源利用率最高,设置优化操作或策略,提高节点间数据交换和通信。数据分布和资源划分通常和数据拆分和并行加载等优化方法一起使用,优化任务的执行和加速任务运行。
数据切片和数据归并主要是为了将彼此关联的数据打包在一起,减少网络传输延迟。这些操作通常在数据处理的初始和结束步骤进行,即将同一采集源的数据聚合并合并到单个数据块中,通过加快数据处理流程和缩短任务执行的等待时间从而优化任务的运行速度。
动态负载均衡和动态调度主要是为了平衡工作负载和保证任务执行的稳定性。Flink 会根据计算资源面临的压力和处理要求等因素,进行动态划分、任务转移、集中的汇聚等一系列负载均衡调整操作,以达到最终的任务处理效率目标。由于数据和操作不断变换,需要实时算法和弹性调用来适应快速高负荷处理,动态负载均衡和动态调度也成了处理海量数据时候的“法宝”。
Flink 实时处理百万级数据的实时计算能力主要基于其强大的数据操作和数据计算、数据重组和数据分发、Flink 上流式窗口的建立和使用三个方面。
Flink 提供了一系列数据操作和计算 API,支持基于事件流的处理方式,包括如下几个组件:
在 Flink 中,事件数据源自上游 Source,流向下游 Sink,在同一个流中,Flink 需要实现数据重组(即按照 key 对数据进行拆分)和数据分发。数据重组和数据分发在 F-link 中都通过 Keyed Streams 方式实现。其中数据重组是按照 Key 对数据进行重新分区操作,分发到下游算子进行处理,可通过 keyBy 或 groupBy 进行实现,随后的算子根据相同的 Key 进行数据操作。而数据分发只是数据随机地分布到下游运算节点(data parallel),但不按 Key 进行数据聚合。
流式窗口是一种数据流的分段处理方式,在 Flink 中,可以通过两种方式来建立和使用流式窗口:基于时间和基于数量。
基于时间的窗口处理基于事件时间(Time of Events),即事件在实际发生的时间,比如 5 秒、10 秒等。当数据到达时,会将其分配到与其到达时间相对应的窗口中,并作为一个“时间窗口”处理,这可以利用水印机制来实现。
基于数量的窗口处理根据数据传输量将数据分割成窗口,在窗口时间内对数据进行聚合计算,常见的有滑动窗口、滚动窗口等。
可以通过 Flink 提供的 window 算子进行窗口聚合计算,例如 timeWindow、countWindow 等,因此,Flink 支持窗口聚合器,并提供了开箱即用的 API 来简便地操作它们。 窗口运算后,最简单的情况是直接输出给地图的集合中,还可以指定多个窗口输出。 当发现某个 Eventhappens 没处理在有时间时输出一个提示 2s 或 24 小时后认为数据到底不存在。
实现方式:
实现实时行业监测和策略预警涉及到以下几个关键点:
实现方式:
实现实时电商和物流行业数据分析涉及到以下几个关键点:
实现方式:
实现实时游戏和社交应用数据优化涉及到以下几个关键点:
领取专属 10元无门槛券
私享最新 技术干货