Flink开发环境搭建与提交运行Flink应用程序

news2024/11/17 1:57:50

Flink开发环境搭建与提交运行Flink应用程序

  • Flink
    • 概述
    • 环境
  • Flink程序开发
    • 项目构建
    • 添加依赖
    • 安装Netcat
    • 实现经典的词频统计
      • 批处理示例
      • 流处理示例
    • Flink Web UI
  • 命令行提交作业
    • 编写Flink程序
    • 打包
    • 上传Jar
    • 提交作业
    • 查看任务
    • 测试
  • Web UI提交作业
    • 提交作业
    • 测试

Flink

概述

Apache Flink 是一个框架和分布式处理引擎,用于在无边界和有边界数据流上进行有状态的计算。Flink 能在所有常见集群环境中运行,并能以内存速度和任意规模进行计算。

在这里插入图片描述
官网:https://flink.apache.org/

GitHub: https://github.com/apache/flink

环境

Flink分别提供了基于Java语言和Scala语言的 API ,如果想要使用Scala语言来开发Flink程序,可以通过在IDEA中安装Scala插件来提供语法提示,代码高亮等功能。

推荐使用Java来作为开发语言,Maven 作为编译和包管理工具进行项目构建和编译。

Flink程序开发

项目构建

1.基于 Maven Archetype 构建

根据交互信息的提示,依次输入 groupId , artifactId 以及包名等信息后等待初始化的完

mvn archetype:generate
-DarchetypeGroupId=org.apache.flink
-DarchetypeArtifactId=flink-quickstart-java 
-DarchetypeVersion=1.17.0

2.使用官方脚本快速构建

官方提供了快速构建脚本,在Linux系统终端,直接通过以下命令来进行调用:

curl https://flink.apache.org/q/quickstart.sh | bash -s 1.17.0

3.使用 IDEA 构建

使用 IDEA开发工具,直接在项目创建页面选择 Maven Flink Archetype 进行项目初始化:

在这里插入图片描述

可以配置一个Flink Archetype,指定groupId 、 artifactId、version。这样就会自动引入pom.xml相关依赖与批处理、流处理demo例子,否则需要手动添加依赖。

在这里插入图片描述

添加依赖

使用使用IDEA 、普通Archetype构建,需要进行添加相关依赖

		<dependency>
            <groupId>org.apache.flink</groupId>
            <artifactId>flink-java</artifactId>
            <version>1.17.0</version>
        </dependency>

        <dependency>
            <groupId>org.apache.flink</groupId>
            <artifactId>flink-streaming-java</artifactId>
            <version>1.17.0</version>
        </dependency>

        <dependency>
            <groupId>org.apache.flink</groupId>
            <artifactId>flink-clients</artifactId>
            <version>1.17.0</version>
        </dependency>

注意:

在打包时,需要将部分依赖的scope标签全部被标识为provided,标记这些依赖不会被打入最终的 JAR 包。

因为Flink的安装包中已经提供了这些依赖,位于其lib目录下,名为flink-dist_*.jar ,它包含了Flink的所有核心类和依赖

安装Netcat

Netcat(又称为NC)是一个计算机网络工具,它可以在两台计算机之间建立 TCP/IP 或 UDP 连接。它被广泛用于测试网络中的端口,发送文件等操作。使用 Netcat 可以轻松地进行网络调试和探测,也可以进行加密连接和远程管理等高级网络操作。因为其功能强大而又简单易用,所以在计算机安全领域也有着广泛的应用。

安装nc命令

yum install -y nc

启动socket端口

[root@node01 bin]# nc -lk 8888

注意:

测试时,先启动端口,后启动程序,否则会报超时连接异常。

实现经典的词频统计

统计一段文本中,每个单词出现的频次。

在项目resources目录下创建words.txt 文件,内容如下:

abc bcd cde 
bcd cde fgh
cde fgh hij

Flink 它可以处理有界的数据集、也可以处理无界的数据集、它可以流式的处理数据、也可以批量的处理数据。

批处理示例

批处理是基于DataSet API操作,对数据的处理转换,可以看作是对数据集的操作,批量的数据集本质上也是流。

public class WordCountBatch {

