Flink之Task解析

这篇具有很好参考价值的文章主要介绍了Flink之Task解析。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Flink之Task解析

  对Flink的Task进行解析前,我们首先要清楚几个角色TaskManagerSlotTaskSubtaskTaskChain分别是什么

角色 注释
TaskManager 在Flink中TaskManager就是一个管理task的进程,每个节点只有一个TaskManager
Slot Slot就是TaskManager中的槽位,一个TaskManager中可以存在多个槽位,取决于服务器资源和用户配置,可以在槽位中运行Task实例
Task 其实Task在Flink中就是一个类,其中可以包含一个或多个算子,这个取决于算子链的构成
SubTask SubTask就是Task类的并行实例可以是一个或多个,也就是说当代码执行的那一刻开始,就根据用户所设置或者默认的并行度创建出多个SubTask
TaskChain TaskChain就是算子链,何为算子链?就是在一个Task实例中出现的串行算子,算子间必须是OneToOne模式且并行度相同.

  上面对几个角色进行了一个简单的阐述,后面会结合图解和伪代码进行讲解,这里我们以计算中比较经典wordcount为例子,伪代码如下所示:

public class FLinkWordCount {
    public static void main(String[] args) throws Exception {
        // 创建流处理环境
        StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();\
        // 设置并行度3
        env.setParallelism(3)
        // 读取数据文件
        DataStreamSource<String> streamSource = env.readTextFile("xxx");
        // 转大写
        DataStreamSource<String> upperCaseSource = streamSource.map(word -> word.toUpperCase())
        // 转成tuple2格式,计数1
        SingleOutputStreamOperator<Tuple2<String, Integer>> mapStream = upperCaseSource.map(word -> Tuple2.of(word, 1));
        // 按照单词分组
        KeyedStream<Tuple2<String, Integer>, String> keyed = mapStream.keyBy(tup -> tup.f0);
        // 求和
        keyed.sum("f1")
        env.execute();
    }
}

  上面的代码中我们使用了两次map,一次keyBy,一次sum算子,我们下面就结合这几个算子进行讲解,讲解之前有两个条件需要先记住:

  • 同一个Task并行实例不能放在同一个TaskSlot上运行,一个TaskSlot上可以运行多个不同的Task并行实例
  • 同一个共享组的算子允许共享槽位,不同共享组的算子决不允许共享槽位

  上面这两句话一定要记牢,以便于后面的理解.

算子链划分及Task槽位分配

算子链划分

可以根据上面的代码理解下图:
Flink之Task解析,FLink,flink,大数据

上图中我们可以看到两个map组成一个task chain,keyBysum组成一个task chain,这里说一下原因,首先就是两个map的并行度是一致的,而且是OneToOne模式,所以可以将两个map绑定成一个算子链,并将其放入到一个SubTask中,而到了keyBy这里为什么不能再放入到一个task chain中,这里我们可以思考一下,keyBy时会发生什么?以spark的角度来说会发生shuffle对吧,这就导致了不能满足OneToOne的模式,简单来说我们也可以想清楚,如果keyBymap组成一个task chain那么还怎么做wordcount?

Flink之Task解析,FLink,flink,大数据

通过上图应该很容易理解了.

Task槽位分配

  上面讲了关于task chain怎么划分的,为什么这样划分,这里讲一下为什么同一个Task的并行实例(SubTask)不能在同一个task slot中.其实这个也很容易就想清楚,如果同一Task的多个SubTask都出现在一个task slot中那么还有什么意义呢?当这些SubTask出现在一个task slot中时就会发生串行计算,那并行的意义也就没有了.

  同时这种机制也保证了任务的容错性,也就是说对于同一个Task一旦某一个task slot出现异常的情况,其他的task slot中的SubTask还能正常运行,如果将这些SubTask放到一个task slot中,当这个task slot出现异常情况时,就会影响整个任务的执行.

  总结来说,这种设计保证了Flink任务的隔离性、容错性、资源利用性.这里用图解的方式便于大家记忆,如下:

Flink之Task解析,FLink,flink,大数据

槽位共享及算子链断/连

