Operator Chains(操作链)

  • Flink出于分布式执行的目的,将operator的subtask链接在一起形成task(类似spark中的管道)。

  • 每个task在一个线程中执行。

  • 将operators链接成task是非常有效的优化:它可以减少线程与线程间的切换和数据缓冲的开销,并在降低延迟的同时提高整体吞吐量。

  • 链接的行为可以在编程API中进行指定,详情请见代码OperatorChainTest。

  • 开启操作链 和 禁用操作链的对比图(默认开启):

  • Flink默认会将多个operator进行串联,形成任务链(task chain)

  • 注意: task chain 可以理解为就是 operator chain 只是不同场景下,称呼不同。

  • 我们也可以禁用任务链,让每个operator形成一个task。

  • StreamExecutionEnvironment.disableOperatorChaining() 这个方法会禁用整条工作链

  • 操作链其实就是类似spark的pipeline管道模式,一个task可以执行同一个窄依赖中的算子操作。

  • 我们也可以细粒度的控制工作链的形成,比如调用dataStreamSource.map(...).startNewChain(),但不能使用dataStreamSource.startNewChain()

  • dataStreamSource.filter(...).map(...).startNewChain().map(...),需要注意的是,当这样写时相当于source和filter组成一条链,两个map组成一条链。

  • 即在filter和map之间断开,各自形成单独的链。

  • 代码:

    package com.ronnie.flink.stream.test;
    
    import org.apache.flink.api.common.functions.MapFunction;
    import org.apache.flink.api.java.tuple.Tuple2;
    import org.apache.flink.streaming.api.datastream.DataStreamSource;
    import org.apache.flink.streaming.api.datastream.SingleOutputStreamOperator;
    import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment; /**
    * 开启与禁用工作链时,输出的结果不一样。
    * 当开启工作链时(默认启动),operator map1与map2 组成一个task.
    * 此时task运行时,对于hello,flink 这两条数据是:
    * 先打印 hello ---- 1 , hello->1 ---- 2
    * 后打印 flink ---- 1 , flink->1 ---- 2
    * 当禁用工作链时,operator map1与map2 分别在两个task中执行
    * 此时task运行时,对于hello,flink 这两条数据是:
    * 先打印 hello ---- 1 , flink ---- 1
    * 后打印 hello->1 ---- 2 , flink->1 ---- 2
    *
    * 注:操作链类似spark的管道,一个task执行多个的算子.
    */
    public class OperatorChainTest { public static final String[] WORDS = new String[] {
    "hello",
    "flink",
    "spark",
    "hbase"
    }; public static void main(String[] args) {
    // 设置执行环境, 类似spark中初始化sparkContext一样
    StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment(); env.setParallelism(1); // 关闭操作链..
    env.disableOperatorChaining(); DataStreamSource<String> dataStreamSource = env.fromElements(WORDS); SingleOutputStreamOperator<String> pairStream = dataStreamSource.map(new MapFunction<String, String>() {
    @Override
    public String map(String value) throws Exception {
    System.err.println(value + " ---- 1");
    return value + "->1";
    }
    }).map(new MapFunction<String, String>() {
    @Override
    public String map(String value) throws Exception {
    System.err.println(value + " ---- 2");
    return value + "->2";
    }
    }); // 还可以控制更细粒度的任务链,比如指明从哪个operator开始形成一条新的链
    // someStream.map(...).startNewChain(),但不能使用someStream.startNewChain()。
    try {
    env.execute();
    } catch (Exception e) {
    e.printStackTrace();
    }
    }
    }

Task slots(任务槽)

  • TaskManager 是一个 JVM 进程,并会以独立的线程来执行一个task或多个subtask。
  • 为了控制一个 TaskManager 能接受多少个 task,Flink 提出了 Task Slot 的概念。
  • Flink 中的计算资源通过 Task Slot 来定义。每个 task slot 代表了 TaskManager 的一个固定大小的资源子集。
  • 例如,一个拥有3个slot的 TaskManager,会将其管理的内存平均分成三分分给各个 slot。
  • 将资源 slot 化意味着来自不同job的task不会为了内存而竞争,而是每个task都拥有一定数量的内存储备。
  • 需要注意的是,这里不会涉及到CPU的隔离,slot目前仅仅用来隔离task的内存。
  • 通过调整 task slot 的数量,用户可以定义task之间是如何相互隔离的。
  • 每个 TaskManager 有一个slot,也就意味着每个task运行在独立的 JVM 中。
  • 每个 TaskManager 有多个slot的话,也就是说多个task运行在同一个JVM中。
  • 而在同一个JVM进程中的task,可以共享TCP连接(基于多路复用)和心跳消息,可以减少数据的网络传输。
  • 也能共享一些数据结构,一定程度上减少了每个task的消耗。
  • 如图中所示,5个Task可能会在TaskManager的slots中分布,图中共2个TaskManager,每个有3个slot。

