Flink简介及部署模式

文章目录

  • 1、Flink简介
  • 2、Flink部署
    • 2.1 本地模式
    • 2.1 Standalone模式部署
    • 2.2 Standalone模式下的高可用
    • 2.3 Yarn模式
      • Yarn模式的高可用配置:
      • yarn模式中三种子模式的区别:
  • 3、并行度
  • 4、提交命令执行指定任务
    • Application Mode VS yarn per-job
  • 5、注意事项
  • 5、注意事项

1、Flink简介

​ Spark 和 Flink 一开始都都希望能够用同一个技术把流处理和批处理统一起来,但他们走了完全不一样的两条路。前者是以批处理的技术为根本,并尝试在批处理之上支持流计算;后者则认为流计算技术是最基本的,在流计算的基础之上支持批处理。通过Flink和Spark的对比来说:

SparkFlink
流批世界观一切都是由批次组成。离线数据是一个大批次;而实时数据是由一个一个无限的小批次组成的。一切都是由流组成。离线数据是有界限的流;实时数据是一个没有界限的流。
计算模型微批处理模型(秒级),在批处理的基础上做流处理连续流模型(毫秒级),在流的基础上做批处理
驱动时间驱动型:主动拉取数据,(即使没有数据,到达一定时间,也会去计算,浪费资源)事件驱动型:被动拉取数据,(如果没数据的时候什么也不干,节省资源)
checkpoint小文件问题,一个分区一个小文件;重启任务会有很多小任务,浪费资源无小文件问题
exactly once自己实现exactly once保证
窗口灵活的窗口语义,Spark有的都有
吞吐量大于Flink

在这里插入图片描述

2、Flink部署

  • 开发模式(idea)
  • 本地模式(零配置)
  • Standalone模式
  • Yarn模式
    • Session-Cluster
    • Application Mode
    • Per-Job-Cluster

2.1 本地模式

  1. 上传Flink安装包flink-1.13.1-bin-scala_2.12.tgz到节点zyn-node01

  2. 解压

    tar -zxvf flink-1.13.1-bin-scala_2.12.tgz -C /opt/module
    cd /opt/module
    cp -r flink-1.13.1 flink-local
    
  3. 启动Flink集群

    bin/start-cluster.sh
    bin/stop-cluster.sh
    
  4. 在hadoop102启动netcat

    #sudo yum install -y nc
    nc -lk 9999
    
  5. 命令行提交Flink命令

    bin/flink run -m zyn-node01:8081 -c com.sunmi.day01.Flink03_Stream_Unbounded_WordCount /home/hadoop/jars/Flink-202307-1.0-SNAPSHOT-jar-with-dependencies.jar
    
  6. 查看应用执行情况

    http://zyn-node01:8081
    

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

在这里插入图片描述

2.1 Standalone模式部署

  1. 配置文件flink-conf.yaml

    jobmanager.rpc.address: zyn-node01
    
  2. workers、

    zyn-node02
    zyn-node03
    zyn-node04
    zyn-node05
    zyn-node06
    
  3. 分发至其他节点

  4. 启动集群

    bin/start-cluster.sh
    
  5. 提交命令执行任务

    bin/flink run -m zyn-node01:8081 -c com.sunmi.day01.Flink03_Stream_Unbounded_WordCount /home/hadoop/jars/Flink-202307-1.0-SNAPSHOT-jar-with-dependencies.jar 
    
  6. 通过8081端口访问WebUI

一台节点可以同时启动多个TaskManager

启动集群后,再次启动bin/start-cluster.sh,则一台节点会有两个TaskManager,可通过jps查看

2.2 Standalone模式下的高可用

​ 任何时候都有一个主 JobManager和多个备用 JobManagers,以便在主节点失败时有备用 JobManagers 来接管集群。这可以避免单点故障,一旦备 JobManager 接管集群,作业就可以正常运行。主备 JobManager 实例之间没有明显的区别。每个 JobManager都可以充当主备节点。

  1. 修改配置文件flink-conf.yaml

    high-availability: zookeeper
    high-availability.storageDir: hdfs://hadoop102:8020/flink/standalone/ha
    high-availability.zookeeper.quorum: hadoop102:2181,hadoop103:2181,hadoop104:2181
    high-availability.zookeeper.path.root: /flink-standalone
    high-availability.cluster-id: /cluster_hpu
    
  2. masters

    hadoop102:8081
    hadoop103:8081
    
  3. 分发至其他节点

  4. 修改环境变量myenv.sh,并分发source

    export HADOOP_CLASSPATH=`hadoop classpath`
    
  5. 启动flink集群

  6. 先查看通过zookeeper客户端查看哪个是master,然后kill掉master进行测试

    zkCli.sh
    get /flink-standalone/cluster_hpu/leader/rest_server_lock
    