    public static void main(String[] args) throws Exception {
        // 创建执行环境
        ExecutionEnvironment env = ExecutionEnvironment.getExecutionEnvironment();

        // 获取文件路径
        String path = WordCountBatch.class.getClassLoader().getResource("word.txt").getPath();
        // 从文件中读取数据
        DataSource<String> lineDS = env.readTextFile(path);

        // 切分、转换,例如: (word,1)
        FlatMapOperator<String, Tuple2<String, Integer>> wordAndOne = lineDS.flatMap(new MyFlatMapper());

        // 按word分组 按照第一个位置的word分组
        UnsortedGrouping<Tuple2<String, Integer>> wordAndOneGroupby = wordAndOne.groupBy(0);

        // 分组内聚合统计 将第二个位置上的数据求和
        AggregateOperator<Tuple2<String, Integer>> sum = wordAndOneGroupby.sum(1);

        // 输出
        sum.print();
    }


    /**
     * 自定义MyFlatMapper类,实现FlatMapFunction接口
     * 输出: String 元组Tuple2<String, Integer>>  Tuple2是flink提供的元组类型
     */
    public static class MyFlatMapper implements FlatMapFunction<String, Tuple2<String, Integer>> {
        @Override
        //value是输入,out就是输出的数据
        public void flatMap(String value, Collector<Tuple2<String, Integer>> out) throws Exception {
            // 按空格切分单词
            String[] words = value.split(" ");
            // 遍历所有word,包成二元组输出 将单词转换为 (word,1)
            for (String word : words) {
                Tuple2<String, Integer> wordTuple2 = Tuple2.of(word, 1);
                //  使用Collector向下游发送数据
                out.collect(wordTuple2);
            }
        }
    }
}

本机不需要配置其他任何的 Flink 环境,直接运行 Main 方法即可

输出结果:

(bcd,2)
(cde,3)
(abc,1)
(hij,1)
(fgh,2)

流处理示例

DataSet API是基于批处理的API,从Flink 1.12开始,官方推荐使用DataStream API,它是流批统一处理的API

对于Flink而言,流才是整个处理逻辑的底层核心,所以流批统一之后的DataStream API
更加强大,可以直接处理批处理和流处理的所有场景。

1.有界流之读取文件

    public static void main(String[] args) throws Exception {
        // 创建执行环境
        StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();

        // 从项目根目录下的data目录下的word.txt文件中读取数据
        DataStreamSource<String> source = env.readTextFile("data/word.txt");

        // 处理数据: 切分、转换
        SingleOutputStreamOperator<Tuple2<String, Integer>> wordAndOneDS = source
                .flatMap(new FlatMapFunction<String, Tuple2<String, Integer>>() {
                    @Override
                    public void flatMap(String value, Collector<Tuple2<String, Integer>> out) throws Exception {
                        // 按空格切分
                        String[] words = value.split(" ");
                        for (String word : words) {
                            // 转换成二元组 (word,1)
                            Tuple2<String, Integer> wordsAndOne = Tuple2.of(word, 1);
                            // 通过采集器向下游发送数据
                            out.collect(wordsAndOne);
                        }
                    }
                });

        // 处理数据:分组
        KeyedStream<Tuple2<String, Integer>, String> wordAndOneKS = wordAndOneDS.keyBy(
                new KeySelector<Tuple2<String, Integer>, String>() {
                    @Override
                    public String getKey(Tuple2<String, Integer> value) throws Exception {
                        return value.f0;
                    }
                }
        );
        // 处理数据:聚合
        SingleOutputStreamOperator<Tuple2<String, Integer>> sumDS = wordAndOneKS.sum(1);

        // 输出数据
        sumDS.print();

        // 执行
        env.execute();
    }

输出结果如下:

10> (bcd,1)
10> (cde,1)
10> (cde,2)
3> (fgh,1)
3> (fgh,2)
11> (abc,1)
10> (bcd,2)
10> (cde,3)
8> (hij,1)

注意:

1.前面编号:并行度,与电脑线程数相关

2.(cde,1)、(cde,2)、(cde,3):切分、转换、分组、聚合,是有状态的计算

2.无界流之读取socket文本流

在实际的生产环境中,真正的数据流其实是无界的,有开始却没有结束,这就需要持续地处理捕获的数据。为了模拟这种场景,可以监听socket端口,然后向该端口不断的发送数据。

Flink的流处理是事件驱动的,当前程序会一直处于监听状态,只有接收到数据才会执行任务、输出统计结果。

