Flink的核心思想是流计算。流计算是将数据分为连续不断的数据流,然后在数据流上执行计算的过程。由于数据的连续性和无限性,Flink可以处理无限的数据造成的延迟,在处理大数据流的时候具有以下特点:
Flink能够实时处理百万级数据的数据预处理,实际上是依靠其很强的数据处理能力以及灵活的流式计算架构。下面从数据清洗和合并、数据心跳和校验、数据抽样和压缩三个方面来讲解
Flink提供了内置的算子来对数据进行清洗和合并。使用Filter和Map算子可以清除不符合条件的数据并且将符合条件的数据进行合并,这样可以将数据进行归一化。除此之外,Flink还提供了其他一些算子,如FlatMap、Reduce、Aggregate等等,可以帮助用户完成特定数据的加工处理。
通过下面的代码实现在接收数据流时,清除“NULL”数据和重复数据,并合并来自不同数据通道而来的多个数据属性
//将原始数据输入流转换作countvalcountStream=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提供了心跳机制和Checksum机制来实现数据流出现错误或不一致时的检测。使用HeartbeatCoMapper和Connect算子来检查和确保数据处于活动状态,如果处于非活动状态会通知返回值不匹配的数据和数据源。Map和Reduce函数都支持数据校验处理,针对位错误率,可以根据特定的已知或未知数据算法,利用差错码进行CRC校验和多路访问即可实现数据完整性的保护,如反向采样、周期访问和渐进计算、数据复制等等。
如果处理的是海量数据,项目的保存和储存一方面是低效,压缩方案能让存储成本降低,占用更小空间。而数据抽样能一定程度上提升效率,如果例大数据场景下使用,基于稳定标准和错误率抽样算法与桌面的抽象取样类似。总之情形是需要考虑并行的计算资源的匹配合理,一定可以在这方面获得省时、俭责的效果。
Flink能够实时处理百万级数据的动态划分和优化,主要是依靠其流式计算特性,以及灵活可扩展的分布式执行和调度框架。下面从数据分布和资源划分、数据切片和归并、动态负载均衡和调度三个方面来讲解。
数据分布和资源划分是Flink实时处理数据的基础。Flink会根据任务的并行度、数据大小和位置等因素将数据划分,同时将资源与任务进行匹配,确保资源利用率最高,设置优化操作或策略,提高节点间数据交换和通信。数据分布和资源划分通常和数据拆分和并行加载等优化方法一起使用,优化任务的执行和加速任务运行。
动态负载均衡和动态调度主要是为了平衡工作负载和保证任务执行的稳定性。Flink会根据计算资源面临的压力和处理要求等因素,进行动态划分、任务转移、集中的汇聚等一系列负载均衡调整操作,以达到最终的任务处理效率目标。由于数据和操作不断变换,需要实时算法和弹性调用来适应快速高负荷处理,动态负载均衡和动态调度也成了处理海量数据时候的“法宝”。
Flink实时处理百万级数据的实时计算能力主要基于其强大的数据操作和数据计算、数据重组和数据分发、Flink上流式窗口的建立和使用三个方面。
Flink提供了一系列数据操作和计算API,支持基于事件流的处理方式,包括如下几个组件:
在Flink中,事件数据源自上游Source,流向下游Sink,在同一个流中,Flink需要实现数据重组(即按照key对数据进行拆分)和数据分发。数据重组和数据分发在F-link中都通过KeyedStreams方式实现。其中数据重组是按照Key对数据进行重新分区操作,分发到下游算子进行处理,可通过keyBy或groupBy进行实现,随后的算子根据相同的Key进行数据操作。而数据分发只是数据随机地分布到下游运算节点(dataparallel),但不按Key进行数据聚合。