2.3 Yarn模式

独立部署(Standalone)模式由Flink自身提供计算资源,无需其他框架提供资源,这种方式降低了和其他第三方资源框架的耦合性,独立性非常强。但是Flink主要是计算框架,而不是资源调度框架,所以本身提供的资源调度并不是它的强项,所以还是和其他专业的资源调度框架集成更靠谱,所以接下来我们来学习在强大的Yarn环境中Flink是如何使用的。

把Flink应用提交给Yarn的ResourceManager, Yarn的ResourceManager会申请容器从Yarn的NodeManager上面. Flink会创建JobManager和TaskManager在这些容器上.Flink会根据运行在JobManager上的job的需要的slot的数量动态的分配TaskManager资源。

  1. 复制flink-yarn

    cp -r flink-1.13.1 flink-yarn
    
  2. 仅需配置/etc/profile.d/my.sh中配置并分发

    export HADOOP_CLASSPATH=`hadoop classpath`
    
  3. 执行命令提交任务

    bin/flink run -t yarn-per-job -c com.sunmi.day01.Flink03_Stream_Unbounded_WordCount /home/hadoop/jars/Flink-202307-1.0-SNAPSHOT-jar-with-dependencies.jar
    
  4. 通过zyn-node03:8088查看任务

在这里插入图片描述

  1. 进入任务

在这里插入图片描述

  1. Yarn中启动两个Container,其中一个是JobManager一个TaskManager

    在这里插入图片描述

Yarn模式的高可用配置:

Standalone模式中, 同时启动多个Jobmanager, 一个为leader其他为standby的, 当leader挂了, 其他的才会有一个成为leader。

yarn的高可用是同时只启动一个Jobmanager, 当这个Jobmanager挂了之后, yarn会再次启动一个, 其实是利用的yarn的重试次数来实现的高可用。

  1. yarn-site.xml

    <property><name>yarn.resourcemanager.am.max-attempts</name><value>4</value><description>The maximum number of application master execution attempts.</description>
    </property>
    
  2. flink-conf.yaml

    yarn.application-attempts: 3
    high-availability: zookeeper
    high-availability.storageDir: hdfs://hadoop102:8020/flink/yarn/ha
    high-availability.zookeeper.quorum: hadoop102:2181,hadoop103:2181,hadoop104:2181
    high-availability.zookeeper.path.root: /flink-yarn
    
  3. 启动yarn-session

  4. 杀死Jobmanager,查看复活情况

注意: yarn-site.xml中是复活次数的上限, flink-conf.xml中的次数应该小于这个值。

测试过程中会发现一直kill不掉jobManager,是因为除了重试次数这个机制外,还有一个时间的机制(Akka超时时间),如果在一定的时间(这个时间很短)内jobManager重新拉取了几次还是挂掉的话,那就会真正的挂掉。