DataStream API支持从Socket套接字读取数据。只需要指定要从其中读取数据的主机和端口号即可。

    public static void main(String[] args) throws Exception {
        // 创建执行环境
        StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
        // 指定并行度,默认电脑线程数
        env.setParallelism(3);
        // 读取数据socket文本流 指定监听 IP 端口 只有在接收到数据才会执行任务
        DataStreamSource<String> socketDS = env.socketTextStream("IP", 8080);

        // 处理数据: 切换、转换、分组、聚合 得到统计结果
        SingleOutputStreamOperator<Tuple2<String, Integer>> sum = socketDS
                .flatMap(
                        (String value, Collector<Tuple2<String, Integer>> out) -> {
                            String[] words = value.split(" ");
                            for (String word : words) {
                                out.collect(Tuple2.of(word, 1));
                            }
                        }
                )
                .setParallelism(2)
                // // 显式地提供类型信息:对于flatMap传入Lambda表达式,系统只能推断出返回的是Tuple2类型,而无法得到Tuple2<String, Long>。只有显式设置系统当前返回类型,才能正确解析出完整数据
                .returns(new TypeHint<Tuple2<String, Integer>>() {
                })
//                .returns(Types.TUPLE(Types.STRING,Types.INT))
                .keyBy(value -> value.f0)
                .sum(1);


        // 输出
        sum.print();

        // 执行
        env.execute();
    }

注意:

Flink具有一个类型提取系统,可以分析函数的输入和返回类型,自动获取类型信息,从而获得对应的序列化器和反序列化器。

但是,由于Java中泛型擦除的存在,在某些特殊情况下(如Lambda表达式中),自动提取的信息是不够准确的。因此,就需要显式地提供类型信息,才能使应用程序正常工作或提高其性能。

执行以下命令,发送测试数据

[root@master ~]# nc -l 8080
abc bcd cde
bcd cde fgh
cde fgh hij

输出结果内容

3> (abc,1)
3> (bcd,1)
3> (cde,1)
1> (fgh,1)
3> (bcd,2)
3> (cde,2)
1> (fgh,2)
2> (hij,1)
3> (cde,3)

Flink Web UI

在本地开发环境中,可以添加flink-runtime-web依赖,启动Flink Web UI界面,方便开发测试使用 。

添加flink-runtime-web依赖

<dependency>
    <groupId>org.apache.flink</groupId>
    <artifactId>flink-runtime-web</artifactId>
    <version>1.17.0</version>
    <scope>provided</scope>
</dependency>
 /**
     * 并行度优先级:算子 > 全局env > 提交指定 > 配置文件
     * @param args
     * @throws Exception
     */
    public static void main(String[] args) throws Exception {
         // 本地模式
        Configuration conf = new Configuration();
        // 指定端口
        conf.setString(RestOptions.BIND_PORT, "7777");
        //  创建执行环境
        StreamExecutionEnvironment env = StreamExecutionEnvironment.createLocalEnvironmentWithWebUI(conf);
        // 全局指定并行度,默认是电脑的线程数
        env.setParallelism(2);

        // 读取socket文本流
        DataStreamSource<String> socketDS = env.socketTextStream("node01", 8888);

        //  处理数据: 切割、转换、分组、聚合 得到统计结果
        SingleOutputStreamOperator<Tuple2<String, Integer>> sum = socketDS
                .flatMap(
                        (String value, Collector<Tuple2<String, Integer>> out) -> {
                            String[] words = value.split(" ");
                            for (String word : words) {
                                out.collect(Tuple2.of(word, 1));
                            }
                        }
                )
                // 局部设置算子并行度
                .setParallelism(3)
                .returns(Types.TUPLE(Types.STRING, Types.INT))
                .keyBy(value -> value.f0)
                .sum(1)
                // 局部设置算子并行度
                .setParallelism(4);

        //  输出
        sum.print();

        //  执行
        env.execute();
    }

启动Netcat

[root@node01 ~]# nc -l 8888

启动Flink程序,访问:http://localhost:7777/

若出现如下提示,需要在pom.xml中将依赖flink-runtime-web的指定<scope>provided</scope>作用域标签去掉

在这里插入图片描述
注释后再次启动项目,访问:http://localhost:7777/

在这里插入图片描述
查看任务执行详情,可以看出开发Flink应用程序时指定的并发度与此执行流程图上的并发度一致。
在这里插入图片描述

命令行提交作业

编写Flink程序

