Flink操作流程
theme: condensed-night-purple
Flink操作流程
携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第30天,点击查看活动详情
public class StreamingJob {
public static void main(String[] args) throws Exception {
// 创建执行环境
final StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
/******** 配置流过程 *********/
addSource(); // 流创建
// 流转化
/******** 配置流过程 *********/
// 执行
env.execute("Flink Streaming Java API Skeleton");
}
}Copy to clipboardErrorCopied
DataStreamSource 对象是 DataStream 类的子类,代表着数据流的起始点。必须通过 addSource 方法生成, fromCollection/readTextFile 方法底层也会调用 addSource 方法。
DataStream 对象代表着相同类型元素的流,可以通过转换(transformation)来实现转换为另一个 DataStream 对象。DataStrem 对象内部持有当前的 StreamExecutionEnvironment 对象和 DataTransformation 对象。
StreamExecutionEnvironment 对象代表着当前流计算执行环境以及相关配置。每个 DataStream 类在做转换的时候,会首先创建转换对应的 DataTransformation 对象,最终形成一个 DataTransformation 链表被 StreamExecutionEnvironment 对象维护。
Flink 在执行时,会把流拓扑(Source、Transformation、Sink)都转换为 DataFlow:由 Stream 和 Operator 组成,让 Stream在 Operator 中流动。
一致性
当在分布式系统中引入状态时,自然也引入了一致性问题。
在流处理中,一致性分为 3 个级别。
- at-most-once:故障发生之后,计数结果可能丢失。
- at-least-once:这表示计数结果可能大于正确值,但绝不会小于正确值。也就是说,计数程序在发生故障后可能多算,但是绝不会少算。
- exactly-once:这指的是系统保证在发生故障后得到的计数结果与正确值一致。
第一代流处理器(如 Storm 和 Samza)刚问世时只保证 at-least-once。最先保证 exactly-once 的系统(Storm Trident 和 Spark Streaming)在性能和表现力这两个方面付出了很大的代价。
提交流程
(1) 一般情况下,由客户端(App)通过分发器提供的 REST 接口,将作业提交给JobManager。
(2)由分发器启动 JobMaster,并将作业(包含 JobGraph)提交给 JobMaster。
(3)JobMaster 将 JobGraph 解析为可执行的 ExecutionGraph,得到所需的资源数量,然后向资源管理器请求资源(slots)。
(4)资源管理器判断当前是否由足够的可用资源;如果没有,启动新的 TaskManager。
(5)TaskManager 启动之后,向 ResourceManager 注册自己的可用任务槽(slots)。
(6)资源管理器通知 TaskManager 为新的作业提供slots。
(7)TaskManager 连接到对应的 JobMaster,提供slots。
(8)JobMaster 将需要执行的任务分发给 TaskManager。
(9)TaskManager 执行任务,互相之间可以交换数据。
- 点赞
- 收藏
- 关注作者
评论(0)