Flink系列文档-(YY08)-Flink核心概念

news2024/12/23 12:44:40

 1 核心概念

1.1 基础概念

  1. 用户通过算子api所开发的代码,会被flink任务提交客户端解析成jobGraph
  2. 然后,jobGraph提交到集群JobManager,转化成ExecutionGraph(并行化后的执行图)
  3. 然后,ExecutionGraph中的各个task会以多并行实例(subTask)部署到taskmanager上执行
  4. subTask运行的位置是taskmanager所提供的槽位(task slot),槽位简单理解就是线程;

  重要提示

  1. 一个算子的逻辑,可以封装在一个独立的task中(可以有多个运行时实例:subTask);
  2. 也可把多个算子的逻辑chain在一起后封装在一个独立的task中(可以有多个运行时实例:subTask);

同一个task的不同运行实例,必须放在不同的task slot上运行;

同一个task slot,可以运行多个不同task的各一个并行实例;

1.2 task与算子链(operator chain)

  上下游算子,能否chain在一起,放在一个Task中,取决于如下3个条件:

  1. 上下游算子实例间是oneToOne数据传输(forward);
  2. 上下游算子并行度相同;
  3. 上下游算子属于相同的slotSharingGroup(槽位共享组);

3个条件都满足,才能合并为一个task;否则不能合并成一个task;

当然,即使满足上述3个条件,也不一定就非要把上下游算子绑定成算子链;

flink提供了相关的api,来让用户可以根据自己的需求,进行灵活的算子链合并或拆分;

  1. setParallelism   设置算子的并行度
  2. slotSharingGroup   设置算子的槽位共享组
  3. disableChaining    对算子禁用前后链合并
  4. startNewChain    对算子开启新链(即禁用算子前链合并)

单个并行演示

package com.blok2;

import org.apache.flink.configuration.Configuration;
import org.apache.flink.streaming.api.datastream.DataStreamSource;
import org.apache.flink.streaming.api.datastream.SingleOutputStreamOperator;
import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment;

/**
 * @Date: 22.11.11
 * @Author: Hang.Nian.YY
 * @qq: 598196583
 * @Tips: 学大数据 ,到多易教育
 * @Description:
 */
public class _01_Task_Chain {
    public static void main(String[] args) throws Exception {
        Configuration conf = new Configuration();
        conf.setInteger("rest.port", 8888);
        StreamExecutionEnvironment see = StreamExecutionEnvironment.createLocalEnvironmentWithWebUI(conf);
        see.setParallelism(1);
        //1  加载数据流
        DataStreamSource<String> ds = see.socketTextStream("linux01", 50820);
        System.out.println(ds.getParallelism());  //打印数据流的并行度
        //2 处理每条数据流
        SingleOutputStreamOperator<String> ds2 = ds.map(line -> line.toUpperCase());
        System.out.println(ds2.getParallelism());  //打印数据流的并行度
         //3  处理每条数据流
        SingleOutputStreamOperator<String> ds3 = ds2.map(line -> "YY-" + line + "-YY");
        ds3.print("结果数据流: ")  ;
        see.execute("路虽远行则将至");
    }
}

禁用自动算子链

//1  加载数据流
DataStreamSource<String> ds = see.socketTextStream("linux01", 50820);
ds.disableChaining() ;
//2 处理每条数据流
SingleOutputStreamOperator<String> ds2 = ds.map(line -> line.toUpperCase());
ds2.disableChaining() ;
 //3  处理每条数据流
SingleOutputStreamOperator<String> ds3 = ds2.map(line -> "YY-" + line + "-YY");
ds3.print("结果数据流: ")  ;

 前后subTask并行度不同

see.setParallelism(1);
//1  加载数据流
DataStreamSource<String> ds = see.socketTextStream("linux01", 50820);

//2 处理每条数据流
SingleOutputStreamOperator<String> ds2 = ds.map(line -> line.toUpperCase());
ds2.setParallelism(2) ;
 //3  处理每条数据流