编写一个读取socket发送单词并统计单词个数的程序

    public static void main(String[] args) throws Exception {
        // 创建执行环境
        StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
        // 指定并行度,默认电脑线程数
        env.setParallelism(3);
        // 读取数据socket文本流 指定监听 IP 端口 只有在接收到数据才会执行任务
        DataStreamSource<String> socketDS = env.socketTextStream("IP", 8080);

        // 处理数据: 切换、转换、分组、聚合 得到统计结果
        SingleOutputStreamOperator<Tuple2<String, Integer>> sum = socketDS
                .flatMap(
                        (String value, Collector<Tuple2<String, Integer>> out) -> {
                            String[] words = value.split(" ");
                            for (String word : words) {
                                out.collect(Tuple2.of(word, 1));
                            }
                        }
                )
                .setParallelism(2)
                // // 显式地提供类型信息:对于flatMap传入Lambda表达式,系统只能推断出返回的是Tuple2类型,而无法得到Tuple2<String, Long>。只有显式设置系统当前返回类型,才能正确解析出完整数据
                .returns(new TypeHint<Tuple2<String, Integer>>() {
                })
//                .returns(Types.TUPLE(Types.STRING,Types.INT))
                .keyBy(value -> value.f0)
                .sum(1);
        // 输出
        sum.print();
        // 执行
        env.execute();
    }

打包

在项目pom.xml文件添加打包插件配置