yarn模式中三种子模式的区别:

  • Session模式:适合需要频繁提交的多个小job,并且执行时间都不长,因为flink会在yarn中启动一个session集群,这个集群主要用来申请资源的,后续提交的其他作业,都会直接提交到这个session集群中,不需要频繁创建flink集群,这样效率会变高,但是,作业之间相互不隔离。

    Session-Cluster模式需要先启动Flink集群,向Yarn申请资源。以后提交任务都向这里提交。这个Flink集群会常驻在yarn集群中,除非手动停止。在向Flink集群提交Job的时候, 如果资源被用完了,则新的Job不能正常提交。

    缺点: 如果提交的作业中有长时间执行的大作业, 占用了该Flink集群的所有资源, 则后续无法提交新的job.

    在这里插入图片描述

  • per-job模式:一个Job会对应一个Flink集群,每提交一个作业会根据自身的情况,都会单独向yarn申请资源,直到作业执行完成,一个作业的失败与否并不会影响下一个作业的正常提交和运行。独享Dispatcher和ResourceManager,按需接受资源申请;适合规模大长时间运行的作业。==每次提交job都会创建一个新的flink集群,任务之间互相独立,互不影响,方便管理。任务执行完成之后创建的集群也会消失。==同时main方法是在本地上运行。

    在这里插入图片描述

  • application Mode模式

    每提交一个任务(application)可能会包含多个job,一个application对应一个flink集群,main方法是在集群中运行。

    Application Mode会在Yarn上启动集群, 应用jar包的main函数(用户类的main函数)将会在JobManager上执行. 只要应用程序执行结束, Flink集群会马上被关闭。也可以手动停止集群。

    与Per-Job-Cluster的区别:就是Application Mode下, 用户的main函数式在集群中执行的,并且当一个application中有多个job的话,per-job模式则是一个job对应一个yarn中的application,而ApplicationMode则这个application中对应多个job。

    application Mode模式存在bug不使用。

    bug:每个job的id都为0000000,而checkpoint依赖于id命名在hdfs集群上进行存储。这将导致错误发生。

3、并行度

  • 并行度优先级:

    算子指定>env全局指定>提交参数>配置文件

  • slot个数与并行度的关系

    默认情况下,slot个数等于流程序的并行度(程序中最大算子的并行度)
    在有多个共享组时,slot个数等于每个共享组中最大算子并行的和

4、提交命令执行指定任务

flink提交任务脚本参数:
flink 类似于spark-submit用于提交作业
run 用来执行作业(除了applicationMode模式不需要)
run-application (applicaitonMode模式执行作业的命令)
-t yarn模式中指定以yarn哪种模式运行的参数
-d 后台提交(断开与客户端的连接)
-m 指定JobManager以及UI端口
-D 指定其他参数。比如多队列提交参数(-Dyarn.application.queue=hive)
-c 指定全类名

举例:

  • 本地模式

    bin/flink run -m hadoop102:8081 -c com.hpu.flink.java.chapter_2.Flink03_WC_UnBoundedStream ./flink-prepare-1.0-SNAPSHOT.jar
    
  • standalone模式

    bin/flink run -m hadoop102:8081 -c com.hpu.flink.java.chapter_2.Flink03_WC_UnBoundedStream ./flink-prepare-1.0-SNAPSHOT.jar
    
  • yarn模式

    per-job:

    bin/flink run -d -t yarn-per-job -c com.hpu.flink.java.chapter_2.Flink03_WC_UnBoundedStream ./flink-prepare-1.0-SNAPSHOT.jar
    

    提交任务到Yarn的其他队列

    bin/flink run -d -m yarn-cluster -yqu hive -c com.hpu.flink.java.chapter_2.Flink03_WC_UnBoundedStream ./flink-prepare-1.0-SNAPSHOT.jar(老版本)bin/flink run -d -t yarn-per-job -Dyarn.application.queue=hive -c com.hpu.flink.java.chapter_2.Flink03_WC_UnBoundedStream ./flink-prepare-1.0-SNAPSHOT.jar
    

    session-cluster:

    1. 启动一个Flink-session
    2. 在Session上运行Job
    bin/yarn-session.sh -d bin/flink run -c com.hpu.flink.java.chapter_2.Flink03_WC_UnBoundedStream ./flink-prepare-1.0-SNAPSHOT.jarbin/flink run -t yarn-session -Dyarn.application.id=application_XXXX_YY -c com.hpu.flink.java.chapter_2.Flink03_WC_UnBoundedStream ./flink-prepare-1.0-SNAPSHOT.jar
    

    如果是1.12版本开启了Yarn模式的高可用,上面指定yarn-session集群的命令不能用,需要去掉 -t yarn-session (1.13版本已修复)如果存在多个session集群可以指定application进行提交到指定session集群中。

    bin/flink run -Dyarn.application.id=application_XXXX_YY -c com.hpu.flink.java.chapter_2.Flink03_WC_UnBoundedStream ./flink-prepare-1.0-SNAPSHOT.jar
    

    在session中提交一个任务,此时session对应的flink集群在yarn上的任务为2个container,其中一个为JobManager一个为TaskManager。

    bin/yarn-session.sh -d 
    

    在这里插入图片描述

    启动以后会有一个container,为JobManager

    在这里插入图片描述

    bin/flink run -c com.sunmi.day01.Flink03_Stream_Unbounded_WordCount /home/hadoop/jars/Flink-202307-1.0-SNAPSHOT-jar-with-dependencies.jar
    

    在这里插入图片描述

    提交一个任务后增加一个container,为TaskManager

    在这里插入图片描述

    bin/flink run -c com.sunmi.day01.Flink03_Stream_Unbounded_WordCount /home/hadoop/jars/Flink-202307-1.0-SNAPSHOT-jar-with-dependencies.jar
    

    再提交一个会再增加一个container,存放对应的TaskManager

    flink默认配置:conf/flink-conf.yaml,决定任务内存大小以及所需的slot个数。

    在这里插入图片描述

    application mode:

    bin/flink run-application -t yarn-application -c com.sunmi.day01.Flink03_Stream_Unbounded_WordCount /home/hadoop/jars/Flink-202307-1.0-SNAPSHOT-jar-with-dependencies.jar
    

