flink的多种部署模式
## 部署模式和运行模式
### 部署模式
- 本地local
- 单机无需分布式资源管理
- 集群
- 独立集群standalone
- 需要flink自身的任务管理工具
- jobmanager接收和调度任务
- taskmanager执行
- on其他资源管理工具yarn/k8s
- yarn
- 注意区分flink的和yarn的taskmanager
### 运行模式
- session
- 先启动一个集群,保持一个会话,在这个会话中通过客户端提交作业。 集群启动时所有资源就都已经确定,所有提交的作业会竞争集群中的资源。
- 适合任务规模小,执行时间短的大量作业。
- 作业执行环境会一直保留在集群上,直到会话被人为终止。
- per-job
- 每次提交的job都会创建一个独立的作业执行环境,该作业执行环境仅用于通过客户端提交上来的特定的那个作业。
- 适合执行时间长的少量作业
- 当作业完成后,作业执行环境会被自动释放,集群关闭,资源释放
- application-mode
- 为解决客户端执行代码,客户端提交任务给jobmanager占用带宽而生
### 不需要外部资源管理
- per job-一个任务(作业)起一个集群 (提交作业后建立集群)
- standalone-一个集群跑多个任务,手动分配集群整个的资源,启动起来就已经固定了。任务从集群中取得的资源是否能调整?
### 需要外部资源管理
- application-一个任务(作业/应用(同时提交、有依赖关系的多个作业))起一个集群 (提交作业后建立集群)
- session-一个集群跑多个任务,yarn根据配置生成集群?并且将集群里各个任务对资源的使用情况来分配资源?
## 分层API
- sql 与tableAPI类似,以sql查询表达式的形式表现程序
- table API 以表为中心(处理结构化数据)
- 遵循关系模型(像关系型数据库中的表)
- 提供可比较操作(select\project\join\group by\aggregate)
- 通常以方法链的形式调用(提供了一个声明式的接口来处理批处理和流处理任务),语法上更接近于编程语言
- sparkstreaming API 封装处理函数,提供通用模块:
- 转换 transformations(map\flatmap)
- 连接 joins
- 聚合 aggregations
- 窗口 windows
- 有状态的流处理 处理函数
## 运行架构(standalone会话模式)
- jobManager 作业管理器控制执行应用(管理应用里的任务执行和调度)
- jobmaster 负责处理单独的作业(job),等同于早期flink版本中的jobmanager
- 接收要执行的应用
- jobGraph->excutionGraph(包含了所有可并发执行的任务
- 向resourceManager发送请求,申请执行所需资源
- 获取足够资源后,分发执行图到运行它们的taskmanager上
- 运行过程中,负责所有需要中央协调的操作(checkpoints的协调)
- resourceManager 资源管理器
- 资源(taskManager的任务槽task slots)的分配和管理
- 任务槽-资源调配的最小单元,包含了机器用来执行计算的一组CPU和内存
- 每个任务都要分配到一个slot上执行
- 注意区分flink和yarn的resourceManager
- dispatcher 分发器
- 提供一个reset接口,用来提交应用
- 为每一个新提交的作业启动一个新的jobMaster组件
- 启动Web UI
- 非必需架构,有些部署模式下会被省掉(本地模式,一个JVM,不涉及集群部署,所以不需要分发器;kurbernets有自己的controller控制器管理Pod的生命周期,所以替代分发器的部分功能)。
- taskManager任务管理器
- 是flink的工作进程
- 对数据流做具体的计算
- 集群中至少有一个
- 每个包含了一定量的任务槽
- 任务槽的数量限制taskManager处理任务的并行数
- 启动后,先向资源管理器注册它的slots
- 收到资源管理器的反馈指令后,将至少一个槽位提供给jobMaster调用
- jobMaster来分配任务
- taskManager可以缓冲数据,并和运行同一应用的taskManager交换数据
## 并行度和任务槽
- 基本概念
- 算子 是Flink数据处理的基本单元,每个算子负责执行特定的任务。通过组合不同的算子,可以构建复杂的数据处理逻辑。常见的算子包括 Map、Filter、FlatMap、KeyBy、Reduce、Window、Join、Union 和 Sink 、source等。
- source \ sink 类似于datax从哪个地址获取数据输送给哪个地址
- map 一对一 类型转换、四则运算 对数据流中的每个元素应用一个函数,生成一个新的元素
- flatMap 一对多
- keyby 分组
- reduce 聚合
- 并行子任务
- 一个算子任务被拆分成多个并行子任务,再分发到不同节点,实现并行计算。
- 如果处理的数据量大,把一个算子操作复制到多个节点,数据来了后可以到任意一个节点执行。
- 并行是将一个大任务分给两个人同时做
- 比如一个平台上的不同大屏,两个人同时做。这两个人都做过这个项目下的大屏,再来了新的数据新的大屏任务,两个人都能做。(两个人间可能有信息不同步问题,但是算子操作是复制粘贴的,一定同步,所以给哪个节点做都行)
- 并发是一个人同时做好几件事
- 并行度
- 一个特定算子的子任务的个数
- 一段流处理程序的并行度== 所有算子中最大的并行度
- 设置
- #算子层面并行度设置 考虑到动态扩容,通常使用单个算子设置并行度stream.map(word -> Tuple2.of(word, 1L)).setParallelism(2);
- 全局层面设置 env.setParallelism(2);
- 配置文件设置
- 集群 flink-conf.yaml 默认1
- 开发环境无配置文件 默认为当前机器CPU核数
- 并行数据流
- 包含并行子任务的数据流
- 需要多个分区来分配并行任务
## 算子链
- 算子间的数据传输
- 一对一
- 充分区 类似于shuffle
- 合并算子链
- 一对一+算子并行度相同
## 任务槽
- 每个takManager是一个JVM进程,可以启动多个独立线程,并行执行多个子任务
- 计算资源有限,并行任务越多,每个线程资源越少。
```
public class RealTimeWordCountFromPGToMySQL {
public static void main(String[] args) throws Exception {
// 创建流处理环境
StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
// 设置并行度
env.setParallelism(2); // 设置全局并行度为2
// 定义 PostgreSQL CDC 源
Properties props = new Properties();
props.setProperty("plugin.name", "pgoutput"); // PostgreSQL 的逻辑解码插件
props.setProperty("database.hostname", "localhost");
props.setProperty("database.port", "5432");
props.setProperty("database.username", "yourusername");
props.setProperty("database.password", "yourpassword");
props.setProperty("database.server.id", "1888");
props.setProperty("database.server.name", "dbserver1");
props.setProperty("table.whitelist", "public.your_table");
DataStream<String> source = PostgreSQLSource.<String>builder()
.hostname(props.getProperty("database.hostname"))
.port(Integer.parseInt(props.getProperty("database.port")))
.database(props.getProperty("database.server.name"))
.tableList(props.getProperty("table.whitelist"))
.username(props.getProperty("database.username"))
.password(props.getProperty("database.password"))
.deserializer(new DebeziumDeserializationSchema<String>() {
@Override
public String deserialize(ChangeRecord changeRecord) {
if (changeRecord instanceof DataChangeRecord) {
DataChangeRecord dataChangeRecord = (DataChangeRecord) changeRecord;
return dataChangeRecord.after().getField(0).toString();
}
return null;
}
@Override
public boolean isEndOfStream(String nextElement) {
return false;
}
@Override
public TypeInformation<String> getProducedType() {
return Types.STRING();
}
})
.build()
.addSource();
// 使用 flatMap 算子将文本拆分为单词
DataStream<Tuple2<String, Integer>> words = source
.flatMap(new FlatMapFunction<String, Tuple2<String, Integer>>() {
@Override
public void flatMap(String line, Collector<Tuple2<String, Integer>> out) throws Exception {
for (String word : line.split(" ")) {
out.collect(new Tuple2<>(word, 1));
}
}
});
// 使用 keyBy 算子按单词分组
DataStream<Tuple2<String, Integer>> wordCounts = words
.keyBy(value -> value.f0)
.sum(1);
// 定义 MySQL 数据目标
JdbcStatementBuilder<Tuple2<String, Integer>> statementBuilder = (ps, t) -> {
ps.setString(1, t.f0);
ps.setInt(2, t.f1);
};
JdbcConnectionOptions jdbcOptions = new JdbcConnectionOptions.JdbcConnectionOptionsBuilder()
.withUrl("jdbc:mysql://localhost:3306/yourdb")
.withDriverName("com.mysql.cj.jdbc.Driver")
.withUsername("yourusername")
.withPassword("yourpassword")
.build();
wordCounts.addSink(JdbcSink.sink(
"INSERT INTO word_count (word, count) VALUES (?, ?)",
statementBuilder,
jdbcOptions
));
// 执行任务
env.execute("Real-Time Word Count from PG to MySQL Example");
}
}
```
相关文章:
flink的多种部署模式
## 部署模式和运行模式 ### 部署模式 - 本地local - 单机无需分布式资源管理 - 集群 - 独立集群standalone - 需要flink自身的任务管理工具 - jobmanager接收和调度任务 - taskmanager执行 - on其他资源管理工具yarn/k8s …...
SQL分片工具类
SQL分片工具类(SqlShardingUtil)提供数据库查询的智能分片功能,支持数字和字符串两种字段类型的分片策略。对于数字字段,可以指定分片数量均匀划分数值区间;对于字符串字段,则按照ASCII字符范围自动划分。工具类确保分片后的SQL语…...
死锁相关知识
死锁是什么 死锁(Deadlock)是指两个或多个进程(或线程)在执行过程中,因为互相等待对方释放资源,导致永远无法继续执行的状态。 ✅ 死锁的形成条件(必须同时满足以下四个)࿱…...
oscp靶机练习PG Reconstruction
枚举阶段 nmap -A -T4 -p- -Pn -n 192.168.217.103 发现ftp,进行连接枚举 都下载到本地 这里提示我们两点,可以看看pcap文件,还有就是可能有密码遗留还没有删除。 使用下面命令进行过滤筛选流量包,查看与密码相关 http.reque…...
写题。贪心题组
一、 解题思路:主要还是写出val / m,按这个排序,就行了 #include<bits/stdc.h> #define endl "\n" #define ll long long #define pii pair<int,int> using namespace std;struct doro {int m, val;double cmp; } arr…...
UE官方文档学习 TAarry 查询
这个很简单经常用。 二.GetData() . GetData(),像C里拿到数组首地址一样。它不具有越界保护机制,StrArr拥有越界保护机制。这个地址在数组不做改变,如扩容等有用。 void AWXArrayActor::WXFindArray() {TArray<FString> StrArr { &q…...
使用Haproxy搭建Web群集
LVS负载均衡群集 Haproxy介绍http请求负载均衡常用调度算法常见的web群集调度器 示例操作安装httpd(两台网站服务器操作一致)编译安装haproxyhaproxy服务器配置(1)建立haproxy的配置文件(2)修改haproxy.cfg配置文件 测试haproxy的日志(1)修改 haproxy 配…...
Linux 基础命令:`ls`、`cd`、`du` 快速入门
在 Linux 系统中,ls、cd 和 du 是日常操作中最常用的三个命令。掌握它们能大幅提升文件管理效率。 1. ls:查看目录内容 用途:列出当前或指定目录下的文件和子目录。 常用命令: ls -l # 详细列表(权限、大…...
[论文阅读] 人工智能 + 软件工程 | USEagent:迈向统一的AI软件工程师
论文信息 article{applis2025unified,title{Unified Software Engineering agent as AI Software Engineer},author{Applis, Leonhard and Jiang, Nan and Zhang, Yuntong and Tan, Lin and Liang, Shanchao and Roychoudhury, Abhik},journal{arXiv preprint arXiv:2506.1468…...
微信小程序传参过来了,但是数据没有获取到
使用本方法前,已经采用encodeURIComponent把拼接的参数编码之后,拼接在链接上,在接受的页面的onLoad生命周期,接收到参数之后,采用decodeURIComponent进行解码的操作,如果这个也不行,不是说不行…...
微信小程序form表单手机号正则检验pattern失效
好奇怪啊,h5页面校验没问题,在微信小程序模拟器以及真机运行都失效,排查半天,记录一下 PS:身份证号校验也没问题,就手机号校验有问题,奇奇怪怪的 之前的写法(在小程序上不生效&…...
repo 工具
repo 是 Google 为管理多个 Git 仓库而开发的工具,主要用于 Android 开源项目(AOSP)等大型项目。它通过清单文件(manifest.xml)统一管理多个 Git 仓库的依赖关系。以下是核心用法和常见命令: 一、安装 repo…...
Python实例题:基于 TensorFlow 的图像识别与分类系统
目录 Python实例题 题目 问题描述 解题思路 关键代码框架 难点分析 扩展方向 Python实例题 题目 基于 TensorFlow 的图像识别与分类系统 问题描述 开发一个基于 TensorFlow 的图像识别与分类系统,包含以下功能: 图像分类模型:基于…...
Windows 10开始菜单优化方案,如何实现Win7风格开始菜单的还原
今天阿灿给大家安利个好东西 Start10这软件能让Win10的开始菜单变回Win7那种经典样式,用起来特别顺手。不仅能改开始菜单外观,还能调整任务栏布局,想怎么设置都行。 我用它主要就图两点: 1. 找回Win7那种简洁好用的开始菜单 2.…...
Kafka性能压测报告撰写
在大数据生态体系中,Kafka以其卓越的高吞吐、低延迟特性,成为消息队列领域的中流砥柱。然而,随着业务规模不断扩张,数据流量日益激增,Kafka的性能表现直接关乎业务系统的稳定运行与效率提升。通过科学严谨的性能压测&a…...
IP 地理库的使用指南:从基础应用到深度实践
P 地理库的使用指南:从基础应用到深度实践 在数字化时代,IP 地址如同网络世界里的 “门牌号码”,而 IP 地理库则是解读这些号码背后秘密的 “解码器”。它不仅能定位 IP 对应的地理位置,还能挖掘出丰富的网络属性信息。接下来…...
C#的泛型和匿名类型
一、C#的泛型简介 泛型是一种允许你延迟编写类或方法中的数据类型规范,直到你在实际使用时才替换为具体的数据类型【简单的说:泛型就是允许我们编写能够适用于任何数据类型的代码,而无需为每种特定类型重写相同的代码】(T是类型参数ÿ…...
ABP VNext + MongoDB 数据存储:多模型支持与 NoSQL 扩展
🚀 ABP VNext MongoDB 数据存储:多模型支持与 NoSQL 扩展(生产级实践) 目录 🚀 ABP VNext MongoDB 数据存储:多模型支持与 NoSQL 扩展(生产级实践)🎯 引言🧰…...
JETBRAINS IDE 开发环境自定义设置快捷键
Date: 2025-06-18 20:39:52 author: lijianzhan JetBrains简介 让它发生。 用代码。 在JetBrains,代码是我们的激情所在。自成立以来,我们一直致力于打造世界上最强大、最有效的开发工具。 1.JETBRAINS官网,可以在官网下载代码编辑器 2.进入…...
JAVA——泛型
泛型(Generics)是Java语言在JDK 5.0版本中引入的一种强大特性,用于在编译时提供更强的类型检查和类型安全。它允许程序员在定义类、接口和方法时使用类型参数(Type Parameters),从而实现类型参数化。通过泛…...
攻防演练:1.木马后门文件演练
为了防止 Linux 服务器上传木马后门文件,可以编写一个脚本,定期检查系统中的可疑文件、进程和权限。以下是一个示例脚本,用于检查常见的后门文件、异常进程和权限问题。 脚本功能 检查常见后门文件路径。检查异常 SUID/SGID 文件。检查异常进…...
c++ STL---vector使用
本文对STL---中的vector的使用是参考网站 vector - C Reference 的内容,该网站是外文的哦,大家可以尝试打开看看更深刻的理解。本文是抽取其中常使用,然后加上自己的是理解哦。 前言 vector其实是顺序表类模板的封装啊! 数据结构…...
windows标题栏显示奇怪的蓝色,怎么解决
背景 如下,非常奇怪,如果窗口是active状态就是蓝色的,为什么? 如果你遇到上述问题,可以这么解决: 右键点击桌面,选择 “个性化”, 滚动到下面,看到 “标题栏和窗口边…...
Kafka存储设计深度剖析:日志、索引与文件管理的底层奥秘
引言 在分布式消息系统领域,Kafka凭借卓越的性能与高可靠性占据重要地位,而这一切都离不开其精妙的存储设计。从消息的持久化存储到高效检索,从日志分段管理到数据清理策略,Kafka的存储架构设计巧妙,能够支撑海量消息…...
将多个Excel合并到一个Excel中的方法
今天遇到这么一个问题,需要将多个Excel表格中的数据汇总表,合并在一个Excel中,并且显示一致。 因此编写了以下代码来解决这个问题, 1.在Excel中按AltF11,快速调出命令控制台 2.工具栏选择插入——模块——将以下脚本…...
Debian配置Redis主从、哨兵
前言 Redis的下载安装可参考Centos安装配置Redis6.x,Centos和Debian的步骤基本类似,或自行在网上搜索相关资料 注意:远程连接需放开相应端口 主从 搭建一个一主二从的主从模式 处理conf文件 #进入redis所在目录 cd /tools/redis/redis6 …...
OpenSSL引擎 + PKCS11 + SoftHSM2认证
OpenSSL引擎 PKCS11 SoftHSM2 前言:金融级安全的基石 在金融、军工等高安全领域,硬件安全模块(HSM) 是保护加密密钥的黄金标准。本文将深度剖析HSM核心组件libpkcs11.so的工作原理,并手把手教你搭建基于SoftHSM2的…...
flex布局 项目属性
<!DOCTYPE html> <html> <head> <meta charset"utf-8"> <title>flex布局 项目属性</title> <link href"css/k.css" rel"stylesheet" /> </head> <bod…...
流水表延迟处理方案设计
**### 流水表延迟处理方案设计 针对你的场景(流水表插入记录,当type4时需要1秒后处理),结合现有技术栈(JDK8、MySQL、定时任务、Redis、RabbitMQ),我推荐以下几种可行方案: 一、方…...
密室出逃消消乐小游戏微信流量主小程序开源
这个密室出逃消消乐小游戏采用了微信小程序的标准目录结构,包含以下核心功能: 游戏界面:6x6 的网格布局,随机生成不同类型的物品 游戏逻辑:交换相邻物品,消除三个或以上相同类型的物品 计分系统:…...
Docker 日志
Docker 日志是排查容器故障、监控运行状态的重要工具。下面从 日志查看命令、详解字段、日志驱动、最佳实践 四个方面给你详细解析。 一、最常用日志命令 1. 查看容器日志(默认 stdout、stderr) docker logs <container_name|container_id>2. 实…...
嵌入Linux快速入门第3篇
01_嵌入式Linux开发环境介绍 在Windows环境下的操作: 02_配置VMware使用双网卡之NAT网卡 虚拟机内部有两个网卡,一个是NAT网卡,另外一个是桥接网卡。NAT网卡用来保证Ubuntu可以上网,桥接网卡用来保证Ubuntu可以和开发板进行数据…...
详解鸿蒙Next仓颉开发语言中的全屏模式
大家好,今天跟大家分享一下仓颉开发语言中的全屏模式。 和ArkTS一样,仓颉的新建项目默认是非全屏模式的,如果你的应用颜色比较丰富,就会发现屏幕上方和底部的留白,这是应用自动避让了屏幕上方摄像头区域和底部的导航条…...
Oracle/MySQL/SqlServer/PostgreSQL等数据库的数据类型映射以及各版本数据类型情况说明
1 引言 近期工作聚焦于跨数据库系统的数据类型兼容性研究,旨在解决多源异构数据迁移、系统集成及版本升级中的类型映射难题。具体任务包括:1)建立主流数据库(如MySQL、Oracle、PostgreSQL、SQL Server等)的数据类型映射…...
新生活的开启:从 Trae AI 离开后的三个月
很久没有写文章了,想借着入职新公司一个月的机会,和大家唠唠嗑。 离职 今年2月份我从字节离职了,结束了四年的经历,当时离开的核心原因是觉得加班时间太长了,平均每天都要工作15,16个小时,周末…...
背包问题概论(01背包,完全背包,多重背包)DP
背包问题概论(01背包,完全背包,多重背包)DP 背包问题一种经典的组合优化问题,主要用于在有限的容量下选择物品以最大化总价值。它分为几种类型: ①:0/1背包问题:每种物品只能选择…...
攻克SQL审核“最后堡垒”!PawSQL首发T-SQL存储过程深度优化引擎
为什么存储过程审核那么难? 存储过程将数据操作逻辑固化在数据库层,一次编译、多次执行,既能大幅提升性能,也能通过权限隔离增强安全。然而,正因其逻辑复杂、分支众多,存储过程内部的 SQL 审核与优化常常成…...
Stable Diffusion 实战-手机壁纸制作 第二篇:优化那些“崩脸”和“马赛克”问题,让图像更加完美!
欢迎回来!在《StableDiffusion实战-手机壁纸制作》系列的第一篇中,我们成功完成了基础操作,制作出了令人炫目的手机壁纸。 今天,我们将进入一个更高阶的领域——优化处理。因为谁不想让生成的艺术品更完美呢?尤其是避免“崩脸”和“马赛克”这种让人抓狂的问题! 创作的路…...
Kafka消费者客户端源码深度解析:从架构到核心流程
在Kafka生态系统中,消费者客户端作为数据消费的入口,其设计与实现直接影响数据处理的效率和可靠性。本文将深入Kafka消费者客户端源码,通过核心组件解析、流程拆解与源码分析,揭示其高性能消费背后的技术奥秘,并辅以架…...
Linux进程间通信:从入门到精通(2)
嘿,小伙伴!今天我们来聊聊Linux系统中一个超级重要的话题——进程间通信(IPC)。看到"进程间通信"这个词,别急着打哈欠,这可是Linux内核中的"社交达人",让进程们能够愉快地交…...
从源码到生产:Apache 2.4.57 自动化安装实战指南(附脚本)
引言:为何选择源码安装 Apache? 在服务器运维场景中,源码编译安装 Apache HTTP Server 是实现精细化配置的重要方式。相比包管理器安装,源码安装可自定义模块组合、适配特定依赖环境,并精确控制版本。本文将通过自动化…...
CMake实践:指定gcc版本编译和交叉编译
目录 1.指定gcc版本编译 1.1.通过CMake参数来实现 1.2.使用 RPATH/RUNPATH 直接指定库路径 1.3.使用符号链接和 LD_LIBRARY_PATH 1.4.使用 wrapper 脚本封装 LD_LIBRARY_PATH 2.交叉编译 2.1.基本用法 2.2.工具链文件关键配置 2.3.多平台工具链示例 2.4.注意事项 2.…...
【MySQL基础】MySQL内置函数全面解析:提升你的数据库操作效率
MySQL学习: https://blog.csdn.net/2301_80220607/category_12971838.html?spm1001.2014.3001.5482 前言: MySQL提供了丰富的内置函数来帮助开发者高效地处理数据。这些函数覆盖了字符串操作、数值计算、日期时间处理、流程控制等多个方面。本文将全面…...
OpenCV CUDA模块设备层-----在GPU上计算两个uchar1类型像素值的反正切(arctangent)比值函数atan2()
操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 对输入的两个 uchar1 像素值 a 和 b,先分别归一化到 [0.0, 1.0] 浮点区间,然后计算它们的 四象限反正切函数。 函数原型…...
unity 半透明描线shader
效果如图 Shader "Custom/TransparentWithOutline_Fixed" {Properties{// 主材质属性_Color ("Main Color", Color) (1,1,1,1)_MainTex ("Base (RGB) Trans (A)", 2D) "white" {}_Glossiness ("Smoothness", Range(0,1)…...
react中使用antd的form表单去受控switch时初始值没有正确显示
解决方案 antd内api中有valuePropName熟悉 只需正常绑定当前元素触发事件即可...
01__QT的背景介绍和工程创建
一、QT软件的安装 1、qt的背景介绍 Qt 是一个跨平台的 图形界面库(重量级),1994年由罗威troll tech公司出品,它集成了网络、数据库、串口通信协议(RS232,蓝牙,NFC)、打印、PDF生成…...
Java Map 深度解析
一、HashMap 底层实现详解 1. 核心数据结构 HashMap 在 JDK 8 中的底层结构是 数组 链表 红黑树,其核心成员变量包括: transient Node<K,V>[] table;:哈希桶数组transient int size;:实际键值对数量int threshold;&…...
异地组网工具
目前手头上两台服务器(一台主力,一台有gpu用来跑点深度学习任务),两台pc(一台是主力,一台是便携碎片化时间随时赶工用); 之前组网的时候,用zerotiertailscale࿰…...
我们为什么要模拟
大约 25 年前,当我开始从事高速 PCB 设计时,速度很慢,层数少,介电常数和损耗角正切很高,设计裕量很宽,铜粗糙度无关紧要,玻璃编织样式也无关紧要。我们称电介质为“FR-4”,它们的特性…...