槽位共享

  前面讲过同一个Task的多个SubTask不能出现在一个task slot中,但是不同TaskSubTask是可以共享同一个task slot的,但是在Flink中有一个机制,就是用户(开发人员)可以自定义不同的算子间是否可以共享同一个task slot,如上面的例子中两个map的并行度一致并且符合OneToOne的模式,在正常情况下必然会会分到一个task chain中,但是Flink给用户提供了的slot group的概念,也就是说用户可以将这两个map分配到不同的slot group中,这种情况下两个map就不会划分到一个task chain中,试想一下当两个map都不允许共享同一个task slot时,怎么可能划分到同一个task chain中呢?

  伪代码如下:

public class FLinkWordCount {
    public static void main(String[] args) throws Exception {
        // 创建流处理环境
        StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();\
        // 设置并行度3
        env.setParallelism(1)
        // 读取数据文件
        DataStreamSource<String> streamSource = env.readTextFile("xxx");
        // 转大写
        DataStreamSource<String> upperCaseSource = streamSource.map(word -> word.toUpperCase())
        // 通过slotSharingGroup()将upperCaseSource作为一个分组"g1"
        SingleOutputStreamOperator<String> slotGroup1 = upperCaseSource.slotSharingGroup("g1");
          
        // 转成tuple2格式,计数1
        SingleOutputStreamOperator<Tuple2<String, Integer>> mapStream = upperCaseSource.map(word -> Tuple2.of(word, 1));
        // 通过slotSharingGroup()将mapStream作为一个分组"g3"
        SingleOutputStreamOperator<Tuple2<String, Integer>> slotGroup2 = mapStream.slotSharingGroup("g2");
        // 按照单词分组
        KeyedStream<Tuple2<String, Integer>, String> keyed = mapStream.keyBy(tup -> tup.f0);
        // 求和
        keyed.sum("f1")
        env.execute();
    }
}

上面的代码中我们将upperCaseSourcemapStream分成了两个task slot,这样两个map就不可以共享相同的task slot,同时代码中将并行度改为了1,这样便于图解,如下图:

Flink之Task解析,FLink,flink,大数据
如果说集群中总task slot只有3个,并且在代码中两个map设置了不同的task slot且两个map的并行度都为3时会怎么样?很简单,提交任务时就会报错,因为提交任务所需要的资源已经超出了集群的资源.

  这里说一下对于对task slot进行分组处理的实际用处,就以代码中两个map为例子,在实际的业务中如果两个map处理的数据量都极大,如果将两个map的计算都放到一个节点的一个task slot时会发生什么?数据的积压、任务异常失败等等都有可能发生,但是有slotSharingGroup我们就可以保证同一个task slot不会承载过大的计算任务,也就达到了资源合理分配的目的.

算子链断/连

  前面讲了关于将两个map进行slotSharingGroup后会将两个map划分到不同的task chain,如果有这样一个情况两个map满足OneToOne的模式且并行度相同时,我们不使用slotSharingGroup能否将两个map划分成不同的task chain?答案是当然可以的,Flink为我们提供了对应的API,伪代码如下:

public class FLinkWordCount {
    public static void main(String[] args) throws Exception {
        // 创建流处理环境
        StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();\
        // 设置并行度3
        env.setParallelism(3)
        // 读取数据文件
        DataStreamSource<String> streamSource = env.readTextFile("xxx");
        // 转大写
        DataStreamSource<String> upperCaseSource = streamSource.map(word -> word.toUpperCase())
  
        // 转成tuple2格式,计数1
        SingleOutputStreamOperator<Tuple2<String, Integer>> mapStream = upperCaseSource.map(word -> Tuple2.of(word, 1));
        // 将mapStream划分到一个新的task chain中
        SingleOutputStreamOperator<Tuple2<String, Integer>> newTaskChainMapStream = mapStream.startNewChain();
        // 按照单词分组
        KeyedStream<Tuple2<String, Integer>, String> keyed = mapStream.keyBy(tup -> tup.f0);
        // 求和
        keyed.sum("f1")
        env.execute();
    }
}

在上面代码中我们调用了startNewChain()后就可以将mapStream划分到一个新的task chain中,这样的情况下,两个map既属于不同的task chain又可以共享同一个task slot,如下图:

Flink之Task解析,FLink,flink,大数据
以上就是对于Task的讲解,如有错误欢迎指出,如有问题共同探讨.文章来源地址https://www.toymoban.com/news/detail-658396.html