Flink 操作链与任务槽的更多相关文章

  1. flink操作mysql

    Flink读写mysql 如果是mvn项目的话,需要预先导入相应的包: <dependency> <groupId>org.apache.flink</groupId&g ...

  2. flink03-----1.Task的划分 2.共享资源槽 3.flink的容错

    1. Task的划分 在flink中,划分task的依据是发生shuffle(也叫redistrubute),或者是并行度发生变化 1.  wordcount为例 package cn._51doit ...

  3. PHP设计模式:类自动载入、PSR-0规范、链式操作、11种面向对象设计模式实现和使用、OOP的基本原则和自动加载配置

    一.类自动载入 SPL函数 (standard php librarys) 类自动载入,尽管 __autoload() 函数也能自动加载类和接口,但更建议使用 spl_autoload_registe ...

  4. C++中的链式操作

    代码编译环境:Windows7 32bits+VS2012. 1.什么是链式操作 链式操作是利用运算符进行的连续运算(操作).它的特点是在一条语句中出现两个或者两个以上相同的操作符,如连续的赋值操作. ...

  5. thinkphp查询构造器和链式操作、事务

    插入 更新记录 查询数据 删除数据 插入数据----name这种用法,会去config.php中去寻找前缀,如果你定义了前缀tp,那么执行下条语句会查询对tp_data的插入操作 链式操作---> ...

  6. Flink资料(1)-- Flink基础概念(Basic Concept)

    Flink基础概念 本文描述Flink的基础概念,翻译自https://ci.apache.org/projects/flink/flink-docs-release-1.0/concepts/con ...

  7. Apache Flink 分布式运行时环境

    Tasks and Operator Chains(任务及操作链) 在分布式环境下,Flink将操作的子任务链在一起组成一个任务,每一个任务在一个线程中执行.将操作链在一起是一个不错的优化:它减少了线 ...

  8. Apache Flink - 分布式运行环境

    1.任务和操作链 下面的数据流图有5个子任务执行,因此有五个并行线程. 2.Job Managers, Task Managers, Clients Job Managers:协调分布式运行,他们安排 ...

  9. Flink Program Guide (2) -- 综述 (DataStream API编程指导 -- For Java)

    v\:* {behavior:url(#default#VML);} o\:* {behavior:url(#default#VML);} w\:* {behavior:url(#default#VM ...

随机推荐

  1. /dev设备文件命名或符号链接建立

    udev是一个用户空间服务,负责监听内核设备变动事件,从/sysfs---中读取发生变动的设备属性信息,遍历 命名规则文件,进行属性规则的匹配,如果匹配,就进行执行命名自定义动作 udev 的规则和规 ...

  2. 吴裕雄--天生自然HADOOP操作实验学习笔记:pvuv统计案例理论

    实验目的 复习pv.uv的概念和原理 了解pv.uv的实际意义和获取方法 实验原理 前面我们已经基于mapreduce进行数据的etl处理,实验有很多不足之处,这次实验我们是基于url数据进行pv和u ...

  3. 【剑指Offer面试编程题】题目1503:二叉搜索树与双向链表--九度OJ

    题目描述: 输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表.要求不能创建任何新的结点,只能调整树中结点指针的指向. 输入: 输入可能包含多个测试样例. 对于每个测试案例,输入的第一行为一个 ...

  4. primecoin 全节点日常维护操作

    primecoin 全节点日常维护操作: 一.关于primecoin维护,每天检查这6个地址是否能正常访问: http://api.primecoin.org/rest/pcoin/syncblock ...

  5. 【转】iPhone/IOS使用Fiddler抓包配置

    原文链接:https://blog.csdn.net/weixin_39198406/article/details/81123716 1. 安装 安装Fiddler软件2. 配置2.1 端口 点击 ...

  6. Linux和云供应商Red Hat被IBM以34亿美元的价格收购

    导读 今天的主题包括IBM以340亿美元收购Red Hat,人性化是使人工智能成功的关键.两家公司于10月28日宣布,IBM正以340亿美元的价格收购Linux和云技术供应商Red Hat,以期改变云 ...

  7. Windows系统(服务器)忘记管理员登录密码:

    windows sever2003忘记密码:使用老毛桃PE进入然后修改密码,重启即可. windows sever2008忘记密码:可按该网址的方法即可解决:http://www.jb51.net/a ...

  8. 第3节 storm高级应用:2、storm与hdfs的整合工程环境准备;3、整合代码开发

    ======================================== 3.  storm与hdfs的整合使用 3.1.功能需求: 实现随机发送订单数据,从计算订单的总金额,然后将订单中的数 ...

  9. 超大数据量操作 java程序优化[转载]

        一个表中有1000万以上的数据,要对其进行10万次以上的增删查改的操作,请问如何优化java程序对数据库的操作? 通过使用一些辅助性工具来找到程序中的瓶颈,然后就可以对瓶颈部分的代码进行优化. ...

  10. array_multisort 对关联数组进行排序的问题 PHP

    我们在php的数组操作中经常用到对数组进行排序的问题,这里说的是对关联数组进行排序需要用到函数 array_multisort . array_multisort(array_column($arr, ...