Application Mode VS yarn per-job

分别使用Application Mode、yarn per-job两种方式提交任务,观察application情况。

package com.sunmi.day01;
import org.apache.flink.api.common.functions.MapFunction;
import org.apache.flink.streaming.api.datastream.DataStreamSource;
import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment;public class Flink04_Test_PerJob_ApplicationMode {public static void main(String[] args) throws Exception {StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();test1(env);test2(env);test3(env);}public static void test1(StreamExecutionEnvironment env) throws Exception {DataStreamSource<String> stringDataStreamSource = env.fromElements("22222");stringDataStreamSource.map(new MapFunction<String, String>() {@Overridepublic String map(String value) throws Exception {return value;}}).print();env.execute();}public static void test2(StreamExecutionEnvironment env) throws Exception {DataStreamSource<String> stringDataStreamSource = env.fromElements("22222");stringDataStreamSource.map(new MapFunction<String, String>() {@Overridepublic String map(String value) throws Exception {return value;}}).print();env.execute();}public static void test3(StreamExecutionEnvironment env) throws Exception {DataStreamSource<String> stringDataStreamSource = env.socketTextStream("zyn-node01", 9999);stringDataStreamSource.map(new MapFunction<String, String>() {@Overridepublic String map(String value) throws Exception {return value;}}).print();env.execute();}
}

application mode:

bin/flink run-application -t yarn-application -c com.sunmi.day01.Flink04_Test_PerJob_ApplicationMode /home/hadoop/jars/Flink-202307-1.0-SNAPSHOT-jar-with-dependencies.jar

在这里插入图片描述

仅存在一个application。

per-job:

bin/flink run -d -t yarn-per-job -Dyarn.application.queue=hive -c com.sunmi.day01.Flink04_Test_PerJob_ApplicationMode /home/hadoop/jars/Flink-202307-1.0-SNAPSHOT-jar-with-dependencies.jar

在这里插入图片描述

3个job生成3个application。

停止任务的三种方式

  1. 通过 flink cancel jobid

  2. 在yarn网页端kill对应application

  3. 在flink网页端cancel

    进入flink网页端有两种方式

    • 通过提交任务时生成的链接进入

      在这里插入图片描述

    • 通过yarn对应application的applicationMaster代理进入

      在这里插入图片描述

5、注意事项

在java语法的flink编程中调用一个方法,有以下三种实现方式

  1. 自定义一个类实现接口 √
  2. 写接口的匿名实现类 √
  3. 写Lambda表达式

注意:在写Lambda表达式的时候,可能会因为类型擦除的原因报错,解决方式如下
在方法的最后调用.returns(Types.类型)解决
比如:
SingleOutputStreamOperator<Tuple2<String, Integer>> wordToOneDStream = wordDStream.map(value -> Tuple2.of(value, 1)).returns(Types.TUPLE(Types.STRING,Types.INT));

外链图片转存中…(img-f84HwYXQ-1689861444196)]

  • 通过yarn对应application的applicationMaster代理进入

    [外链图片转存中…(img-AKY0p7au-1689861444196)]

5、注意事项

在java语法的flink编程中调用一个方法,有以下三种实现方式

  1. 自定义一个类实现接口 √
  2. 写接口的匿名实现类 √
  3. 写Lambda表达式

