前言

之所以写这个是因为前段时间自己的项目出现过这样的一个问题:

1Caused by: akka.pattern.AskTimeoutException: 2Ask timed out on [Actor[akka://flink/user/taskmanager_0#15608456]] after [10000 ms]. 3Sender[null] sent message of type "org.apache.flink.runtime.rpc.messages.LocalRpcInvocation".

跟着这问题在 Flink 的 Issue 列表里看到了一个类似的问题:https://issues.apache.org/jira/browse/FLINK-9056
,看下面的评论差不多就是 TaskManager 的 slot 数量不足的原因,导致 job 提交失败。在 Flink 1.63 中已经修复了变成抛出异常了。


竟然知道了是因为 slot 不足的原因了,那么我们就要先了解下 slot 是什么东东呢?不过文章这里先介绍下 parallelism。

什么是 parallelism?


如翻译这样,parallelism 是并行的意思,在 Flink 里面代表每个任务的并行度,适当的提高并行度可以大大提高 job 的执行效率,比如你的 job 消费 kafka 数据过慢,适当调大可能就消费正常了。

那么在 Flink 中怎么设置并行度呢?

如何设置 parallelism?


如上图,在 flink 配置文件中可以查看到默认并行度是 1,

1cat flink-conf.yaml | grep parallelism23# The parallelism used for programs that did not specify and other parallelism.4parallelism.default: 1

所以你如何在你的 flink job 里面不设置任何的 parallelism 的话,那么他也会有一个默认的 parallelism = 1。那也意味着你可以修改这个配置文件的默认并行度。

如果你是用命令行启动你的 Flink job,那么你也可以这样设置并行度(使用 -p 并行度):

1./bin/flink run -p 10 ../word-count.jar

你也可以通过这样来设置你整个程序的并行度:

1StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();2env.setParallelism(10);

注意:这样设置的并行度是你整个程序的并行度,那么后面如果你的每个算子不单独设置并行度覆盖的话,那么后面每个算子的并行度就都是这里设置的并行度的值了。

如何给每个算子单独设置并行度呢?

1data.keyBy(new xxxKey())2    .flatMap(new XxxFlatMapFunction()).setParallelism(5)3    .map(new XxxMapFunction).setParallelism(5)4    .addSink(new XxxSink()).setParallelism(1)

如上,就是在每个算子后面单独的设置并行度,这样的话,就算你前面设置了 env.setParallelism(10) 也是会被覆盖的。

这也说明优先级是:算子设置并行度 > env 设置并行度 > 配置文件默认并行度

并行度讲到这里应该都懂了,下面 zhisheng 就继续跟你讲讲 什么是 slot?

什么是 slot?

其实什么是 slot 这个问题之前在第一篇文章 《从0到1学习Flink》—— Apache Flink 介绍 中就介绍过了,这里再讲细一点。


图中 Task Manager 是从 Job Manager 处接收需要部署的 Task,任务的并行性由每个 Task Manager 上可用的 slot 决定。每个任务代表分配给任务槽的一组资源,slot 在 Flink 里面可以认为是资源组,Flink 将每个任务分成子任务并且将这些子任务分配到 slot 来并行执行程序。

例如,如果 Task Manager 有四个 slot,那么它将为每个 slot 分配 25% 的内存。 可以在一个 slot 中运行一个或多个线程。 同一 slot 中的线程共享相同的 JVM。 同一 JVM 中的任务共享 TCP 连接和心跳消息。Task Manager 的一个 Slot 代表一个可用线程,该线程具有固定的内存,注意 Slot 只对内存隔离,没有对 CPU 隔离。默认情况下,Flink 允许子任务共享 Slot,即使它们是不同 task 的 subtask,只要它们来自相同的 job。这种共享可以有更好的资源利用率。

文字说的比较干,zhisheng 这里我就拿下面的图片来讲解:


上面图片中有两个 Task Manager,每个 Task Manager 有三个 slot,这样我们的算子最大并行度那么就可以达到 6 个,在同一个 slot 里面可以执行 1 至多个子任务。

那么再看上面的图片,source/map/keyby/window/apply 最大可以有 6 个并行度,sink 只用了 1 个并行。

每个 Flink TaskManager 在集群中提供 slot。 slot 的数量通常与每个 TaskManager 的可用 CPU 内核数成比例。一般情况下你的 slot 数是你每个 TaskManager 的 cpu 的核数。

但是 flink 配置文件中设置的 task manager 默认的 slot 是 1。


slot 和 parallelism

下面给出官方的图片来更加深刻的理解下 slot:

1、slot 是指 taskmanager 的并发执行能力


taskmanager.numberOfTaskSlots:3

每一个 taskmanager 中的分配 3 个 TaskSlot, 3 个 taskmanager 一共有 9 个 TaskSlot。

2、parallelism 是指 taskmanager 实际使用的并发能力


parallelism.default:1

运行程序默认的并行度为 1,9 个 TaskSlot 只用了 1 个,有 8 个空闲。设置合适的并行度才能提高效率。

3、parallelism 是可配置、可指定的


上图中 example2 每个算子设置的并行度是 2, example3 每个算子设置的并行度是 9。


example4 除了 sink 是设置的并行度为 1,其他算子设置的并行度都是 9。

好了,既然并行度和 slot zhisheng 都带大家过了一遍了,那么再来看文章开头的问题:slot 资源不够。

问题原因

现在这个问题的答案其实就已经很明显了,就是我们设置的并行度 parallelism 超过了 Task Manager 能提供的最大 slot 数量,所以才会报这个错误。

再来拿我的代码来看吧,当时我就是只设置了整个项目的并行度:

1env.setParallelism(15);

为什么要设置 15 呢,因为我项目消费的 Kafka topic 有 15 个 parttion,就想着让一个并行去消费一个 parttion,没曾想到 Flink 资源的不够,稍微降低下 并行度为 10 后就没出现这个错误了。

总结

本文由自己项目生产环境的一个问题来讲解了自己对 Flink parallelism 和 slot 的理解,并告诉大家如何去设置这两个参数,最后也指出了问题的原因所在。

关注我

转载请务必注明原创地址为:http://www.54tianzhisheng.cn/2019/01/14/Flink-parallelism-slot/ , 未经允许禁止转载。

微信公众号:zhisheng

另外我自己整理了些 Flink 的学习资料,目前已经全部放到微信公众号了。你可以加我的微信:zhisheng_tian,然后回复关键字:Flink 即可无条件获取到。

Github 代码仓库

https://github.com/zhisheng17/flink-learning/

以后这个项目的所有代码都将放在这个仓库里,包含了自己学习 flink 的一些 demo 和博客

相关文章

1、《从0到1学习Flink》—— Apache Flink 介绍

2、《从0到1学习Flink》—— Mac 上搭建 Flink 1.6.0 环境并构建运行简单程序入门

3、《从0到1学习Flink》—— Flink 配置文件详解

4、《从0到1学习Flink》—— Data Source 介绍

5、《从0到1学习Flink》—— 如何自定义 Data Source ?

6、《从0到1学习Flink》—— Data Sink 介绍

7、《从0到1学习Flink》—— 如何自定义 Data Sink ?

8、《从0到1学习Flink》—— Flink Data transformation(转换)

9、《从0到1学习Flink》—— 介绍Flink中的Stream Windows

10、《从0到1学习Flink》—— Flink 中的几种 Time 详解

11、《从0到1学习Flink》—— Flink 写入数据到 ElasticSearch

12、《从0到1学习Flink》—— Flink 项目如何运行?

13、《从0到1学习Flink》—— Flink 写入数据到 Kafka

14、《从0到1学习Flink》—— Flink JobManager 高可用性配置

flink 不设置水印_从0到1学习Flink—— Flink parallelism 和 Slot 介绍相关推荐

  1. flink 不设置水印_区分理解Flink水印延迟与窗口允许延迟的概念

    link 在开窗处理事件时间(Event Time) 数据时,可设置水印延迟以及设置窗口允许延迟(allowedLateness)以保证数据的完整性.这两者因都是设置延迟时间所以刚接触时容易混淆.本文 ...

  2. flink sql设置并行度_《从0到1学习Flink》—— Flink parallelism 和 Slot 介绍

    前言 之所以写这个是因为前段时间自己的项目出现过这样的一个问题: Caused by: akka.pattern.AskTimeoutException: Ask timed out on [Acto ...

  3. textedit设置水印_工具设置:TextEdit

    textedit设置水印 Compared to Notepad, TextEdit is far more fully-featured. We have to deliberately " ...

  4. 《从0到1学习Flink》—— Flink parallelism 和 Slot 介绍

    2019独角兽企业重金招聘Python工程师标准>>> 前言 之所以写这个是因为前段时间自己的项目出现过这样的一个问题: 1 2 3 Caused by: akka.pattern. ...

  5. flink 写入到es_《从0到1学习Flink》—— Flink 写入数据到 Kafka

    前言 之前文章 <从0到1学习Flink>-- Flink 写入数据到 ElasticSearch 写了如何将 Kafka 中的数据存储到 ElasticSearch 中,里面其实就已经用 ...

  6. Flink parallelism 和 Slot 介绍

    原文链接:https://cloud.tencent.com/developer/article/1400012 parallelism 是并行的意思,在 Flink 里面代表每个任务的并行度,适当的 ...

  7. Flink(十六)—— Flink parallelism 和 Slot 介绍

    前言 之所以写这个是因为前段时间自己的项目出现过这样的一个问题: Caused by: akka.pattern.AskTimeoutException: Ask timed out on [Acto ...

  8. flink 不设置水印_Flink基础:时间和水印

    ​ 往期推荐: 本篇终于到了Flink的核心内容:时间与水印.最初接触这个概念是在Spark Structured Streaming中,一直无法理解水印的作用.直到使用了一段时间Flink之后,对实 ...

  9. ipv4地址怎么设置 手机_怎么修改手机ip地址?手机ip地址更改方法介绍

    许多朋友的手机刷机后,或者使用手机不当,出现WiFi连接一直处于正在获取ip地址,就是上不了网,出现这种情况说明当前的wifi地址出现分配问题,需要手机用户自己修改为静态ip,那么怎么修改手机ip地址 ...

最新文章

  1. poj 2288 Islands and Bridges_状态压缩dp_哈密尔顿回路问题
  2. 解决‘C:\Program‘ 不是内部或外部命令,也不是可运行的程序或批处理文件
  3. r语言合并多个csv文件_PDF合并怎么做?分享多个PDF文件合并的方法
  4. 微信小程序获取unionid为空
  5. libxml主要函数说明 (二)
  6. 移动端H5游戏开发之(移动端尺寸基础知识)
  7. PA AE PR AI 2019注册机
  8. nio java是什么_JAVA NIO是什么(zz)
  9. 航天器平台二次电源系统的可靠性设计
  10. arm-2d库详细介绍
  11. 园区SDN网络自动化能力优化思路
  12. 图片情感研究现状与思考
  13. R语言28-Prosper 贷款数据分析4
  14. Android中获取手机设备信息、RAM、ROM存储信息,如宽、高、厂商名、手机品牌
  15. java微博图床小工具
  16. Visitor模式实践
  17. 逻辑回归的参数计算:牛顿法,梯度下降法,随机梯度下降法
  18. 中国工商银行网银不能识别U盾或打不开网页
  19. 统计学习方法——统计学习的分类
  20. Part 2.2 离散类别值与连续值

热门文章

  1. 蚂蚁金服资深总监韩鸿源:企业级数据库平台的持续与创新
  2. 滴滴经验分享:SQLFlow如何让运营专家用上AI?
  3. 在闲鱼,我们如何用Dart做高效后端开发?
  4. 2021金蝶全球创见者大会成功举办, 500强企业共话EBC数字战斗力
  5. Gartner:70%新应用由低代码开发,AI热潮后小数据崛起
  6. 27年前研发出国内首台小型机的浪潮,如何怎么样了?
  7. 今天,我要教妹子学会Spring:Aware、异步编程、计划任务
  8. 云+X案例展 | 金融类:青云QingCloud助力泰康人寿云计算演进之路
  9. 5G精华问答 | 5G的关键无线技术是啥?
  10. 鸿蒙系统被烧毁,华为鸿蒙操作系统再次被质疑 国产是原罪