SingleOutputStreamOperator<String> ds3 = ds2.map(line -> "YY-" + line + "-YY");
ds3.print("结果数据流: ")  ;
see.execute("路虽远行则将至");

 自动taskchain合并, 可以手动指定阶段taskchain

see.setParallelism(1);
//1  加载数据流
DataStreamSource<String> ds = see.socketTextStream("linux01", 50820);
//2 处理每条数据流
SingleOutputStreamOperator<String> ds2 = ds.map(line -> line.toUpperCase());
ds2.startNewChain() ;
 //3  处理每条数据流
SingleOutputStreamOperator<String> ds3 = ds2.map(line -> "YY-" + line + "-YY");
ds3.print("结果数据流: ")  ;
see.execute("路虽远行则将至");

 设置算子槽位共享组

see.setParallelism(1);
/**
 * ds ds2  ds3 默认在同一个算子槽位共享组  自动合并taskchain
 * 三个source设置同一个算子槽位共享组  自动合并taskchain
 * ds2.slotSharingGroup("a") ;
 *
 * 三个source设置不同算子槽位共享组  自动合并taskchain
 */
//1  加载数据流
DataStreamSource<String> ds = see.socketTextStream("linux01", 50820);
ds.slotSharingGroup("a") ;
//2 处理每条数据流
SingleOutputStreamOperator<String> ds2 = ds.map(line -> line.toUpperCase());
ds2.slotSharingGroup("b") ;
 //3  处理每条数据流
SingleOutputStreamOperator<String> ds3 = ds2.map(line -> "YY-" + line + "-YY");
ds3.slotSharingGroup("a") ;

ds3.print("结果数据流: ")  ;
see.execute("路虽远行则将至");

1.3 分区算子

  分区算子:用于指定上游task的各并行subtask与下游task的subtask之间如何传输数据;

Flink中,对于上下游subTask之间的数据传输控制,由ChannelSelector策略来控制,而且Flink内针对各种场景,开发了众多ChannelSelector的具体实现

   设置数据传输策略时,不需要显式指定partitioner,而是调用封装好的算子即可

 默认情况下,flink会优先使用REBALANCE分发策略

/**
 * @Date: 22.11.12
 * @Author: Hang.Nian.YY
 * @qq: 598196583
 * @Tips: 学大数据 ,到多易教育
 * @Description:
 */
public class _02_Partition {
    public static void main(String[] args) throws Exception {
        Configuration conf = new Configuration();
        conf.setInteger("rest.port", 8888);
        StreamExecutionEnvironment see = StreamExecutionEnvironment.createLocalEnvironmentWithWebUI(conf);

        //1  加载数据流
        DataStreamSource<String> ds = see.socketTextStream("doitedu01", 50820);
        //2 处理每条数据流
        SingleOutputStreamOperator<String> ds2 = ds.map(line -> line.toUpperCase())
                .setParallelism(2)
                //指定上游到下游分发数据的规则
                .shuffle()
                .map(line -> "YY-" + line + "-YY")
                .setParallelism(3);
        ds2.print("结果数据流: ");
        see.execute("路虽远行则将至");
        
    }
}

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/5164.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

日志冲突怎么解决?slf4j和log4j的区别?看完这一篇,这些都是小意思啦

文章目录一.你的烦恼二.前置知识介绍三.说一说让你头大的各种日志依赖1.Slf4j的核心依赖2.log4j的jar包依赖3.slf4j对于log4j的桥接包的依赖4.log4j对于slf4j的逆转包四.再举一些常见小例子使用slf4j作为门面,log4j作为实现需要引入的依赖使用slf4j作为门面,logback作为实现需要…

[ Linux ] 重定向的再理解,以及文件系统的理解、inode和软硬链接