注意:在写Lambda表达式的时候,可能会因为类型擦除的原因报错,解决方式如下
在方法的最后调用.returns(Types.类型)解决
比如:
SingleOutputStreamOperator<Tuple2<String, Integer>> wordToOneDStream = wordDStream.map(value -> Tuple2.of(value, 1)).returns(Types.TUPLE(Types.STRING,Types.INT));

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

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

相关文章

4.1 Bootstrap UI 编辑器

文章目录 1. Bootstrap Magic2. BootSwatchr3. Bootstrap Live Editor4. Fancy Boot5. Style Bootstrap6. Lavish7. Bootstrap ThemeRoller8. LayoutIt!9. Pingendo10. Kickstrap11. Bootply12. X-editable13. Jetstrap14. DivShot15. PaintStrap 以下是 15 款最好的 Bootstrap…

ffplay播放器剖析(5)----视频输出剖析

文章目录 1.视频输出模块1.1 视频输出初始化1.1.1 视频输出初始化主要流程1.1.2 calculate_display_rect初始化显示窗口大小 1.2 视频输出逻辑1.2.1 event_loop开始处理SDL事件1.2.2 video_refresh1.2.2.1 计算上一帧显示时长,判断是否还要继续上一帧1.2.2.2 估算当前帧显示时长…

笔记本电脑的电池健康:确保长时间使用和优异性能的关键

笔记本电脑已经成为我们日常生活中不可或缺的工具&#xff0c;无论是办公、学习还是娱乐&#xff0c;我们都依赖着它的便携性和高效性能。而在所有的硬件组件中&#xff0c;电池健康被认为是确保长时间使用和良好性能的关键因素之一。一块健康的电池不仅能提供持久的续航时间&a…

CHI协议保序之Compack保序

一致性系统中&#xff0c;使用三种保序方式&#xff1b; Completion ack response ⭕Completion acknowledgment&#xff1a; □ 该域段主要是用来&#xff0c; □ 决定 RN 发送的 trans&#xff0c;与其他 RN 发送的命令产生的 SNP 之间的顺序&#xff1b; …

MySQL存储过程——系统变量

1.存储过程中的变量 1.1 查看系统变量 查看所有的系统变量 show variables;查看会话级别的系统变量 show session variables&#xff1b;查看会话和auto相关的变量 show session variables like auto%;查看全局的和auto相关变量 show global variables like auto%;查看某一…

R语言贝叶斯METROPOLIS-HASTINGS GIBBS 吉布斯采样器估计变点指数分布分析泊松过程车站等待时间...

原文链接&#xff1a;http://tecdat.cn/?p26578 指数分布是泊松过程中事件之间时间的概率分布&#xff0c;因此它用于预测到下一个事件的等待时间&#xff0c;例如&#xff0c;您需要在公共汽车站等待的时间&#xff0c;直到下一班车到了&#xff08;点击文末“阅读原文”获取…

ext4 - delay allocation数据结构

概述 延迟分配delay allocation是ext4非常重要的特性&#xff0c;启用该特性write系统将用户空间buffer写入内存page cache中即返回&#xff0c;此时也不会真正进行磁盘block分配&#xff0c;而是延迟到磁盘回写时&#xff08;比如dirty ratio达到一定值&#xff0c;定时刷新&…

【华为c# OD机考参考答案】01---IPv4地址转换成整数

题目 1、题目 01---IPv4地址转换成整数2、解图思路 1、IP地址转为二进制 2、二进制转十进制 3、注意事项 1、IP地址的范围判断 2、空字符串判断 3、非法字符判断 4、考点 1、string的split 、convert等相关用法 2、正则表达式 3、进制转换 4、理解32位整数的意思 5、代码 判…

【NOSQL】MongoDB

MongoDB MongoDB简介体系结构Linux系统中的安装启动和连接&#xff08;1&#xff09;先到官网下载压缩包——>解压——>重命名新建几个目录&#xff0c;分别用来存储数据和日志&#xff1a;新建并修改配置文件官网下载MongoDB Compass MongoDB简介 MongoDB是一个开源、高…

C# List 详解二

目录 5.Clear() 6.Contains(T) 7.ConvertAll(Converter) ,toutput> 8.CopyTo(Int32, T[], Int32, Int32) 9.CopyTo(T[]) 10.CopyTo(T[], Int32) C# List 详解一 1.Add(T)&#xff0c;2.AddRange(IEnumerable)&#xff0c;3.AsReadOnly()&…

