大数据-128 - Flink 并行度设置 细节详解 全局、作业、算子、Slot

news/2024/9/20 1:19:29/ 标签: 大数据, flink, java, 分布式, spark, scala

点一下关注吧!!!非常感谢!!持续更新!!!

目前已经更新到了:

  • Hadoop(已更完)
  • HDFS(已更完)
  • MapReduce(已更完)
  • Hive(已更完)
  • Flume(已更完)
  • Sqoop(已更完)
  • Zookeeper(已更完)
  • HBase(已更完)
  • Redis (已更完)
  • Kafka(已更完)
  • Spark(已更完)
  • Flink(正在更新!)

章节内容

上节我们完成了如下的内容:

  • ManageOperatorState
  • StateBackend
  • Checkpoint

在这里插入图片描述

简单介绍

一个Flink程序由多个Operator组成(Source、Transformation、Sink)。
一个Operator由多个并行的Task(线程)来执行,一个Operator的并行Task(线程)数目就被称为该Operator(任务)并行度(Paralle)
并行度可以有如下几种指定方式。
Flink 中的并行度(Parallelism)是指每个算子(Operator)在任务执行时可以同时处理数据的并发实例数。Flink 的核心优势之一就是能够通过并行处理大规模数据来提高效率和性能。通过正确设置并行度,你可以在充分利用集群资源的同时,实现高效的数据处理。接下来详细介绍 Flink 并行度的概念、设置方法及其优化策略。

并行度的概念

在 Flink 中,并行度主要决定每个操作符在作业中被分配多少个并发实例来处理数据。操作符的并行实例越多,任务就能够越快完成。通常,Flink 作业中的每个操作符都会以并行实例的形式执行在集群中的不同 TaskManager 上,这样可以充分利用集群的计算资源。
Flink 中的并行度可以分为以下几个层级:

全局并行度(Global Parallelism)

全局并行度是指 Flink 集群默认为所有作业和操作符分配的并行度。在配置文件 flink-conf.yaml 中,你可以通过以下配置来设置 Flink 集群的默认全局并行度:

parallelism.default: 4

这个配置将为每个没有指定并行度的操作符分配默认的 4 个并行实例。如果你没有在代码中或任务提交时明确设置并行度,Flink 将使用这个默认值。

作业并行度(Job-level Parallelism)

在提交 Flink 作业时,你可以为整个作业设置并行度,覆盖全局默认值。例如,在命令行使用 flink run 提交作业时可以通过 -p 参数来设置并行度:

flink run -p 10 your-job.jar

此命令将作业的并行度设置为 10,作业中的每个操作符都会被分配 10 个并行实例。这个设置的优先级高于全局并行度。

算子并行度(Operator-level Parallelism)

你可以在代码中为每个具体的算子设置不同的并行度。Flink 提供了灵活的算子级别并行度控制,可以根据数据处理逻辑的需要对不同的算子设定不同的并行度。例如:

DataStream<String> stream = env.readTextFile("input.txt").map(new MyMapper()).setParallelism(5);

在这段代码中,map 操作的并行度被设置为 5,这意味着 map 操作会启动 5 个并发任务来处理数据。其他没有显式设置并行度的算子将使用默认的作业级别并行度。

Slot 并行度(Slot-level Parallelism)

Flink 中的 TaskManager 是执行并行任务的工作节点,每个 TaskManager 中可以包含多个任务槽(Slot)。每个 Slot 对应一个并发任务实例,并可以同时运行多个任务实例。Slot 并行度是 Flink 资源分配中的重要概念,如果作业的并行度超过了集群中可用的 Slot 数,Flink 会进行资源调度,这可能会导致性能下降。
每个 TaskManager 可以配置 Slot 数,例如:

taskmanager.numberOfTaskSlots: 4

Operator Level

算子级别,一个算子,数据源和Sink并行度可以通过调用setParalleism()方法来指定

actions.filter(new FilterFunction<UserAction>() {@Overridepublic boolean filter(UserAction value) throws Exception {return false;}
}).setParallelism(4);

Execution Environment Level

Env级别

执行环境(任务)的默认并行度可以通过调用setParallelism()方法指定,为了并行度3来执行所有的算子、数据源的DataSink,可以通过如下的方式设置执行环境的并行度:

StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
env.setParallelism(4);

Client Level

客户端级别,推荐使用。
并行度可在客户端将Job提交到Flink时设定,对于CLI客户端,可以通过-p参数指定并行度。

System Level

系统默认级别,尽量不使用。在系统级可以通过设置 flink-conf.yaml中的parallism.default属性来执行环境的默认并行度。
在这里插入图片描述在这里插入图片描述

如何设置 Flink 并行度

Flink 提供了几种方法来设置并行度:

在 Flink 配置文件中设置全局并行度