到了这里,关于Flink之Task解析的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Flink SQL 解析嵌套的 JSON 数据

    下面将会演示如何在 DDL 里面定义 Map、Array、Row 类型的数据,以及在 SQL 里面如何获里面的值。 数据格式如下: 上面的数据包含了 Map、Array、Row 等类型, 对于这样的数据格式,在建表 DDL 里面应该如何定义呢? 定义 DDL 解析 SQL SQL 运行的结果 以如下数据作为样例: 定义 获取 构造

    2024年02月10日
    浏览(46)
  • Flink 中kafka broker缩容导致Task一直重启

    Flink版本 1.12.2 Kafka 客户端 2.4.1 在公司的Flink平台运行了一个读Kafka计算DAU的流程序,由于公司Kafka的缩容,直接导致了该程序一直在重启,重启了一个小时都还没恢复(具体的所容操作是下掉了四台kafka broker,而当时flink配置了12台kafka broker),当时具体的现场如下: 当时Fl

    2024年02月07日
    浏览(50)
  • 【flink】Task 故障恢复详解以及各重启策略适用场景说明

    当 Task 发生故障时,Flink 可以重启出错的 Task 以及其他受到影响的 Task ,以使得作业恢复到正常执行状态。 Flink 通过重启策略和故障恢复策略来控制 Task 重启: 重启策略决定是否可以重启以及重启的间隔; 故障恢复策略决定 哪些 Task 需要重启 。   参数 restart-strategy 定义了

    2024年02月04日
    浏览(42)
  • (增加细粒度资源管理)深入理解flink的task slot相关概念

    之前对flink的task slot的理解太浅了,重新捋一下相关知识点 我们知道,flink中每个TaskManager都是一个 JVM 进程,可以在单独的线程中执行一个或多个 subtask(线程)。 但是TaskManager 的计算资源是有限的,并不是所有任务都可以放在同一个 TaskManager 上并行执行。并行的任务越多

    2024年03月11日
    浏览(41)
  • 源码解析Flink源节点数据读取是如何与checkpoint串行执行

    源码解析Flink源节点数据读取是如何与checkpoint串行执行 Flink版本:1.13.6 前置知识:源节点的Checkpoint是由Checkpointcoordinate触发,具体是通过RPC调用TaskManager中对应的Task的StreamTask类的performChecpoint方法执行Checkpoint。 本文思路:本文先分析checkpoint阶段,然后再分析数据读取阶段,

    2024年02月14日
    浏览(54)
  • 大数据Flink(九十九):SQL 函数的解析顺序和系统内置函数

    文章目录 SQL 函数的解析顺序和系统内置函数

    2024年02月07日
    浏览(49)
  • Flink 启动就报错,但exception没提示。其中一个task failure 该怎么办?

    最近我在生产又遇到一个问题,就是消费着一段时间之后,忽然就不再消费了,但也不报错。观察了几次,我发现时间基本是停留在上下班高峰期数据量最大的时候。我主观猜测可能是同时间进来的数据过多,处理不来导致的。但这个问题我还没来的及思考怎么处理,因此我

    2024年02月16日
    浏览(58)
  • 【Apache-Flink零基础入门】「入门到精通系列」手把手+零基础带你玩转大数据流式处理引擎Flink(基础概念解析+有状态的流式处理)

    Apache Flink 是业界公认的最佳流计算引擎之一,它不仅仅局限于流处理,而是一套兼具流、批、机器学习等多种计算功能的大数据引擎。Flink 的用户只需根据业务逻辑开发一套代码,就能够处理全量数据、增量数据和实时数据,无需针对不同的数据类型开发不同的方案。这使得

    2024年02月03日
    浏览(89)
  • Flink侧输出流解析

    在实时数据处理领域,Apache Flink 已成为一个不可或缺的工具。它以其高吞吐量和低延迟处理能力而闻名。而在 Flink 的众多特性中,侧输出流(Side Outputs)提供了一种灵活的方式来处理复杂的数据流。本文将探讨如何在 Flink 的 Scala API 中有效使用侧输出流。 侧输出流是一种特

    2024年02月04日
    浏览(40)
  • Flink 架构深度解析

    Flink 是一个开源的流处理框架,用于处理和分析实时数据流。它以其高吞吐量、低延迟和强大的状态管理能力而闻名。本文将深入探讨 Flink 的架构设计,帮助读者理解其内部工作原理。 在当今的数据驱动世界中,实时数据处理变得越来越重要。Flink 提供了一个高性能、可扩

    2024年04月26日
    浏览(28)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包