Matlab的GUI设计

文章目录 AppDesigner各个版本的特点mlapp文件基本格式AppDesigner的回调函数常见控件的属性MVC模式MVC模式设计GUIMVC简单使用 其他让app designer置顶将Guide的GUI导出为m文件将app编译为exe将app中的多个控件组合在一起 AppDesigner 20200328 各个版本的特点 在2017b版本中…

【JavaEE】Spring中注解的方式去获取Bean对象

【JavaEE】Spring的开发要点总结&#xff08;3&#xff09; 文章目录 【JavaEE】Spring的开发要点总结&#xff08;3&#xff09;1. 属性注入1.1 Autowired注解1.2 依赖查找 VS 依赖注入1.3 配合Qualifier 筛选Bean对象1.4 属性注入的优缺点 2. Setter注入2.1 Autowired注解2.2…

21matlab数据分析牛顿插值(matlab程序)

1.简述 一、牛顿插值法原理 1.牛顿插值多项式   定义牛顿插值多项式为&#xff1a; N n ( x ) a 0 a 1 ( x − x 0 ) a 2 ( x − x 0 ) ( x − x 1 ) ⋯ a n ( x − x 0 ) ( x − x 1 ) ⋯ ( x − x n − 1 ) N_n\left(x\right)a_0a_1\left(x-x_0\right)a_2\left(x-x_0\…

SpringBoot 如何使用 EmbeddedDatabaseBuilder 进行数据库集成测试

SpringBoot 如何使用 EmbeddedDatabaseBuilder 进行数据库集成测试 在开发 SpringBoot 应用程序时&#xff0c;我们通常需要与数据库进行交互。为了确保我们的应用程序在生产环境中可以正常工作&#xff0c;我们需要进行数据库集成测试&#xff0c;以测试我们的应用程序是否能…

剑指offer61.扑克牌中的顺子

我的想法非常简单&#xff0c;就是先给数组排序&#xff0c;然后统计里面有几个0&#xff0c;然后遍历数组&#xff0c;如果是0或者比后面一个数小1就直接进入下一次循环&#xff0c;如果比后面一个数小2&#xff0c;就用掉一个0&#xff0c;0的数量减1&#xff0c;如果比后面的…

Pycharm----导入库文件夹不在py文件的目录下

问题描述&#xff1a; 想在不同目录下导入根目录的包&#xff0c;直接写会报错。如下边object_detect.py在function文件夹下&#xff0c;导入包默认在这个文件下&#xff0c;但我想导入根目录models和utils下的包 解决方法&#xff1a; 将根目录设置为源代码根目录&#xff0…

【OC总结 面向对象 + 内存管理 + runtime】

文章目录 前言面向对象1.1 一个NSObject对象占用多少内存&#xff1f;1.2 iOS的继承链 & 对象的指针指向了哪里&#xff1f;1.3 OC的类的信息存放在哪里&#xff1f;-isa指针1.4 isMemberOfClass & isKindOfClass Runtime1.4 讲一下OC的消息机制1.5 消息转发机制流程1.…

【指针和数组笔试题(1)】详解指针、数组笔试题

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言整型数组字符数组第一组题第二组题第三组题 总结 前言 在计算之前要了解基本概念&#xff1a; 数组名的理解 数组名是数组首元素的地址 有两个例外 1.sizeof(…

Linux网络基础 — 数据链路层

目录 数据链路层 认识以太网 局域网转发的原理 认识以太网的MAC报头 以太网帧格式 认识MAC地址 对比理解MAC地址和IP地址 基于MAC帧协议再次谈一谈局域网转发的原理 认识MTU MTU对IP协议的影响 MTU对UDP协议的影响 MTU对于TCP协议的影响 ARP协议 ARP协议的作用 …

Xcode 15 beta 4 (15A5195m) - Apple 平台 IDE

Xcode 15 beta 4 (15A5195m) - Apple 平台 IDE IDE for iOS/iPadOS/macOS/watchOS/tvOS/visonOS 请访问原文链接&#xff1a;https://sysin.org/blog/apple-xcode-15/&#xff0c;查看最新版。原创作品&#xff0c;转载请保留出处。 作者主页&#xff1a;sysin.org visonOS …