parallelism.default: 4

在提交作业时设置并行度

这里的 -p 20 设置作业的并行度为 20。

flink run -p 20 your-job.jar

在代码中为算子设置并行度

DataStream<String> dataStream = env.readTextFile("input.txt").map(new MyMapper()).setParallelism(10);

并行度的优化策略

合理设置并行度可以有效提高 Flink 作业的性能,但并行度的设置需要根据数据量、任务复杂度、集群资源等多个因素综合考虑。以下是一些优化策略:

根据数据量设置合理的并行度

对于大数据量的任务,可以通过增加并行度来提高处理速度,但并不是并行度越高越好。过高的并行度会导致资源浪费和任务调度开销。一般来说,建议作业的并行度不要超过 TaskManager 可用 Slot 的总数。

合理分配操作符的并行度

某些操作符,比如 keyBy() 后的 reduce 或 aggregate,其并行度受键值数量的限制,因此为这些操作符设置过高的并行度并不会提高性能。你可以通过数据的特性和操作符的逻辑来合理分配不同操作符的并行度。

利用资源监控进行动态调优

在任务运行时,可以使用 Flink 的 Web UI 来监控作业的运行状态。如果发现某些算子的处理速度慢、资源利用率低,可以考虑调整这些算子的并行度。此外,Flink 允许通过 REST API 或 Web UI 动态调整并行度,而无需重新提交作业。

考虑网络和 I/O 限制

Flink 作业的性能不仅取决于 CPU 和内存,还受限于网络带宽和 I/O 速度。在处理大数据时,如果作业需要频繁地进行网络传输或者 I/O 操作(如读取和写入 HDFS、Kafka),应避免过高的并行度导致网络或磁盘 I/O 的瓶颈。

并行度与容错性

Flink 支持容错机制,当任务失败时,Flink 会根据保存点(checkpoint)进行恢复。高并行度的作业通常会生成更多的 checkpoint 数据,在某些情况下会增加作业恢复时的开销。因此,在设置高并行度时,要同时考虑到 Flink 容错机制可能带来的性能影响。

代码实例

假设有一个作业需要从 Kafka 读取数据,经过 map 转换后将处理结果写入 HDFS。在这种场景下,你可以根据任务的负载和集群资源设置不同算子的并行度:
假设我们有一个 Flink 作业,该作业的任务是:

  • 从 Kafka 读取实时的交易数据流。
  • 对每一条交易数据进行清洗和转换。
  • 将清洗后的数据写入 HDFS 进行存储。
    这个任务需要根据各个操作的特性设置不同的并行度,以实现性能和资源的最佳利用。
