Flink 操作链与任务槽
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 操作链与任务槽的更多相关文章
- flink操作mysql
Flink读写mysql 如果是mvn项目的话,需要预先导入相应的包: <dependency> <groupId>org.apache.flink</groupId&g ...
- flink03-----1.Task的划分 2.共享资源槽 3.flink的容错
1. Task的划分 在flink中,划分task的依据是发生shuffle(也叫redistrubute),或者是并行度发生变化 1. wordcount为例 package cn._51doit ...
- PHP设计模式:类自动载入、PSR-0规范、链式操作、11种面向对象设计模式实现和使用、OOP的基本原则和自动加载配置
一.类自动载入 SPL函数 (standard php librarys) 类自动载入,尽管 __autoload() 函数也能自动加载类和接口,但更建议使用 spl_autoload_registe ...
- C++中的链式操作
代码编译环境:Windows7 32bits+VS2012. 1.什么是链式操作 链式操作是利用运算符进行的连续运算(操作).它的特点是在一条语句中出现两个或者两个以上相同的操作符,如连续的赋值操作. ...
- thinkphp查询构造器和链式操作、事务
插入 更新记录 查询数据 删除数据 插入数据----name这种用法,会去config.php中去寻找前缀,如果你定义了前缀tp,那么执行下条语句会查询对tp_data的插入操作 链式操作---> ...
- Flink资料(1)-- Flink基础概念(Basic Concept)
Flink基础概念 本文描述Flink的基础概念,翻译自https://ci.apache.org/projects/flink/flink-docs-release-1.0/concepts/con ...
- Apache Flink 分布式运行时环境
Tasks and Operator Chains(任务及操作链) 在分布式环境下,Flink将操作的子任务链在一起组成一个任务,每一个任务在一个线程中执行.将操作链在一起是一个不错的优化:它减少了线 ...
- Apache Flink - 分布式运行环境
1.任务和操作链 下面的数据流图有5个子任务执行,因此有五个并行线程. 2.Job Managers, Task Managers, Clients Job Managers:协调分布式运行,他们安排 ...
- Flink Program Guide (2) -- 综述 (DataStream API编程指导 -- For Java)
v\:* {behavior:url(#default#VML);} o\:* {behavior:url(#default#VML);} w\:* {behavior:url(#default#VM ...
随机推荐
- CentOS6.9安装MySQL(编译安装、二进制安装)
目录 CentOS6.9安装MySQL Linux安装MySQL的4种方式: 1. 二进制方式 特点:不需要安装,解压即可使用,不能定制功能 2. 编译安装 特点:可定制,安装慢 5.5之前: ./c ...
- Python字符串(一)
一.get char 1.获取单个字符 字符串中的每一个字符都会对应一个唯一的下标(索引)用来表示字符串中的位置.下标从0开始依次增加:0对应的是第一个字符:也可以从从-1开始依次减小,-1代表最后一 ...
- 【拒绝挂分】盘点蒟蒻ghy的各种sb错误
1.m与n打反(打错) NOIPd2t2 50变15爽不爽啊.jpg 某次信心赛四道sb题里面最sb的一道 sort里面的m打成n 100变40爽不爽啊.jpg(还有40我真的谢谢您了 2.没开lon ...
- 什么叫github
git remote add origin https://github.com/huiwangui/git-demo.git:表示在本地仓库关联远程仓库(https://github.com/hui ...
- jmeter断言之响应code:200
因为Jmeter只要检测到网页的响应,就认为是Pass而并不管当前网页内容的正确性.在进行压力测试时,为了检查Web服务器返回的网页是否正确,我们可以设置断言,这些断言是验证网页上是否存在指定的Tex ...
- 题解 loj2065 「SDOI2016」模式字符串
点分治. 考虑经过当前分治中心\(u\)的点对数量. 这种数点对数的问题,有一个套路.我们可以依次考虑\(u\)的每个儿子,看用当前的儿子,能和之前已经考虑过的所有儿子,组成多少点对.这样所有合法的点 ...
- MQTT v5 (MQTT 5.0) 新特性介绍
https://blog.csdn.net/mrpre/article/details/87267400 背景 MQTT v3.1.1 作为一个经典的版本,一般能够满足大部分需求:为了避免落后,我们也 ...
- HashMap ConcurrentHashMap解读
前言: 常见的关于HahsMap与ConcurrentHashMap的问题: 数据结构.线程安全.扩容.jdk1.7 HashMap死循环.jdk1.8 HashMap红黑树.容量必须是2的冥次 Ha ...
- main方法
main函数的分析(python) 对于很多编程语言来说,程序都必须要有一个入口,比如C,C++,以及完全面向对象的编程语言Java,C#等.如果你接触过这些语言,对于程序入口这个概念应该很好理解,C ...
- 5G大潮下卖点越来越少的苹果,会成为下一个诺基亚吗?
当下,5G显然成为手机厂商继全面屏.AI等之后,又一个重要的风口.为了赶上这个风口,很多厂商不惜寻找各种噱头去吸引大众的关注.比如小米在发布MIX 3之前疯狂造势称要发布5G版,但在10月25日的发布 ...