在上篇文章我们了解了Linux中文件描述符和重定向以及缓冲区的理解&#xff0c;本篇文章我们要对了解一下重定向的再理解、文件系统以及引出inode的意义和软硬链接。 目录 0.重定向 0.1标准输出 标准错误 为什么perror2后面跟了一个success 1.inode 1.1 inode理解 一个in…

一文吃透JavaScript中的DOM知识及用法

文章目录一、前言二、DOM框架三、认识DOM节点四、JS访问DOM1、获取节点2、改变 HTML3、改变 CSS4、检测节点类型5、操作节点间的父子及兄弟关系6、操作节点属性7、创建和操作节点五、快速投票一、前言 DOM&#xff1a;Document Object Model&#xff08;文档对象模型&#xff0…

指针的进阶应用之双指针、三指针

在牛客网和leetcode等网站刷题的过程中&#xff0c;时常会遇到一些使用双指针和三指针解决问题的实例。今天&#xff0c;我来介绍这两种方法&#xff0c;相信你会对指针的应用会提高一个档次。 目录移除元素删除有序数组中的重复项合并两个有序数组在下面的讲解的过程中&#x…

初步认识系统调用

目录前言一、什么是进程&#xff1f;1、进程与程序的区别&#xff1f;2、什么是进程的控制块二、什么是系统调用&#xff1f;三、认识几个比较简单的系统调用接口1、查看进程2、获取进程的pid/ppid(1).getpid/getppid(2)getpid/getppid的使用3、创建进程的方法总结前言 之前我们…

Redis系列:Redis持久化机制与Redis事务

Redis 是个基于内存的数据库。那服务一旦宕机&#xff0c;内存中数据必将全部丢失。所以丢失数据的恢复对于 Redis 是十分重要的&#xff0c;我们首先想到是可以从数据库中恢复&#xff0c;但是在由 Redis 宕机时&#xff08;说明相关工作正在运行&#xff09;且数据量很大情况…

LeetCode刷题记录01

1704判断字符串的两半是否相似序题目我的思路我的代码提交结果其他解简述思路提交结果总结序 我的日常碎碎念&#xff1a;今天下班在看综艺&#xff0c;看到群里班长开了个会议&#xff0c;于是决定开始学习&#xff0c;他说今天的每日一题好简单&#xff0c;让我也去刷一下。嗯…

数组的定义与使用

文章目录数组的基本概念为什么要使用数组什么是数组数组的创建及初始化数组的创建数组的初始化数组的使用数组中元素的访问遍历数组数组是引用类型基本数据类型与引用类型变量的区别认识null数组的应用场景保存数据作为函数的参数参数传基本数据类型参数传数组类型作为函数的返…

TFN T6300A 网络综合测试仪 以太网数据 千兆以太网测试仪 OTDR E1 PRI V.35/V.24 光功率计一体机

一款功能强大、便携式、方便使用、价格便宜的高性价比手持式以太网测试仪是企业中网络管理和维护人员的刚需仪器。好的以太网测试仪可以帮助工作人员迅速解决网络不通、网速慢、丢包、延迟等问题。 当今以太网测试仪市场参差不齐&#xff0c;说的功能一个比一个强&#xff0c;…

你的第一个基于Vivado的FPGA开发流程实践——二选一多路器

