Flink原理、实战与性能优化(编辑中)

本文详细介绍了Flink的基本架构,包括client、JobManager和TaskManager的角色。讲解了Flink的编程模型、数据类型、DataStream API转换操作,以及时间概念和Watermark的重要性。此外,还阐述了Flink的状态管理和容错机制,如Checkpoints和Savepoints,并提到了状态后端的选择。最后,简要提及了Flink的环境部署和代码示例。
摘要由CSDN通过智能技术生成

参考《Flink原理、实战与性能优化》

基本架构

在这里插入图片描述

client

将作业提交到jobmanager
用户没提交一个flink程序就会创建一个client,client会将flink程序翻译成一个JobGraph

JobManager

整个集群的master节点,负责整个flink集群的任务调度和资源管理,整个集群有且仅有一个活跃的JobManager。
从客户端获取提交的应用,根据TaskManager上TaskSlot使用情况,为提交的作业分配TaskSlot资源,并命令TaskManager启动应用。
所有checkpoints协调过程都在JobManager完成,每个taskmanager收到触发命令后,完成checkpoints操作。

TaskManager

负责具体任务执行(计算)和对应任务在每个节点资源的申请和管理

flink编程模型

source - transformation -sink

Flink数据类型

1.任意Java原生基本数据类型(装箱)
2.任意Java原生基本数据类型(装箱)数组
3.java Tuples
4.Scala Case Class
5.POJO

DataStream API

DataStream 转换操作

  • Mpa [DataStream - > DataStream]
    应用于对数据格式的变化
  • FlatMpa [DataStream - > DataStream]
    应用于一个元素产生一个或多个元素
  • Filter[DataStream - > DataStream]
    过滤
  • KeyBy [DataStream - > KeyedStream]
    按key分区
    keyby(0)//按第一个字段为分区key
  • Reduce [ KeyedStream- > DataStream]
    将KeyedStream按照自定义的reducefunction聚合
  • Aggregations [ KeyedStream- > DataStream]
    对reduce的封装,有sum、min、minby、max、maxby等
  • Union [DataStream - > DataStream]
    两个或多个stream合并成一个
  • Split [DataStream - > SplitStream]
    将一个datastream按条件拆分
  • Select [SplitStream- > DataStream ]
    对Select的结果数据集筛选
  • Iterate [DataStream - > IterativeStream - > DataStream]
    将datastream中满足条件的进行下一次迭代,不满足则发到下游datastream中
  • 物理分区操作 [SplitStream- > DataStream ]
    用于防止数据倾斜
    随机分区(Random Partitioning)、R Partioning、Rescaling Partioning 、广播操作(Broadcasting)、自定义分区(Custom Partitioning)

时间概念与Watermark

flink中时间分为三个概念
事件生成时间(Event Time):在设备上发生事件的时间
事件接入时间(Ingestion Time):接入flink系统的时间
事件处理时间(Processing Time):执行算子的时间

EventTime 和 Watermark
原因:防止由于网络或系统等因素,造成事件数据不能及时到flink系统。
简述:设置Watermark(最大延迟间隔),如果数据没有全部到达,则一直等待。

EventTime和Watermark
Flink的时间与watermarks详解
在这里插入图片描述
在这里插入图片描述

Flink状态管理和容错

有状态的计算
flink程序运行中存储中间计算结果给后面的算子、function使用。存储可以是flink堆内对外内存或第三方存储介质。同理无状态计算不保存中间结果
在这里插入图片描述
适用场景
用户想获取某一特定事件规则的时间、按照时间窗口求最大值、机器学习、使用历史数据计算等

Flink状态类型
根据数据集中是否按key分区分为KeyedState、OperatorState(NonkeyedState),这两种状态均具有两种形式,托管状态(ManagedState)形式 和 原生状态(RawState)形式

ManagedState 托管状态 由Flink Runtime控制管理,将状态转换为内存Hash tables或RocksDB 通过内部接口持久化到checkpoints
RawState 原生状态 算子自己管理数据结构 将数据转化成bytes存储在checkpoints中

