Flink基础
Flink基础
目录
- Flink简介
- 核心概念
- 编程模型
- 核心功能
- 应用场景
- 部署模式
- 生态系统
- 最佳实践
- 学习资源
- 实践案例
- 高级特性
1. Flink简介
1.1 什么是Flink
Apache Flink是一个开源的分布式流处理和批处理系统。它能够处理有界(批处理)和无界(流处理)数据流,具有高吞吐量、低延迟、容错性和一致性保证等特点。
1.2 Flink特点
- 统一批处理和流处理:同一套API处理批处理和流处理
- 事件时间处理:基于事件实际发生时间进行处理
- 精确一次语义:保证数据处理的精确一次语义
- 低延迟高吞吐:毫秒级延迟,每秒处理数百万事件
- 丰富的状态管理:支持复杂的状态操作
- 强大的容错机制:基于轻量级分布式快照的容错
- 灵活的窗口操作:支持多种窗口类型和自定义窗口
1.3 Flink与其他框架对比
- 与Spark对比:Flink是真正的流处理系统,而Spark是微批处理
- 与Storm对比:Flink提供更丰富的功能和更好的性能
- 与Kafka Streams对比:Flink提供更完整的流处理功能
2. 核心概念
2.1 流处理与批处理
- 流处理:处理无界数据流,数据持续不断地流入系统
- 实时处理
- 持续计算
- 无界数据集
- 批处理:处理有界数据集,数据一次性全部输入系统
- 离线处理
- 一次性计算
- 有界数据集
2.2 基本组件
- JobManager:负责作业调度、资源分配和故障恢复
- 作业图生成
- 资源分配
- 检查点协调
- 故障恢复
- TaskManager:执行实际的数据处理任务
- 任务执行
- 内存管理
- 网络通信
- 状态管理
- ResourceManager:管理集群资源
- 资源分配
- 资源回收
- 资源监控
- Dispatcher:提供REST接口,提交应用程序
- 作业提交
- Web UI
- 作业管理
2.3 数据流模型
- DataStream:处理无界数据流
- 流处理API
- 实时计算
- 窗口操作
- DataSet:处理有界数据集
- 批处理API
- 离线计算
- 迭代计算
- Table API:基于SQL的查询接口
- 结构化数据处理
- 声明式编程
- 优化执行
- SQL:标准SQL查询接口
- 标准SQL语法
- 流式SQL
- 批处理SQL
2.4 时间语义
- 事件时间:事件实际发生的时间
- 最准确的时间语义
- 处理乱序数据
- 需要水印机制
- 处理时间:事件被处理的时间
- 最简单的时间语义
- 处理速度快
- 结果不可重现
- 摄入时间:事件进入Flink系统的时间
- 介于事件时间和处理时间之间
- 比事件时间更早确定
- 比处理时间更稳定
2.5 窗口操作
- 滚动窗口:固定大小的窗口,不重叠
- 固定时间窗口
- 固定计数窗口
- 简单高效
- 滑动窗口:固定大小的窗口,可以重叠
- 滑动时间窗口
- 滑动计数窗口
- 平滑计算
- 会话窗口:基于活动间隔的动态窗口
- 动态窗口大小
- 基于活动间隔
- 适合用户行为分析
- 全局窗口:所有数据放在一个窗口中
- 自定义触发器
- 自定义驱逐器
- 灵活控制
3. 编程模型
3.1 DataStream API
// 创建执行环境
StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();// 创建数据源
DataStream<String> text = env.socketTextStream("localhost", 9999);// 转换操作
DataStream<Tuple2<String, Integer>> wordCounts = text.flatMap(new Tokenizer()).keyBy(value -> value.f0).window(TumblingProcessingTimeWindows.of(Time.seconds(5))).sum(1);// 输出结果
wordCounts.print();// 执行作业
env.execute("Streaming WordCount");
3.2 DataSet API
// 创建执行环境
ExecutionEnvironment env = ExecutionEnvironment.getExecutionEnvironment();// 创建数据源
DataSet<String> text = env.readTextFile("path/to/file");// 转换操作
DataSet<Tuple2<String, Integer>> wordCounts = text.flatMap(new Tokenizer()).groupBy(0).sum(1);// 输出结果
wordCounts.print();
3.3 Table API & SQL
// 创建表环境
StreamTableEnvironment tableEnv = StreamTableEnvironment.create(env);// 注册表
tableEnv.createTemporaryView("input_table", inputStream, $("word"), $("count"));// SQL查询
Table result = tableEnv.sqlQuery("SELECT word, SUM(count) as total FROM input_table GROUP BY word"
);// 转换为DataStream
DataStream<Row> resultStream = tableEnv.toDataStream(result);
3.4 转换操作
- Map:一对一转换
- FlatMap:一对多转换
- Filter:过滤数据
- KeyBy:按键分组
- Reduce:归约操作
- Aggregate:聚合操作
- Window:窗口操作
- Connect:连接流
- Union:合并流
- Split:分割流
4. 核心功能
4.1 状态管理
- 键控状态:与特定键关联的状态
- ValueState:单值状态
- ListState:列表状态
- MapState:映射状态
- ReducingState:归约状态
- AggregatingState:聚合状态
- 算子状态:与算子实例关联的状态
- ListState:列表状态
- UnionListState:联合列表状态
- BroadcastState:广播状态
- 原始状态:用户自定义的状态
- 自定义序列化
- 直接访问
- 高性能
- 托管状态:Flink管理的状态
- 自动序列化
- 自动容错
- 自动扩展
4.2 容错机制
- 检查点:定期保存应用程序状态的快照
- 轻量级分布式快照
- 异步检查点
- 增量检查点
- 保存点:手动触发的检查点,用于版本升级
- 版本兼容性
- 状态迁移
- 作业升级
- 状态后端:存储状态的后端系统
- MemoryStateBackend:内存状态后端
- FsStateBackend:文件系统状态后端
- RocksDBStateBackend:RocksDB状态后端
4.3 时间处理
- 水印:处理事件时间的机制
- 单调递增
- 延迟处理
- 乱序处理
- 定时器:基于处理时间或事件时间的回调
- 处理时间定时器
- 事件时间定时器
- 自定义触发器
- 窗口操作:基于时间的窗口计算
- 时间窗口
- 计数窗口
- 会话窗口
- 全局窗口
4.4 并行处理
- 并行度:任务并行执行的程度
- 算子并行度
- 默认并行度
- 最大并行度
- 任务槽:TaskManager中的资源单元
- 内存分配
- CPU分配
- 网络分配
- 分区:数据流的分片
- 哈希分区
- 范围分区
- 广播分区
- 自定义分区
5. 应用场景
5.1 实时数据分析
- 实时仪表盘
- 业务指标监控
- 性能指标监控
- 用户行为分析
- 实时报表
- 销售报表
- 财务报表
- 运营报表
- 实时监控
- 系统监控
- 安全监控
- 异常监控
5.2 复杂事件处理
- 欺诈检测
- 交易模式识别
- 异常行为检测
- 风险评估
- 异常检测
- 系统异常检测
- 网络异常检测
- 业务异常检测
- 模式识别
- 用户行为模式
- 市场趋势模式
- 设备故障模式
5.3 流式ETL
- 数据转换和清洗
- 数据格式转换
- 数据质量清洗
- 数据标准化
- 数据集成
- 多源数据集成
- 实时数据集成
- 历史数据集成
- 数据仓库加载
- 实时数据加载
- 增量数据加载
- 全量数据加载
5.4 实时机器学习
- 在线学习
- 模型实时更新
- 特征实时计算
- 预测实时生成
- 模型更新
- 增量学习
- 在线学习
- 迁移学习
- 特征工程
- 实时特征提取
- 特征选择
- 特征转换
6. 部署模式
6.1 本地模式
- 单JVM中运行
- 开发环境
- 测试环境
- 小规模数据处理
- 适合场景
- 开发和测试
- 调试和验证
- 小规模数据处理
6.2 集群模式
- Standalone:Flink自带的集群管理器
- 简单部署
- 资源隔离
- 独立运行
- YARN:Hadoop YARN资源管理器
- 资源共享
- 动态资源分配
- 与Hadoop生态集成
- Kubernetes:容器编排平台
- 容器化部署
- 自动扩缩容
- 高可用部署
- Mesos:分布式系统内核
- 资源隔离
- 动态资源分配
- 多框架支持
6.3 云服务
- AWS Kinesis Data Analytics
- 无服务器
- 自动扩缩容
- 与AWS服务集成
- Google Cloud Dataflow
- 无服务器
- 自动扩缩容
- 与GCP服务集成
- Azure Stream Analytics
- 无服务器
- 自动扩缩容
- 与Azure服务集成
- 阿里云实时计算Flink版
- 无服务器
- 自动扩缩容
- 与阿里云服务集成
7. 生态系统
7.1 连接器
- 数据源连接器
- Kafka:消息队列
- RabbitMQ:消息队列
- Kinesis:流数据服务
- Pulsar:消息队列
- 数据接收器连接器
- Elasticsearch:搜索引擎
- Cassandra:列族数据库
- JDBC:关系型数据库
- HBase:列式数据库
- 文件系统连接器
- HDFS:分布式文件系统
- S3:对象存储
- GCS:对象存储
- Azure Blob:对象存储
7.2 库和扩展
- Flink ML:机器学习库
- 特征工程
- 模型训练
- 模型预测
- Flink CEP:复杂事件处理库
- 模式匹配
- 事件序列
- 时间约束
- Flink Gelly:图处理库
- 图算法
- 图分析
- 图可视化
- Flink Table API:结构化数据处理
- 声明式编程
- 优化执行
- SQL集成
7.3 监控和管理
- Flink Web UI:Web界面
- 作业监控
- 任务监控
- 指标监控
- Flink Metrics:指标系统
- 系统指标
- 自定义指标
- 指标导出
- Flink REST API:REST接口
- 作业管理
- 集群管理
- 配置管理
- Flink CLI:命令行工具
- 作业提交
- 作业取消
- 保存点管理
8. 最佳实践
8.1 性能优化
- 合理设置并行度
- 根据数据量设置
- 根据资源设置
- 根据业务需求设置
- 选择合适的状态后端
- 内存状态后端:小状态
- 文件系统状态后端:中等状态
- RocksDB状态后端:大状态
- 优化数据倾斜
- 自定义分区
- 两阶段聚合
- 本地聚合
- 使用异步I/O
- 外部系统访问
- 数据库查询
- 缓存访问
- 调整检查点间隔
- 根据业务需求设置
- 根据状态大小设置
- 根据容错需求设置
8.2 开发建议
- 使用事件时间而非处理时间
- 更准确的时间语义
- 处理乱序数据
- 结果可重现
- 合理设计状态大小
- 避免过大的状态
- 使用增量检查点
- 定期清理状态
- 避免过大的状态
- 使用窗口操作
- 使用状态TTL
- 使用状态清理
- 使用增量检查点
- 减少检查点时间
- 减少网络传输
- 提高容错效率
- 实现自定义序列化器
- 提高序列化效率
- 减少序列化大小
- 自定义序列化逻辑
8.3 故障处理
- 实现自定义重启策略
- 固定延迟重启
- 指数退避重启
- 自定义重启策略
- 监控背压情况
- 监控背压指标
- 调整并行度
- 优化处理逻辑
- 设置合理的超时时间
- 设置操作超时
- 设置检查点超时
- 设置重启超时
- 实现自定义错误处理
- 捕获和处理异常
- 记录错误信息
- 实现错误恢复
9. 学习资源
9.1 官方资源
- Flink官方文档
- Flink GitHub仓库
- Flink JIRA
- Flink邮件列表
9.2 教程和课程
- Flink官方培训
- 入门教程
- 高级教程
- 最佳实践
- 在线课程平台
- 慕课网Flink课程
- 极客时间Flink专栏
- Coursera流处理课程
- Udacity数据工程课程
- 技术博客
- Flink官方博客
- 美团技术博客
- 阿里技术博客
- 腾讯技术博客
9.3 社区资源
- Flink中文社区
- 技术讨论
- 问题解答
- 经验分享
- Flink邮件列表
- 用户邮件列表
- 开发者邮件列表
- 提交邮件列表
- Flink Slack频道
- 实时交流
- 问题解答
- 经验分享
- Stack Overflow Flink标签
- 问题解答
- 代码示例
- 最佳实践
9.4 书籍推荐
- 《Stream Processing with Apache Flink》
- 《Learning Apache Flink》
- 《Apache Flink: Stream Processing and Analytics》
- 《Flink实战》
- 《深入理解Flink:实时计算实践与原理》
10. 实践案例
10.1 实时用户行为分析系统
// 定义用户行为事件
public class UserEvent {public String userId;public String eventType;public long timestamp;// getter和setter
}// 实现实时用户行为分析
public class UserBehaviorAnalysis {public static void main(String[] args) throws Exception {StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();// 设置事件时间和水印env.setStreamTimeCharacteristic(TimeCharacteristic.EventTime);// 从Kafka读取数据Properties properties = new Properties();properties.setProperty("bootstrap.servers", "localhost:9092");properties.setProperty("group.id", "user-behavior-group");FlinkKafkaConsumer<String> consumer = new FlinkKafkaConsumer<>("user-events",new SimpleStringSchema(),properties);// 处理数据流DataStream<UserEvent> events = env.addSource(consumer).map(new UserEventMapper()).assignTimestampsAndWatermarks(WatermarkStrategy.<UserEvent>forBoundedOutOfOrderness(Duration.ofSeconds(5)).withTimestampAssigner((event, timestamp) -> event.timestamp));// 分析用户行为模式events.keyBy(event -> event.userId).window(TumblingEventTimeWindows.of(Time.minutes(5))).aggregate(new UserBehaviorAggregator()).addSink(new AlertSink());env.execute("User Behavior Analysis");}
}
10.2 实时热门商品统计
// 商品点击事件
public class ItemViewEvent {public String itemId;public String category;public long timestamp;// getter和setter
}// 实现热门商品统计
public class HotItemsAnalysis {public static void main(String[] args) throws Exception {StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();// 读取点击流数据DataStream<ItemViewEvent> views = env.addSource(new ItemViewSource()).assignTimestampsAndWatermarks(WatermarkStrategy.<ItemViewEvent>forBoundedOutOfOrderness(Duration.ofSeconds(5)).withTimestampAssigner((event, timestamp) -> event.timestamp));// 统计热门商品views.keyBy(view -> view.itemId).window(SlidingEventTimeWindows.of(Time.hours(1), Time.minutes(5))).aggregate(new CountAggregator()).keyBy(itemCount -> itemCount.windowEnd).process(new TopNHotItems(3)).addSink(new HotItemsSink());env.execute("Hot Items Analysis");}
}
11. 高级特性
11.1 状态一致性保证
- 精确一次语义(Exactly-Once)
- 检查点机制
- 两阶段提交协议
- 事务性数据源和接收器
- 实现示例
// 配置检查点
env.enableCheckpointing(5000); // 每5秒触发一次检查点
env.getCheckpointConfig().setCheckpointingMode(CheckpointingMode.EXACTLY_ONCE);
env.getCheckpointConfig().setMinPauseBetweenCheckpoints(500);
env.getCheckpointConfig().setCheckpointTimeout(60000);
env.getCheckpointConfig().setMaxConcurrentCheckpoints(1);
11.2 反压处理
- 背压监控
// 配置背压监控
env.getConfig().setLatencyTrackingInterval(5000L);// 实现自定义背压处理
public class BackpressureHandler extends RichMapFunction<Event, Event> {@Overridepublic Event map(Event event) throws Exception {// 监控处理延迟if (getRuntimeContext().getMetricGroup().getIOMetricGroup().getBackPressuredTimeMsPerSecond().getCount() > threshold) {// 执行背压处理逻辑}return event;}
}
11.3 自定义窗口操作
// 自定义窗口分配器
public class CustomWindowAssigner<T> extends WindowAssigner<T, TimeWindow> {@Overridepublic Collection<TimeWindow> assignWindows(T element, long timestamp, WindowAssignerContext context) {// 实现自定义窗口分配逻辑}
}// 自定义触发器
public class CustomTrigger extends Trigger<Object, TimeWindow> {@Overridepublic TriggerResult onElement(Object element, long timestamp, TimeWindow window, TriggerContext ctx) {// 实现自定义触发逻辑}
}
11.4 动态表与持续查询
// 创建动态表环境
StreamTableEnvironment tableEnv = StreamTableEnvironment.create(env);// 注册动态表
tableEnv.createTemporaryView("user_behavior", events,Schema.newBuilder().column("userId", DataTypes.STRING()).column("eventType", DataTypes.STRING()).column("timestamp", DataTypes.TIMESTAMP(3)).watermark("timestamp", "timestamp - INTERVAL '5' SECOND").build()
);// 执行持续查询
Table result = tableEnv.sqlQuery("SELECT userId, COUNT(*) as eventCount " +"FROM user_behavior " +"GROUP BY userId, " +"TUMBLE(timestamp, INTERVAL '1' HOUR)"
);
总结
Apache Flink是一个强大的分布式流处理框架,具有处理无界和有界数据流的能力。通过掌握Flink的核心概念、编程模型和最佳实践,您可以构建高性能、可靠的数据处理应用程序。随着大数据和实时处理需求的增长,Flink在数据工程和数据分析领域的应用将越来越广泛。
相关文章:
Flink基础
Flink基础 目录 Flink简介核心概念编程模型核心功能应用场景部署模式生态系统最佳实践学习资源实践案例高级特性 1. Flink简介 1.1 什么是Flink Apache Flink是一个开源的分布式流处理和批处理系统。它能够处理有界(批处理)和无界(流处理…...
SASE、零信任安全理念的发展脉络
SASE(安全访问服务边缘)与零信任架构的发展脉络,是云安全理念从 “边界防御” 向 “动态信任” 跃迁的典型缩影。两者的演进既独立又交织,共同推动网络安全从静态合规走向主动治理。以下从技术起源、理念突破、产业实践到未来趋势展开深度解析: 一、零信任:从理论构想到…...
CompletableFuture 和 List<CompletableFuture> allOf() join() get() 使用经验
CompletableFuture<Map<Menu, Map<IntentDetail, Double>>> xxx CompletableFuture.supplyAsync(() -> {Map<Menu, Map<IntentDetail, Double>> scores new ConcurrentHashMap<>();// 存储结果scores.computeIfAbsent(menu, k -> n…...
Vue.js组件化开发实战:从工程化到安全纵深设计
文章目录 开篇:现代前端组件化演进之路 组件设计核心:高内聚低耦合实践 工程化基石:从Webpack到Monorepo 安全纵深设计:RASP在组件层的实现 实战:动态表单组件的三次进化 进阶篇:组件工厂模式与策略模…...
【深度解析】SkyWalking 10.2.0版本安全优化与性能提升实战指南
前言 Apache SkyWalking 作为云原生可观测性领域的佼佼者,在微服务架构监控中扮演着至关重要的角色。然而,官方版本在安全性、镜像体积和功能扩展方面仍有优化空间。本文将分享一套完整的 SkyWalking 10.2.0 版本优化方案,从安全漏洞修复到镜…...
NOIP2011提高组.玛雅游戏
目录 题目算法标签: 模拟, 搜索, d f s dfs dfs, 剪枝优化思路*详细注释版代码精简注释版代码 题目 185. 玛雅游戏 算法标签: 模拟, 搜索, d f s dfs dfs, 剪枝优化 思路 可行性剪枝 如果某个颜色的格子数量少于 3 3 3一定无解因为要求字典序最小, 因此当一个格子左边有…...
常微分方程求解全解析:从基础到矩阵方法深度实践
常微分方程求解全解析:从基础到矩阵方法深度实践 一、常微分方程基础与解法体系 1.微分方程基本概念解析 常微分方程的阶数指方程中未知函数导数的最高阶数。通解是包含任意常数且常数个数与方程阶数相同的解,特解则是通解中任意常数取特定值得到的解。以自由落体运动为例…...
Go 微服务框架 | 中间件
文章目录 定义中间件前置中间件后置中间件路由级别中间件 定义中间件 中间件的作用是给应用添加一些额外的功能,但是不会影响原有应用的编码方式,想用的时候直接添加,不想用的时候也可以轻松去除,实现所谓的可插拔。中间件的实现…...
【HarmonyOS Next之旅】DevEco Studio使用指南(十二)
目录 1 -> Code Linter代码检查 2 -> 配置代码检查规则 3 -> 查看/处理代码检查结果 1 -> Code Linter代码检查 Code Linter针对ArkTS/TS代码进行最佳实践/编程规范方面的检查。 可根据扫描结果中告警提示手工修复代码缺陷,或者执行一键式自动修复…...
Java设计模式之桥接模式:从入门到架构级实践
1. 什么是桥接模式? 桥接模式(Bridge Pattern) 是一种结构型设计模式,其核心目标是将抽象部分与实现部分分离,使它们能够独立变化。通过这种方式,桥接模式解决了多层继承带来的复杂性,并增强了…...
Jupyter Lab 无法启动 Kernel 问题排查与解决总结
📄 Jupyter Lab 无法启动 Kernel 问题排查与解决总结 一、问题概述 🚨 现象描述: 用户通过浏览器访问远程服务器的 Jupyter Lab 页面(http://xx.xx.xx.xx:8891/lab)后,.ipynb 文件可以打开,但无…...
【LeetCode 热题100】73:矩阵置零(详细解析)(Go语言版)
🚀 力扣热题 73:矩阵置零(详解 多种解法) 📌 题目描述 给定一个 m x n 的整数矩阵 matrix,如果一个元素为 0,则将其所在行和列的所有元素都设为 0。请你 原地 使用常量空间解决。 Ἲ…...
OminiAdapt:学习跨任务不变性,实现稳健且环境-觉察的机器人操作
25年3月来自中科大、北理工和中科院自动化所的论文“OminiAdapt: Learning Cross-Task Invariance for Robust and Environment-Aware Robotic Manipulation”。 随着具身智能的快速发展,利用大规模人体数据对人形机器人进行高水平的模仿学习,成为学术界…...
Vue3中父组件将一个ref定义的对象类型传递给子组件的解包机制
在Vue3中,当父组件将一个ref定义的对象类型传递给子组件时,子组件接收到的不是原始的Ref类型,而是该ref的.value值,即被解包后的响应式对象。具体行为如下: 关键点解析: 自动解包机制: Vue3在模…...
批量将 SVG 转换为 jpg/png/Word/PDF/ppt 等其它格式
SVG(可缩放矢量图形)是一种广泛使用的图像格式,因其矢量特性在不同分辨率下都能保持清晰,但在某些情况下,用户可能需要将 SVG 格式的图片转换为更常见的位图格式,如 JPG、PNG 等,以适应不同平台…...
微服务篇——SpringCloud
服务注册 Spring Cloud5大组件有哪些? 服务注册和发现是什么意思?Spring Cloud如何实现服务注册发现? nacos与eureka的区别 负载均衡 如何实现负载均衡? Ribbon负载均衡的策略有哪些? 如何自定义负载均衡的策略&…...
Windows 11 家庭中文版 安装docker desktop 无法开启自启动问题处理
前言 我在某台Windows 11家庭中文版的电脑上安装Docker Desktop后,老是无法开机启动,已经按照Docker Desktop 设置调整的方式设置了开机启动,但是重启后发现还是无法自启动,需要手动点击启动。然后使用任务计划程序新建一个开机启…...
蓝桥杯备考
先浅学一遍数据结构,不会拉倒,找点简单题练练语法基础 然后边学边刷二分查找和双指针 递归和暴力,边学边刷 学习贪心,练个几十道 再去过下数据结构 开始算法:搜索,动态规划, 搜索很重要,深…...
Elasticsearch 系列专题 - 第一篇:Elasticsearch 入门
Elasticsearch 是一个功能强大的开源分布式搜索和分析引擎,广泛应用于日志分析、实时搜索、数据可视化等领域。本篇将带你了解 Elasticsearch 的基本概念、安装方法以及简单操作,帮助你快速上手。 1. 什么是 Elasticsearch? 1.1 Elasticsearch 的定义与核心概念 Elasticse…...
【LeetCode 题解】数据库:1321.餐馆营业额变化增长
一、问题描述 本题给定了一个名为 Customer 的表,记录了餐馆顾客的交易数据,包括顾客 ID、姓名、访问日期和消费金额。作为餐馆老板,我们的任务是分析营业额的变化增长情况,具体来说,就是计算以 7 天(某日…...
Apache Nifi安装与尝试
Apache NIFI中文文档 地址:https://nifichina.github.io/ 下载安装配置 1、环境准备 Nifi的运行需要依赖于java环境,所以本机上需要安装java环境,并配置环境变量。 1.1查看本机是否已经存在java环境 请先执行以下命令找出系统中真实可用…...
【Git 常用操作指令指南】
一、初始化与配置 1. 设置全局账户信息 git config --global user.name "用户名" # 设置全局用户名 git config --global user.email "邮箱" # 设置全局邮箱 --global 表示全局生效,若需针对单个仓库配置,可省略该参数 2.…...
Django 生成PDF文件
在这里,我们将学习如何使用Django视图设计和生成PDF文件。我们将使用ReportLab Python PDF库生成PDF,该库可以创建定制的动态PDF文件。 这是一个开源库,可以通过在Ubuntu中使用以下命令轻松下载。 $ pip install reportlab Python Copy …...
多账户使用Github的场景,设置 SSH 多账号使用特定 key
遇到多账户使用Github的场景,常难以管理ssh文件 解决方案: 你可以通过配置 ~/.ssh/config 文件,生成多个SSH key 让 Git 识别不同 key 来对应不同 GitHub 账号。 ✅ 正确的 key 类型有这些常见选项: rsa:老牌算法&a…...
js中this指向问题
在js中,this关键字的指向是一个比较重要的概念,它的值取决于函数的调用方式。 全局状态下 //全局状态下 this指向windowsconsole.log("this", this);console.log("thiswindows", this window); 在函数中 // 在函数中 this指向win…...
BabelDOC ,开源的 AI PDF 翻译工具
BabelDOC 是一款开源智能 PDF 翻译工具,专门为科学论文的翻译而设计。它能够在原文旁边生成翻译文本,实现双语对照,用户无需频繁切换窗口,极大提升了阅读的便利性。此外,BabelDOC 能够完整保留数学公式、表格和图形&am…...
Dify 生成提示词的 Prompt
Dify 生成提示词的 Prompt **第1次提示词****第2次提示词****第3次提示词**总结 Dify 生成提示词是,会和LLM进行3次交互,下面是和LLM进行交互是的Prompt。 以下是每次提示词的概要、目标总结以及原始Prompt: 第1次提示词 概要: …...
在nvim的snippet补全片段中增加函数注释的功能
一、补全片段路径 如果使用nvim,应当在nvim的snippet的插件中增加对应补全的片段,目前我所用的补全的片段路径如下: /home/zhaoky/.local/share/nvim/site/pack/packer/start/vim-snippets.git/snippets我当前补全的是c语言所以使用的片段是c.snippets…...
阿里云负载均衡为何费用高昂?——深度解析技术架构与市场定价策略
本文深度解析阿里云负载均衡(SLB)产品的定价体系,从技术架构、安全防护、合规成本三个维度揭示费用构成逻辑。通过2023年某跨国企业遭受的混合型DDoS攻击案例,结合Gartner最新安全支出报告,给出企业级负载均衡成本优化…...
大数据(7)Kafka核心原理揭秘:从入门到企业级实战应用
目录 一、大数据时代的技术革命1.1 消息中间件演进史1.2 Kafka核心设计哲学 二、架构深度解构2.1 核心组件拓扑2.1.1 副本同步机制(ISR) 2.2 生产者黑科技2.3 消费者演进路线 三、企业级应用实战3.1 金融行业实时风控3.2 物联网数据管道 四、生产环境优化…...
01背包 Java
① 记忆化搜索解法: import java.util.*; import java.io.*;public class Main {static int n, m;static int[] v, w;static int[][] memory; // 记忆化数组public static void main(String[] args) throws Exception {BufferedReader br new BufferedReader(new …...
【Kafka基础】消费者命令行完全指南:从基础到高级消费
Kafka消费者是消息系统的关键组成部分,掌握/export/home/kafka_zk/kafka_2.13-2.7.1/bin/kafka-console-consumer.sh工具的使用对于调试、测试和监控都至关重要。本文将全面介绍该工具的各种用法,帮助您高效地从Kafka消费消息。 1 基础消费模式 1.1 从最…...
Seq2Seq - 编码器(Encoder)和解码器(Decoder)
本节实现一个简单的 Seq2Seq(Sequence to Sequence)模型 的编码器(Encoder)和解码器(Decoder)部分。 重点把握Seq2Seq 模型的整体工作流程 理解编码器(Encoder)和解码器(…...
@SchedulerLock 防止分布式环境下定时任务并发执行
背景 在一个有多个服务实例的分布式系统中,如果你用 Scheduled 来定义定时任务,所有实例都会执行这个任务。ShedLock 的目标是只让一个实例在某一时刻执行这个定时任务。 使用步骤 引入依赖 当前以redisTemplate为例子,MongoDB、Zookeeper…...
【力扣hot100题】(077)跳跃游戏
我最开始的想法还是太单纯了,最开始想着用回溯法,然后想到上一题的经验又想到了动态规划,虽然知道贪心题不太可能会这么复杂但实在想不出别的办法……果然我的智商做贪心题的极限就只能达到找零问题那种水平…… 最开始的方法,击…...
多光谱相机:林业监测应用(病虫害、外来物种、森林防火识别)
随着气候变暖和人类活动的增加,森林火灾发生的频率和强度都有所上升,而我国森林防火基础设施薄弱,监测预警体系不够完善,扑救能力和应急响应能力有待提高。气候变化导致气温升高、降水分布不均等,影响了树木的生长和发…...
Dynamic Programming(LeetCode 740)
740. 删除并获得点数 相关企业提示给你一个整数数组 nums ,你可以对它进行一些操作。 每次操作中,选择任意一个 nums[i] ,删除它并获得 nums[i] 的点数。之后,你必须删除 所有 等于 nums[i] - 1 和 nums[i] 1 的元素。 开始你…...
虚拟列表react-virtualized使用(npm install react-virtualized)
1. 虚拟化列表 (List) // 1. 虚拟化列表 (List)import { List } from react-virtualized; import react-virtualized/styles.css; // 只导入一次样式// 示例数据 const list Array(1000).fill().map((_, index) > ({id: index,name: Item ${index},description: This is i…...
[特殊字符] 手机连接车机热点并使用 `iperf3` 测试网络性能
好的,以下是根据你的描述整理出来的步骤及解释: 📶 手机连接车机热点并使用 iperf3 测试网络性能 本文将通过 iperf3 来测试手机和车机之间的网络连接性能。我们会让车机作为服务端,手机作为客户端,进行 UDP 流量传输…...
C#,VB.NET正则表达式法替换代码
如何设置必须是MGBOX开头, msgbox这种注释自动跳过 在 Visual Studio 中使用 Ctrl H 进行替换操作时,若要确保仅替换以 MsgBox 开头的代码,同时跳过注释里的 MsgBox,可以利用正则表达式来实现。以下为你详细介绍操作步骤: 1. 打…...
从MySQL快速上手大数据Hive
从MySQL快速上手大数据Hive Hive简介 hive是基于Hadoop构建的一套数据仓库分析系统,它提供了丰富的SQL查询方式(DML)来分析存储在Hadoop分布式文件系统中的数据: 可以将结构化的数据文件映射为一张数据库表,并提供完整的SQL查…...
基于华为云kubernetes的应用多活的示例
1 概述 为避免地域级别的故障,需要将单机房架构变成双地域架构(两个机房物理距离越远,网络延时越大,网延时是业务研发首先关注的)。单边写的多机房架构,是落地性比较大的一个方案,相对于单元化…...
Linux动态库 vs 静态库:创建步骤与优缺点对比
Linux系列 文章目录 Linux系列前言一、动静态库的概念引入1.1 库的基本概念1.2 静态库(Static Library)1.3 动态库(Dynamic Library)1.4 动静态库的核心区别 二、动静态库的实现2.1 静态库的创建及使用2.2 动态库的创建和使用三、…...
分析下HashMap容量和负载系数,它是怎么扩容的?
很好,我们继续深入分析 HashMap 中 容量(capacity) 和 负载因子(load factor),以及它是如何进行 扩容(resize) 的。 🧱 一、容量(capacity)与负载…...
Linux权限管理:从入门到实践
目录 引言 编辑一、Linux用户类型 二、文件访问者分类 三、文件类型和访问权限 (一)文件类型 (二)基本权限 四、文件访问权限设置方法 (一)chmod命令 (二)chown命令 &…...
计算机网络(1)
名称解析 名称解析:将名称解析成对应地址,名字-->IP 名称解析优点:便以记忆、解耦(断开直接的练习) 容器 mini的虚拟机,该容器地址是动态的、生命周期短暂;可实现登录功能 如果用户想要登录该…...
第十一天 - MySQL/SQLite操作 - 数据库备份脚本 - 练习:监控数据存储系统
数据库实战入门:从零构建监控数据存储系统 前言 在物联网和系统监控领域,数据存储是核心基础环节。本文将通过MySQL/SQLite操作、数据库备份脚本和监控数据存储实战三个模块,带领初学者快速掌握数据库在真实场景中的应用。文章包含25个代码…...
编写文生视频提示词,制作抖音爆款视频
编写文生视频提示词,制作抖音爆款视频 一、理解文生视频提示词1.1 定义提示词1.1.1 提示词与创作工具的关系1.1.2 文生视频的功能 1.2 提示词的组成1.2.1 主体(Subject)1.2.2 动作(Action)1.2.3 场景(Scene…...
Linux: 线程控制
目录 一 前言 二 线程控制 1. POSIX线程库(原生线程库) 2. 创建线程 2.1 pthread_create 2.2pthread_self()获取线程id 3.线程终止 3.1.return 方式 3.2 pthread_exit 4 线程等待 三 理解线程tid 一 前言 在上一篇文章中我们已经学习了线程的概念,线程的创…...
为什么 npm list -g 没显示 node_modules?✨
揭秘:为什么 npm list -g 没显示 node_modules?🕵️♂️✨ 嗨,各位代码探险家!👋 今天我们要破解一个 npm 小谜团:运行 npm list -g --depth0 时,为什么输出的路径里看不到 node_…...