<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-shade-plugin</artifactId>
            <version>3.2.4</version>
            <executions>
                <execution>
                    <phase>package</phase>
                    <goals>
                        <goal>shade</goal>
                    </goals>
                    <configuration>
                        <artifactSet>
                            <excludes>
                                <exclude>com.google.code.findbugs:jsr305</exclude>
                            </excludes>
                        </artifactSet>
                        <filters>
                            <filter>
                                <!-- Do not copy the signatures in the META-INF folder.
                                Otherwise, this might cause SecurityExceptions when using the JAR. -->
                                <artifact>*:*</artifact>
                                <excludes>
                                    <exclude>META-INF/*.SF</exclude>
                                    <exclude>META-INF/*.DSA</exclude>
                                    <exclude>META-INF/*.RSA</exclude>
                                </excludes>
                            </filter>
                        </filters>
                        <transformers>
                            <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
                                <!-- Replace this with the main class of your job -->
                                <mainClass>my.programs.main.clazz</mainClass>
                            </transformer>
                            <transformer implementation="org.apache.maven.plugins.shade.resource.ServicesResourceTransformer"/>
                        </transformers>
                    </configuration>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>

注意:

Flink集群内部依赖实则包含了Flink相关依赖,在打包Flink应用程序时,可以在pom.mxl中指定Flink相关依赖作用域。

1.使用内置在Flink集群内部依赖

# 作用在编译和测试时,同时没有传递性
# 项目打包发布,不包含该依赖
<scope>provided</scope>

2.不使用内置在Flink集群内部依赖

# 使用默认作用域,即scope标签可省略
# 作用在所有阶段,会传递到依赖项目中,项目打包发布,含该依赖
<scope>compile</scope>

上传Jar

将编写好的Flink程序打包后上传到服务器的/root目录

提交作业

进入到flink的bin目录,使用flink run命令提交作业

[root@node01 flink]# ./bin/flink run -m node01:8081 -c cn.ybzy.demo.WordCountStreamUnboundedDemo demo-1.0-SNAPSHOT.jar 
Job has been submitted with JobID 33a87b974d19880887ffe9b34efc8ac8
-m:指定提交到的JobManager

-c:指定入口类

查看任务

浏览器中打开Web UI,访问http://node01:8081查看任务

在这里插入图片描述
点击任务查询详情
在这里插入图片描述

测试

在socket端口,发送测试数据

[root@node01 bin]# nc -lk 8888
abc bcd cdf

在TaskManagers列表中寻找执行节点,并查看执行日志。

这里很明显node01节点有数据接收,故应该查看它,否则应该在其他TaskManager节点查看

在这里插入图片描述
在TaskManager的标准输出(Stdout)看到对应的统计结果。
在这里插入图片描述

Web UI提交作业

除了通过命令行提交任务之外,也可以直接通过WEB UI界面提交任务。

提交作业

打开Flink的WEB UI页面,选择上传运行的JAR 包

在这里插入图片描述
JAR包上传完成

在这里插入图片描述
点击该 JAR 包,出现任务配置页面,进行相应配置。

配置程序入口主类的全类名,任务运行的并行度,任务运行所需的配置参数和保存点路径等

在这里插入图片描述
配置完成后,即可点击按钮“Submit”,将任务提交到集群运行,默认显示任务运行的具体情况
在这里插入图片描述

测试

在socket端口,发送测试数据

[root@node01 bin]# nc -lk 8888
abc bcd cdf

在TaskManagers列表中寻找执行节点,并查看执行日志。

这里很明显node02节点有数据接收,故应该查看它,否则应该在其他TaskManager节点查看

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

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

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

相关文章

解决Opencv dnn模块无法使用onnx模型的问题(将onnx的动态输入改成静态)

一、问题来源 最近做人脸识别项目&#xff0c;想只用OpenCV自带的人脸检测和识别模块实现&#xff0c;使用OpenCV传统方法&#xff1a;Haar级联分类器人脸检测LBPH算法人脸识别的教程已经有了&#xff0c;于是想着用OpenCV中的dnn模块来实现&#xff0c;dnn实现人脸检测也有&a…

大数据安全 | 【实验】DES加密解密

文章目录 &#x1f4da;DES介绍&#x1f4da;基本流程&#x1f407;初始IP置换和逆置换&#x1f407;计算每一轮的子密钥&#x1f407;迭代与F函数⭐️E扩展置换⭐️S盒压缩⭐️P盒置换⭐️最后的F函数及迭代实现 &#x1f4da;DES加密解密实现&#x1f4da;关于雪崩效应 &…

企业如何实现信息化管理?IT运维管理有什么注意的事项?

随着信息技术的迅猛发展&#xff0c;企业所面临的IT运维管理挑战也日益复杂。在复杂的IT系统中&#xff0c;如何实施有效的运维管理已成为企业信息化部门关注的重点。本文分析了当前的IT运维管理现状以及所遇到的问题&#xff0c;并提出相应的解决方案——“的修”运维工单管理…

点云处理开发测试题目 完整解决方案

点云处理开发测试题目 文件夹中有一个场景的三块点云数据,单位mm。是一个桌子上放了一个纸箱,纸箱上有四个圆孔。需要做的内容是: 1. 绘制出最小外接立方体,得到纸箱的长宽高值。注意高度计算是纸箱平面到桌子平面的距离。 2. 计算出纸箱上的四个圆的圆心坐标和半径,对圆…

活动聊天机器人如何革新活动行业

在如今快节奏的时代&#xff0c;活动策划和管理对于任何活动的成功变得至关重要。无论是会议、展览会还是企业聚会&#xff0c;组织者都努力为参与者创造难忘的体验&#xff0c;同时确保幕后的顺利执行。然而&#xff0c;由于有许多任务需要处理且资源有限&#xff0c;管理活动…

2023年另类数据研究报告

第一章 引言 1.1 定义 另类数据&#xff0c;通常被定义为传统金融报告和宏观经济指标之外的信息&#xff0c;近年来在投资领域中的重要性日益增长。这种数据通常来源于非传统的数据源&#xff0c;例如社交媒体、卫星图像、互联网搜索记录和消费者交易数据等。与传统数据相比…

docker入门加实战—从部署MySQL入门docker

docker入门加实战—从部署MySQL入门docker docker部署MySQL 输入如下命令&#xff1a; docker run -d \--name mysql \-p 3306:3306 \-e TZAsia/Shanghai \-e MYSQL_ROOT_PASSWORD123 \mysql部署成功截图如下&#xff1a; 当执行命令后&#xff0c;Docker做的第一件事情&…

MAX插件CGMAGIC一键解决效果图在软包硬包上费时费力操作!

使用3dmax软件进行室内建模中的软包、硬包、欧式真皮沙发等家具建模这些的操作相对是比较多的&#xff0c;3dmax软包建模来说&#xff0c;进行手动建模一向都是非常头痛和耗时的事情。 CGMAGIC小编来和大家聊聊&#xff0c;如何一键解决效果图在软包硬包上费时费力操作&#xf…

mp4音视频分离技术

文章目录 问题描述一、分离MP3二、分离无声音的MP4三、结果 问题描述 MP4视频想拆分成一个MP3音频和一个无声音的MP4文件 一、分离MP3 ffmpeg -i C:\Users\Administrator\Desktop\一个文件夹\我在财神殿里长跪不起_完整版MV.mp4 -vn C:\Users\Administrator\Desktop\一个文件…

在XShell里Linux服务器创建和删除子用户

文章目录 在XShell里Linux服务器创建和删除子用户1、创建子用户2、删除子用户 在XShell里Linux服务器创建和删除子用户 1、创建子用户 注意&#xff1a;只有root用户下才能创建子用户 步骤&#xff1a; 首先打开XShell登录上root用户&#xff0c;然后输入useradd 要添加的用户…

SpringBoot-黑马程序员-学习笔记(三)

目录 30.springboot整合MyBatis-plus 32.SSM整合 38.MP中的条件查询 小知识&#xff1a;许多放在类前面的注解&#xff0c;比如Mapper,Service都是将该类定义成一个Bean&#xff0c;交给spring管理 39.Service模块 30.springboot整合MyBatis-plus 1.创建普通springboot项目…

简单大方的自我介绍 PPT 格式

自我介绍是展示自己的机会&#xff0c;同时也是展现自信和魅力的重要时刻。通过简单大方的PPT格式&#xff0c;可以更好地展示自己的个性和才华。下面是一些建议&#xff0c;帮助你在自我介绍中展现自信和魅力。 1. 打造简洁而有吸引力的PPT布局&#xff1a; - 选择简洁大方的背…

牛客 day2 - 7

9.25 day 2 1. 简述方法重写与方法重载的意义与区别&#xff1a; 方法重写&#xff1a; 1.参数列表必须完全与被重写方法相同 //参数列表&#xff08;分为四种&#xff09;&#xff1a; &#xff08;1&#xff09;无参无返回值方法&#xff1b; &#xff08;2&#xff0…

视频监控系统EasyCVR如何通过API接口获取国标GB28181协议接入的实时录像?

安防监控视频汇聚平台EasyCVR基于云边端一体化架构&#xff0c;具有强大的数据接入、处理及分发能力&#xff0c;可提供视频监控直播、云端录像、云存储、录像检索与回看、智能告警、平台级联、云台控制、语音对讲、智能分析等功能。平台也提供丰富的API接口供开发者集成、调用…

【吞噬星空4】又魔改,徐欣自杀殉情,变成被阿特金击杀,引发粉丝吐槽

Hello,小伙伴们&#xff0c;我是小郑继续为大家深度解析国漫资讯。 ​ 吞噬星空第四季动画已经更新了&#xff0c;虽然没有什么炸裂的打斗&#xff0c;都是一些过渡性的戏份&#xff0c;但是罗峰成功孕育出了人类分身&#xff0c;阿特金三人组又在为非作歹&#xff0c;这次他…

uCOSIII实时操作系统 四 任务管理

目录 uCOSIII启动过程&#xff1a; stm32的启动过程&#xff1a; uCOSIII的启动过程&#xff1a; 任务状态&#xff1a; 任务控制块&#xff1a; 任务堆栈&#xff1a; 任务就绪表&#xff1a; 优先级位映射表//OSPrioTbl[] 位映射表&#xff1a; 查找优先级&#xf…

GNN+RA 文献阅读

[1] X. Wang et al., ‘Scalable Resource Management for Dynamic MEC: An Unsupervised Link-Output Graph Neural Network Approach’. paper code&#xff1a;GitHub - UNIC-Lab/LOGNN: This is the code for paper "Scalable Resource Management for Dynamic MEC:…

Linux[find命令]-根据路径和条件搜索指定文件并删除

一、find命令简介 find命令&#xff1a;用于根据给定的路径和条件查找相关文件或目录&#xff0c;参数灵活方便&#xff0c;且支持正则表达式&#xff0c;结合管道符后能够实现更加复杂的功能。 基本语法格式&#xff1a;find pathname -options 搜索内容 [其他选项] pathname…

链表(2)——带头双向循环链表

&#x1f341;一、链表的分类 &#x1f315;1.单向或者双向 &#x1f315;2.带头或者不带头&#xff08;有无哨兵&#xff09; &#x1f315;3.循环或者不循环 &#x1f315;4.无头单向非循环链表&#xff08;常用&#xff09; &#x1f315;5.带头双向循环链表&#xff08;常用…

SNMP报文与MIB Browser软件讲解

目录 SNMP报文结构 MIB Browser软件讲解 具体的操作步骤 MIB操作方式 SNMP报文结构 UDP端口读/写为161&#xff0c;Trap为162 版本号 版本号 名称 0 V1 1 V2c 2 V3 团体字 团体字相当于管理方和被管理方进行校验的密钥 读写团体字 两端需要配置为一致 PDU类型——标…