Checkpoints和Savepoints
异步轻量级分布式快照技术Checkpoints容错机制:

  • 分布式快照可以将同一时间点Task/Operator状态数据全局统一快照处理。
  • flink在输入的数据集上间隔性生成checkpointbarrier,出现异常时,就能从上一个快照恢复算子之前的状态,保持数据一致性。
  • checkpoints一些配置:exactlyance(保证数据质量)和atleastonce(保证吞吐)语义选择、checkpoint超时时间、检查点间最小间隔(避免数据堆积)、并行检查点、外部检查点(持久化到外部系统)、checkpoint失败任务是否关闭

以手工命令的方式触发Checkpoint,并将结果持久化到指定的存储路径中的Savepoint机制:

  • 目的是帮助用户在升级和维护集群过程中保存系统中的状态数据,避免因为停机运维或者升级应用等正常终止应用的操作而导致系统无法恢复到原有的计算状态的情况

Flink中提供了StateBackend来存储和管理Checkpoints过程中的状态数据:包括基于内存的MemoryStateBackend、基于文件系统的FsStateBackend,以及基于RockDB作为存储介质的RocksDBStateBackend

checkpoint优化

  1. 减小时间间隔
  2. 状态容量预估
  3. 异步snapshot
  4. 状态数据压缩
  5. CheckpointDelayTime

环境部署

官网下jar包:https://flink.apache.org/zh/downloads.html
注意,根据Hadoop、scala版本选择flink,避免包冲突
本地启动flink:

./flink-1.7.1/bin/start-cluster.sh

本地停止flink:

./flink-1.7.1/bin/stop-cluster.sh

检验启动成功(默认端口8081):
http://localhost:8081/
在这里插入图片描述

代码

wordcount code

maven 依赖

    <dependencies>
        <dependency>
            <groupId>org.apache.flink</groupId>
            <artifactId>flink-core</artifactId>
            <version>${flink.version}</version>
        </dependency>
        <dependency>
            <groupId>org.apache.flink</groupId>
            <artifactId>flink-java</artifactId>
            <version>${flink.version}</version>
        </dependency>
        <dependency>
            <!-- This dependency is required to actually execute jobs. It is currently pulled in by
                flink-streaming-java, but we explicitly depend on it to safeguard against future changes. -->
            <groupId>org.apache.flink</groupId>
            <artifactId>flink-clients_${scala.binary.version}</artifactId>
            <version>${flink.version}</version>
        </dependency>
        <dependency>
            <groupId>org.apache.flink</groupId>
            <artifactId>flink-streaming-java_${scala.binary.version}</artifactId>
            <version>${flink.version}</version>
        </dependency>
        <dependency>
            <groupId>org.apache.flink</groupId>
            <artifactId>flink-table_2.11</artif
  • 8
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
Flink是一个开源的分布式流处理框架,它的运行原理是将数据流分成不同的子任务,这些子任务会在不同的计算节点上并行执行。Flink将数据流看作是一个无限的事件流,每当有新的事件到来时,Flink会将这些事件收集起来,交给对应的算子进行处理,并将结果传递给下一个算子。Flink的运行原理主要包括以下几个方面: 1. 数据流划分:Flink会将数据流划分为多个子任务,并将这些子任务分配到不同的计算节点上。 2. 算子执行:每个子任务会在对应的计算节点上并行执行,数据会经过一系列的算子进行处理,每个算子都会将处理后的数据再次输出到下一个算子。 3. 状态管理:Flink支持对算子状态的管理,可以将算子的状态存储在内存或外部存储,以便在出现故障时进行恢复。 4. 检查点:Flink会定期生成检查点,用于保存算子的状态以及数据流的位置信息,以便在出现故障时进行恢复。 5. 任务协调:Flink会对所有子任务进行统一的协调和调度,确保数据流的正确处理。 在实际应用,为了保证Flink的性能,需要进行性能优化。常见的性能优化包括: 1. 调整并行度:适当调整算子的并行度可以提高Flink的性能。 2. 减少数据倾斜:数据倾斜会导致某些节点的负载过高,可以通过数据重分区等方式来减少数据倾斜。 3. 使用状态后端:选择合适的状态后端可以提高Flink的性能,常用的状态后端包括内存和RocksDB。 4. 减少网络开销:减少网络开销可以提高Flink的性能,可以通过调整数据分区、使用压缩算法等方式来减少网络开销。 5. 避免不必要的计算:避免不必要的计算可以提高Flink的性能,可以通过过滤掉不需要处理的数据等方式来避免不必要的计算。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值