关于Flink slot 和kafka topic 分区关系的说明
今天又有小伙伴在群里问 slot 和 kafka topic 分区(以下topic,默认为 kafka 的 topic )的关系,大概回答了一下,这里整理一份
首先必须明确的是,Flink Task Manager 的 slot 数 和 topic 的分区数是没有直接关系的,而这个问题其实是问的是: 任务的并发数与 slot 数的关系
最大并发数 = slot 数
这里有两个原因:每个算子的不同并行不能在同一slot,不同的算子可以共享 slot ,所以最大并行度 就等于 slot 数。
这样就有了slot数和topic 分区数的间接关系在:我们可能会根据 kafka 的分区数配置我们 source (和后续的其他算子)算子的 并行度,而算子的 最大并行度决定 slot 数据(TM 的数量由 slot 的数量反向计算)
看一张官网的图:

说明:
第一个图:3 个 Task Manager,每个 3 个 slot,总共 9 个 slot
第二个图:Example 1 ,wordcount 案例,1 个并发,算子chain 在一起,只占一个 slot
第三个图:Examlple 2,wordcount 案例,2 个并发,占2 slot 。三种设置并行度的方式:
flink-conf.yaml 参数 parallelism.default: 2
flink -p 2 # 启动时加 -p 参数指定
env.setParallelism(2)
第四个图:Example 3,wordcount 案例,9 个并发,占 9 slot
第五个图:Example 3,wordcount 案例,source 9 个并发,sink 1 个并发,占 9 个slot(sink 和其中一个 source chain 在一起了)
看一个具体的任务:
我们要读的 topic 有 2 个 partition,我们设置 source 算子的并行度为 2,那我们最小就需要 4 个 slot,Task Manager 配置的 slot 数为2, 那最少就需要 2 个 TM 任务才能正常运行(不考虑其他算子)。
关键代码:
env.setParallelism(2)
env.addSource(source).addSink(sink)
提交到yarn 上

上面说明了算子的并发度与TM 的 slot 数的关系。
下面看下,kafka 分区数与 source 算子的并行度关系。
在不修改 kafka consumer 的分区分配策略的情况下,soure 的并行度与 topic 分区数在不同情况下,会有不同的表现,如下:
1、source 并行度 = topic 分区数,正好的情况,一个 并行度,读一个分区的数据
2、source 并行读 < topic 分区数, 会出现部分 并行度读多个 分区的情况,具体可见:flink 读取kafka 数据,partition分配
3、source 并行度 > topic 分区数,会出现部分并行度没有数据的情况
总结下问题:slot 数和 topic 的分区数并没有直接关系,以kafka 做 source 的情况最多,而 kafka topic 的分区数一般又是 Flink source 的并行度,又是 Flink 任务的最大并发度,一般情况下又是 slot 的数量,所以会有一种 slot 数 和 topic 分区数 有直接关系的假象。
注:Task Manager 的 slot 数在 flink-conf.yaml 中配置 参数:
# The number of task slots that each TaskManager offers. Each slot runs one parallel pipeline. taskmanager.numberOfTaskSlots: 2 # 默认值为1
官网 slot 配置说明:https://ci.apache.org/projects/flink/flink-docs-release-1.9/ops/config.html#configuring-taskmanager-processing-slots (slot 数量推荐是 standalone 集群每台机只有一个 Task Manager的情况下,具体配置要看实际任务情况)
欢迎关注Flink菜鸟公众号,会不定期更新Flink(开发技术)相关的推文

关于Flink slot 和kafka topic 分区关系的说明的更多相关文章
- (三)kafka集群扩容后的topic分区迁移
kafka集群扩容后的topic分区迁移 kafka集群扩容后,新的broker上面不会数据进入这些节点,也就是说,这些节点是空闲的:它只有在创建新的topic时才会参与工作.除非将已有的partit ...
- (一)kafka修改topic分区的位置
(一)kafka修改topic分区的位置 环境:kafka_2.10-0.8.2.1 + JDK1.7.0_80 1. 查看分区topic的分区分布 $ le-kafka-topics.sh --de ...
- kafka topic消息分配partition规则(Java源码)
我们知道Kafka 的消息通过topic进行分类.topic可以被分为若干个partition来存储消息.消息以追加的方式写入partition,然后以先入先出的顺序读取. 下面是topic和part ...
- Kakfa揭秘 Day4 Kafka中分区深度解析
Kakfa揭秘 Day4 Kafka中分区深度解析 今天主要谈Kafka中的分区数和consumer中的并行度.从使用Kafka的角度说,这些都是至关重要的. 分区原则 Partition代表一个to ...
- Kafka Topic Partition Replica Assignment实现原理及资源隔离方案
本文共分为三个部分: Kafka Topic创建方式 Kafka Topic Partitions Assignment实现原理 Kafka资源隔离方案 1. Kafka Topic创建方式 ...
- flink引出的kafka不同版本的兼容性
参考: 官网协议介绍:http://kafka.apache.org/protocol.html#The_Messages_Fetch kafka协议兼容性 http://www.cnblogs.c ...
- Kafka Topic Api
Pom: <dependency> <groupId>org.apache.kafka</groupId> <artifactId>kafka_2.10 ...
- Flink 中的kafka何时commit?
https://ci.apache.org/projects/flink/flink-docs-release-1.6/internals/stream_checkpointing.html @Ove ...
- 手动删除Kafka Topic
一.删除Kafka topic 运行./bin/kafka-topics --delete --zookeeper [zookeeper server] --topic [topic name]: ...
随机推荐
- position 的absolute会使display变成inline-block
position:absolute和float会隐式地改变display类型,不论之前什么类型的元素(display:none除外), 只要设置了position:absolute. float中任意 ...
- version GLIBCXX3.4.21 not defined in file libstdc++.so.6 with link time reference
问题:在运行C++程序时,输入 ./a.out 输出:symbol _ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEC1Ev, version ...
- Codechef Palindromeness 和 SHOI2011 双倍回文
Palindromeness Let us define the palindromeness of a string in the following way: If the string is n ...
- IDEA 中 Git Commit message 编写
IDEA安装插件 Git Commit Template 1. HeaderHeader的部分只有一行,包括三个字段: type(必需), scope(可选), subject(必需) 对应到idea ...
- React Virtual DOM Explained in Simple English
If you are using React or learning React, you must have heard of the term “Virtual DOM”. Now what is ...
- vue.js不仅是一种模式,也是一种工程组织方式
vue.js不仅是一种模式,也是一种工程组织方式
- du -h
du命令用来查看目录或文件所占用磁盘空间的大小.常用选项组合为:du -sh 一.du的功能:`du` reports the amount of disk space used by the s ...
- 洛谷P1084 运输计划
题目 题目要求使一条边边权为0时,m条路径的长度最大值的最小值. 考虑二分此长度最大值 首先需要用lca求出树上两点间的路径长度.然后取所有比mid大的路径的交集,判断有哪些边在这些路径上都有出现,然 ...
- <转>python列表、元组、集合、字典、json相互转换以及其他基础入门
列表元组转其他 # 列表转集合(去重) list1 = [6, 7, 7, 8, 8, 9] set(list1) # {6, 7, 8, 9} #两个列表转字典 list1 = ['key1','k ...
- 在vb.net中使用委托:经理 和 员工
现在开发的一个 vb.net系统,其中有两个窗体:alert窗体和 case窗体. 在alert窗体中列出了当前可以操作的若干个alert(可以理解为数据记录),用户可以选择将其中一个或几个alert ...