java">import org.apache.flink.api.common.serialization.SimpleStringSchema;
import org.apache.flink.streaming.api.datastream.DataStream;
import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment;
import org.apache.flink.streaming.connectors.kafka.FlinkKafkaConsumer;
import org.apache.flink.streaming.connectors.kafka.FlinkKafkaProducer;
import org.apache.flink.streaming.connectors.kafka.KafkaDeserializationSchema;
import org.apache.flink.streaming.connectors.kafka.KafkaSerializationSchema;
import org.apache.flink.streaming.connectors.kafka.KafkaSink;
import org.apache.flink.core.fs.Path;import java.util.Properties;public class FlinkParallelismExample {public static void main(String[] args) throws Exception {// 1. 创建流处理环境StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();// 设置全局并行度(默认并行度)env.setParallelism(8);  // 全局默认并行度为8// 2. 配置 Kafka 消费者Properties kafkaProps = new Properties();kafkaProps.setProperty("bootstrap.servers", "localhost:9092");kafkaProps.setProperty("group.id", "transaction-group");FlinkKafkaConsumer<String> kafkaSource = new FlinkKafkaConsumer<>("transaction-topic", new SimpleStringSchema(), kafkaProps);// 设置 Kafka 源的并行度DataStream<String> transactionStream = env.addSource(kafkaSource).setParallelism(6); // 从 Kafka 读取数据时的并行度为 6// 3. 数据转换操作DataStream<String> cleanedData = transactionStream.map(value -> cleanTransactionData(value)).setParallelism(12); // 数据清洗的并行度为 12// 4. 将清洗后的数据写入 HDFScleanedData.writeAsText("hdfs://namenode:8020/flink/cleaned_transactions/").setParallelism(4);  // 写入 HDFS 的并行度为 4// 5. 启动任务env.execute("Flink Parallelism Example");}// 数据清洗的逻辑public static String cleanTransactionData(String transaction) {// 假设清洗逻辑包括去除不必要的字段,格式化数据等return transaction.trim();  // 简单清洗逻辑示例}
}

代码说明

  • 全局并行度:我们在代码中通过 env.setParallelism(8) 设置了全局的并行度为 8。这意味着,除非显式设置,所有的算子默认都会使用 8 个并行实例运行。
  • Kafka 消费并行度:通过 setParallelism(6) 为从 Kafka 读取数据的操作设置了并行度为 6。也就是说,Flink 将会启动 6 个并行任务来从Kafka 的 transaction-topic 主题中消费数据。这个并行度可以根据 Kafka 分区的数量调整。如果 Kafka 有 6 个分区,那么设置并行度为 6 是合理的,这样可以保证每个分区都有一个并发实例进行处理。
  • 数据转换并行度:数据从 Kafka 读取后,进入 map 操作进行清洗和转换。这里的并行度被设置为 12(setParallelism(12)),即清洗任务将启动 12 个并行实例来同时处理数据。这可以提高数据处理速度,但也需要确保集群中有足够的计算资源支持这个并行度。
  • HDFS 写入并行度:在数据清洗完成后,将数据写入 HDFS 文件系统。这里我们设置了写入 HDFS 的并行度为 4(setParallelism(4))。这意味着将有 4 个并发任务负责将数据写入到 HDFS。由于 HDFS 的写入通常涉及磁盘 I/O 操作,设置较低的并行度可以避免 I/O 争用。

在这里插入图片描述
在这里插入图片描述

注意

  • 并行度优先级:算计级别 > env级别 > Client 级别 > 系统默认级别
  • 如果Source不可以被并行执行,即使指定了并行度为多个,也不会生效
  • 尽可能的规避算子的并行度的设置,因为并行度的改变会造成Task的重新划分,带来Shuffle问题
  • 推荐使用任务提交的时候动态的指定并行度
  • slot是静态的概念,是指TaskManager具有的并发执行能力:parallelism是动态的概念,是指定程序运行时实际使用的并发能力

http://www.ppmy.cn/news/1525310.html

相关文章

【Python 学习笔记】regex basic

how to write regex pattern in python? In Python, you can write and use regular expressions (regex) using the re module. Here’s a basic overview of how to write and use regex patterns in Python. Steps to Write a Regex Pattern: Import the re module: Thi…

一台手机一个ip地址吗?手机ip地址泄露了怎么办

在数字化时代&#xff0c;‌手机作为我们日常生活中不可或缺的一部分&#xff0c;‌其网络安全性也日益受到关注。‌其中一个常见的疑问便是&#xff1a;‌“一台手机是否对应一个固定的IP地址&#xff1f;‌”实际上&#xff0c;‌情况并非如此简单。‌本文首先解答这一问题&a…

【油猴脚本】tampermonkey 的使用方法,油猴脚本(tampermonkey )编写方法,油猴脚本(tampermonkey )获取脚本的方法

前言&#xff1a;哈喽&#xff0c;大家好&#xff0c;今天给大家分享【油猴脚本】tampermonkey 的使用方法&#xff0c;油猴脚本&#xff08;tampermonkey &#xff09;编写方法&#xff0c;油猴脚本&#xff08;tampermonkey &#xff09;获取脚本的方法&#xff01;并提供具体…

Mysql 的查询过慢如何排查以及优化

1.慢查询: (1).查看慢查询的日志文件有没有打开&#xff1a;show variables like ‘slow_query_log’; (2).因为默认是没有开启的所以一般我们需要手动的去开启&#xff1a;set global slow_query_logon; (3).查看慢查询的时间&#xff1a;show variables like ‘…

Flask中的会话(Session)

在Flask中&#xff0c;会话&#xff08;Session&#xff09;是一种重要的机制&#xff0c;用于在不同请求之间存储和传输用户数据&#xff0c;从而允许应用程序在用户与服务器之间的多次交互中保持状态。以下是Flask中会话&#xff08;Session&#xff09;工作原理的详细阐述&a…

车辆检测与分类系统源码分享

车辆检测与分类检测系统源码分享 [一条龙教学YOLOV8标注好的数据集一键训练_70全套改进创新点发刊_Web前端展示] 1.研究背景与意义 项目参考AAAI Association for the Advancement of Artificial Intelligence 项目来源AACV Association for the Advancement of Computer V…

HarmonyOS 实现自定义启动页

&#x1f468;&#x1f3fb;‍&#x1f4bb; 热爱摄影的程序员 &#x1f468;&#x1f3fb;‍&#x1f3a8; 喜欢编码的设计师 &#x1f9d5;&#x1f3fb; 擅长设计的剪辑师 &#x1f9d1;&#x1f3fb;‍&#x1f3eb; 一位高冷无情的全栈工程师 欢迎分享 / 收藏 / 赞 / 在看…

EP10 全局渐变背景色

文件路径&#xff1a; E:/homework/uniappv3tswallpaper/common/style/common-style.scss view,swiper,swiper-item{box-sizing: border-box; } .pageBg{background: linear-gradient(to bottom,rgba(0,0,0,0.2),white 35%),linear-gradient(to right,#A6E3D7 30%,#FFE1F2);mi…

走进低代码报表开发(二):高效报表设计新利器

在前面的文章中&#xff0c;我们已经详细介绍了勤研低代码开发平台的报表数据源可视化设计&#xff0c;接下来&#xff0c;让我们一起来继续了解勤研低代码平台的报表设计&#xff0c;在当今数字化快速发展的时代&#xff0c;高效便捷的开发工具对于企业和开发者来说至关重要。…

WLS2(ubuntu22.04)使用windows2的代理上网

1. 在wls2中&#xff0c;vim /etc/profile&#xff0c;添加如下配置后&#xff0c;source /etc/profile export hostip127.0.0.1 export socks_hostport10800 export http_hostport10800 alias proxy export https_proxy"https://${hostip}:${http_hostport}" …

【C++算法】分治——归并

排序数组 题目链接 排序数组https://leetcode.cn/problems/sort-an-array/description/ 算法原理 代码步骤 class Solution {vector<int> tmp; public:vector<int> sortArray(vector<int>& nums) {tmp.resize(nums.size());merge(nums, 0, nums.size…

【Vue】- Vue表达式

文章目录 知识回顾前言Vue项目介绍 源码分析1. 项目结构介绍&#xff08;单页面应用程序&#xff09;2. 项目运行流程图(单页面应用程序)3. 选项式和组合式api4. 插值表达式 {{}} 胡子语法5. reactive函数6. ref表达式 拓展知识reactive和ref的选择 总结 知识回顾 前言 Vue项…

Java操作Miscrosoft Office各类文件格式的开源免费工具库

Aspose.Words库 是一个商业Java库&#xff0c;还封装了常用的word、pdf、防伪码、水印等诸多功能。Apache 库需要注意的前置问题 问题1&#xff1a;Word的两个格式doc和docx&#xff0c;POI并没有提供统一的处理类。分别用 HWPFDocument 处理doc文档&#xff0c;用 XWPFTempl…

CNN中的conv

在神经网络中&#xff0c;conv1 通常指的是一个卷积层&#xff08;Convolutional Layer&#xff09;&#xff0c;它是卷积神经网络&#xff08;Convolutional Neural Network, CNN&#xff09;中的基本构建块之一。conv1 通常指网络的第一个卷积层&#xff0c;它负责从输入数据…

Frida在安卓逆向中的使用

Frida 是一个强大的动态分析工具,广泛用于逆向工程、调试和安全测试。它允许用户在运行时注入 JavaScript 代码,以拦截和修改应用程序的行为。以下是 Frida 的使用指南,包括安装、基本操作以及一些示例。 安装 Frida 1. 安装 Python 和 pip 确保你已经安装了 Python 和 p…

差分约束---将不等式转换为图的算法

概念&#xff1a;已知一个差分约束系统&#xff08;差分约束系统即一种特殊的n元一次不等式组&#xff09;&#xff0c;形如,要求求出是否存在一组解使得所有约束条件满足。由于在最短路中与该不等式形式相似&#xff0c;因此&#xff0c;可以利用图论&#xff0c;从对应的j点连…

pdf文件转图片,base64或保存到本地

pdf转图片&#xff0c;需要引入pdfbox依赖 <dependency><groupId>org.apache.pdfbox</groupId><artifactId>pdfbox</artifactId><version>2.0.27</version> </dependency>RequestMapping("pdfToImg") public void …

【限流算法】常见的限流算法有哪些,怎么做限流操作

【限流算法】常见的限流算法有哪些&#xff0c;怎么做限流操作 在Java应用中实现限流&#xff08;Rate Limiting&#xff09;通常是为了控制对资源或服务的访问速率&#xff0c;防止因过载而导致的服务不可用。Java中实现限流的方法有多种&#xff0c;以下是一些常见的方法&…

Python数据攻略-Numpy进行集合运算与去重操作

在数据处理与分析的过程中&#xff0c;集合运算与去重操作是非常重要的部分&#xff0c;特别是在处理大量重复数据时&#xff0c;能够有效提升数据处理的效率。集合逻辑是集合论的基础&#xff0c;它包含一些基本操作如交集、并集、差集和补集&#xff0c;这些操作在实际编程中…

Python世界:力扣29题两数相除算法实践

Python世界&#xff1a;力扣29题两数相除算法实践[ 任务背景实现思路模拟思路编码实现 本文小结 任务背景 本问题来自于力扣29题&#xff0c;在做完大数相乘后&#xff0c;顺带也看下两数相除。 给定两个整数&#xff0c;被除数dividend和除数divisor。将两数相除&#xff0c;…