你的第一个基于Vivado的FPGA开发流程实践——二选一多路器 1 原理图 2 开发流程 首先我们先打开安装好的Vivado软件 创建一个文件 选择你的开发板 创建一个源文件 现在我们就可以根据原理使用Verilog代码实验这个功能了 module mux2( //端口列表a,b,sel,out);//交代端口类…

RabbitMQ第二个实操小案例——WorkQueue

文章目录RabbitMQ第二个实操小案例——WorkQueueRabbitMQ第二个实操小案例——WorkQueue 讲第二个案例之前&#xff0c;我们先看下前面第一个案例的模型&#xff1a; 可以看到&#xff0c;我们只有一个发布者和一个消费者&#xff0c;通过Queue队列&#xff0c;实现最简单的消…

02 【nodejs开发环境安装】

02 【nodejs开发环境安装】 1.版本介绍 在命令窗口中输入 node -v 可以查看版本0.x 完全不技术 ES64.x 部分支持 ES6 特性5.x 部分支持ES6特性&#xff08;比4.x多些&#xff09;&#xff0c;属于过渡产品&#xff0c;现在来说应该没有什么理由去用这个了6.x 支持98%的 ES6 特…

e智团队实验室项目-第三周-经典的卷积神经网络的学习

e智团队实验室项目-第三周-卷积神经网络的学习 赵雅玲 *, 张钊* , 李锦玉&#xff0c;迟梦瑶&#xff0c;贾小云&#xff0c;赵尉&#xff0c;潘玉&#xff0c;刘立赛&#xff0c;祝大双&#xff0c;李月&#xff0c;曹海艳&#xff0c; (淮北师范大学计算机科学与技术学院&am…

【树莓派不吃灰】基础篇⑱ 从0到1搭建docker环境,顺便安装一下emqx MQTT Broker、HomeAssistant、portainer

目录1. 前言2. 搭建docker环境3. docker简介3.1 docker解决什么问题&#xff1f;3.2 docker VS vm虚拟机3.2.1 vm虚拟机3.2.2 docker3.3 docker如何解决问题&#xff1f;3.4 docker运行架构3.4.1 镜像 : image3.4.2 容器 : container3.4.3 仓库 : repository3.5 国内镜像加速3.…

python easygui怎么修改默认按钮名字

1.执行以下代码找到easygui安装位置 import easyguiprint(easygui.__file__)2.打开上述路径下boxes文件夹下需要修改的组件 如此时想要修改选项栏的默认按钮名字 则打开choice_box.py文件 执行如下图 可以看到有Cancel、SelectALL、ClearALL、OK四个默认按钮&#xff0c;可否…

Linux下动静态库的制作与使用

学习导航一、关于动静态库的基本认识二、设计库的工程师角度(1)制作静态库(2)制作动态库二、使用库的用户角度(1)使用静态库(2)使用动态库三、理解的角度一、关于动静态库的基本认识 1.静态库 静态库以 .a 作为文件后缀程序在编译链接的时候&#xff0c;将静态库的代码拷贝到…

[TCP/IP] Linux 搭建服务器局域网

文章目录[TCP/IP] Linux 搭建服务器局域网1. 使用python内置库http.server2. 使用Http-Server[TCP/IP] Linux 搭建服务器局域网 1. 使用python内置库http.server python3: http.server 命令行启动&#xff1a; # python 3 python -m http.server 8000 # python 2 python -m S…

ZYNQ_FPGA_SPI通信协议多种实现方式

文章目录PLPSSPIGPIOAXI-GPIOAXI-Quad-SPI&#xff08;待测试&#xff09;本文记录一下在使用AD9363中的SPI通信问题&#xff0c;同时针对在ZYNQ系列开发板上实现SPI的方法做一个总结。ZYNQ系列包含了PL端和PS端&#xff0c;因为本科阶段有一定的ARM的开发经验&#xff0c;便想…

2022年,软件测试已经不吃香了吗?

最近因为疫情等各种原因&#xff0c;大厂裁员&#xff0c;失业等等频频受到关注。 不解释&#xff0c;确实存在&#xff0c;各行各业都很难&#xff0c;但是&#xff0c;说软件测试行业不吃香&#xff0c;我还真不认同&#xff08;不是为培训机构说好话&#xff0c;大环境不好…

JVM从入门到入魔,这份JVM必知必会的完整版带你彻底玩懂JVM

市面上各类 JVM 相关的资料虽多如牛毛&#xff0c;但是明显都很难让大家系统性地学明白&#xff0c;同时一线大厂技术面试现在 JVM 知识也是必考科目。 在大厂摸爬滚打 10 多年的 Java 高级技术专家全面梳理了系统化学习 JVM 的知识和经验&#xff0c;从入门到入魔&#xff0c…