当前位置: 首页 > news >正文

流批一体计算引擎-7-[Flink]的DataStream连接器

参考官方手册DataStream Connectors

1 DataStream连接器概述

一、预定义的Source和Sink
一些比较基本的Source和Sink已经内置在Flink里。
1、预定义data sources支持从文件、目录、socket,以及collections和iterators中读取数据。
2、预定义data sinks支持把数据写入文件、标准输出(stdout)、标准错误输出(stderr)和 socket。
二、附带的连接器
连接器可以和多种多样的第三方系统进行交互。

目前支持以下系统:
Apache Kafka 					(source/sink)*****
Apache Cassandra 				(sink)
Amazon DynamoDB 				(sink)
Amazon Kinesis Data Streams 	(source/sink)
Amazon Kinesis Data Firehose 	(sink)
Elasticsearch 					(sink)
Opensearch 						(sink)
FileSystem 						(sink)
RabbitMQ 						(source/sink)
Google PubSub 					(source/sink)
Hybrid Source 					(source)
Apache Pulsar 					(source)
JDBC 							(sink)*****

请记住,在使用一种连接器时,通常需要额外的第三方组件,比如:数据存储服务器或者消息队列
要注意这些列举的连接器是Flink工程的一部分,包含在发布的源码中,但是不包含在二进制发行版中。

apache-flink 1.15.3使用FlinkKafkaConsumer和FlinkKafkaProducer
apache-flink 1.16.0使用KafkaSource和KafkaSink(推荐)注意:FlinkKafkaConsumer和FlinkKafkaProducer已被弃用
并且将在Flink 1.17中移除

2 Apache Kafka连接器

2.1 依赖

Flink 提供了Apache Kafka连接器使用精确一次(Exactly-once)的语义在Kafka topic中读取和写入数据。

Apache Flink集成了通用的Kafka连接器,它会尽力与Kafka client的最新版本保持同步。该连接器使用的Kafka client版本可能会在Flink版本之间发生变化。当前Kafka client向后兼容 0.10.0 或更高版本的 Kafka broker。

为了在PyFlink作业中使用Kafka connector,需要添加下列依赖:
若使用Kafka source,flink-connector-base也需要包含在依赖中:
在https://mvnrepository.com/里输入flink kafka寻找对应版本的连接器。
flink-connector-base-1.16.0.jar
flink-connector-kafka-1.16.0.jar
kafka-clients-2.8.1.jar拷贝到/usr/local/lib/python3.6/dist-packages/pyflink/lib。
拷贝到FLINK_HOME/lib。
拷贝到IDEA/External/.../pyflink/lib。

启动kafka

zkServer.sh start
cd /usr/local/kafka/
./bin/kafka-server-start.sh -daemon ./config/server0.properties

2.2 Kafka Source

2.2.1 基本概念

一、以下属性在构建KafkaSource时是必须指定的

1、Bootstrap server,通过setBootstrapServers(String)方法配置。
2、消费者组ID,通过setGroupId(String)配置。
3、要订阅的Topic / Partition。
4、用于解析Kafka消息的反序列化器(Deserializer)

二、Kafka Source提供了3种Topic / Partition的订阅方式

1、Topic列表,订阅Topic列表中所有Partition的消息:
KafkaSource.builder().set_topics("topic-a", "topic-b")2、正则表达式匹配,订阅与正则表达式所匹配的Topic下的所有Partition:
KafkaSource.builder().set_topic_pattern("topic.*")3、Partition列表,订阅指定的Partition:
partition_set = {KafkaTopicPartition("topic-a", 0),KafkaTopicPartition("topic-b", 5)
}
KafkaSource.builder().set_partitions(partition_set)

三、消息解析
代码中需要提供一个反序列化器(Deserializer)来对Kafka的消息进行解析。 反序列化器通过setDeserializer(KafkaRecordDeserializationSchema)来指定,其中 KafkaRecordDeserializationSchema定义了如何解析Kafka的ConsumerRecord。

如果只需要Kafka消息中的消息体(value)部分的数据,可以使用KafkaSource构建类中的 setValueOnlyDeserializer(DeserializationSchema)方法,其中DeserializationSchema定义了如何解析Kafka消息体中的二进制数据。

也可使用Kafka提供的解析器来解析Kafka消息体。例如使用StringDeserializer来将Kafka消息体解析成字符串:
目前PyFlink只支持set_value_only_deserializer来自定义Kafka消息中值的反序列化.

KafkaSource.builder().set_value_only_deserializer(SimpleStringSchema())

四、起始消费位点
Kafka source能够通过位点初始化器(OffsetsInitializer)来指定从不同的偏移量开始消费 。内置的位点初始化器包括:

KafkaSource.builder()# 从消费组提交的位点开始消费,不指定位点重置策略.set_starting_offsets(KafkaOffsetsInitializer.committed_offsets()) \# 从消费组提交的位点开始消费,如果提交位点不存在,使用最早位点.set_starting_offsets(KafkaOffsetsInitializer.committed_offsets(KafkaOffsetResetStrategy.EARLIEST)) \# 从时间戳大于等于指定时间戳(毫秒)的数据开始消费.set_starting_offsets(KafkaOffsetsInitializer.timestamp(1657256176000)) \# 从最早位点开始消费.set_starting_offsets(KafkaOffsetsInitializer.earliest()) \# 从最末尾位点开始消费.set_starting_offsets(KafkaOffsetsInitializer.latest())

如果未指定位点初始化器,将默认使用OffsetsInitializer.earliest()。
五、有界/无界模式
Kafka Source支持流式和批式两种运行模式。默认情况下,KafkaSource设置为以流模式运行,因此作业永远不会停止,直到Flink作业失败或被取消。

可以使用setBounded(OffsetsInitializer)指定停止偏移量使Kafka Source以批处理模式运行。当所有分区都达到其停止偏移量时,Kafka Source会退出运行。

流模式下运行通过使用setUnbounded(OffsetsInitializer)也可以指定停止消费位点,当所有分区达到其指定的停止偏移量时,Kafka Source会退出运行。
六、其他属性
除了上述属性之外,您还可以使用setProperties(Properties)和setProperty(String, String) 为Kafka Source和Kafka Consumer设置任意属性。
七、动态分区检查
为了在不重启Flink作业的情况下处理Topic扩容或新建Topic等场景,可以将Kafka Source 配置为在提供的Topic / Partition订阅模式下定期检查新分区。要启用动态分区检查,请将 partition.discovery.interval.ms 设置为非负值:

KafkaSource.builder() \.set_property("partition.discovery.interval.ms", "10000")  # 每10秒检查一次新分区# 分区检查功能默认不开启。需要显式地设置分区检查间隔才能启用此功能。

八、事件时间和水印
默认情况下,Kafka Source使用Kafka消息中的时间戳作为事件时间。您可以定义自己的水印策略(Watermark Strategy) 以从消息中提取事件时间,并向下游发送水印:

env.fromSource(kafkaSource, new CustomWatermarkStrategy(), 
"Kafka Source With Custom Watermark Strategy");

九、空闲
如果并行度高于分区数,Kafka Source 不会自动进入空闲状态。您将需要降低并行度或向水印策略添加空闲超时。如果在这段时间内没有记录在流的分区中流动,则该分区被视为“空闲”并且不会阻止下游操作符中水印的进度。

十、消费位点提交
Kafka source在checkpoint完成时提交当前的消费位点 ,以保证Flink的checkpoint状态和 Kafka broker上的提交位点一致。如果未开启checkpoint,Kafka source依赖于Kafka consumer内部的位点定时自动提交逻辑,自动提交功能由enable.auto.commit和 auto.commit.interval.ms两个Kafka consumer配置项进行配置。

注意:Kafka source不依赖于broker上提交的位点来恢复失败的作业。提交位点只是为了上报Kafka consumer和消费组的消费进度,以在broker端进行监控。

2.2.2 应用示例

Kafka Source提供了构建类来创建KafkaSource的实例。以下代码片段展示了如何构建 KafkaSource来消费“input-topic”最早位点的数据, 使用消费组“my-group”,并且将 Kafka消息体反序列化为字符串:

# -*- coding: UTF-8 -*-
from pyflink.common import SimpleStringSchema, WatermarkStrategy
from pyflink.datastream import StreamExecutionEnvironment
from pyflink.datastream.connectors.kafka import KafkaSource, KafkaOffsetsInitializerenv = StreamExecutionEnvironment.get_execution_environment()
env.set_parallelism(1)brokers = "192.168.43.48:9092"
source = KafkaSource.builder() \.set_bootstrap_servers(brokers) \.set_topics("test") \.set_group_id("my-group") \.set_starting_offsets(KafkaOffsetsInitializer.earliest()) \.set_value_only_deserializer(SimpleStringSchema()) \.build()ds = env.from_source(source, WatermarkStrategy.no_watermarks(), "Kafka Source")
ds.print()
env.execute()

2.3 Kafka Sink

2.3.1 基本概念

一、以下属性在构建 KafkaSink 时是必须指定的

1、Bootstrap servers, setBootstrapServers(String)2、消息序列化器(Serializer), 
setRecordSerializer(KafkaRecordSerializationSchema)3、如果使用DeliveryGuarantee.EXACTLY_ONCE的语义保证,
则需要使用setTransactionalIdPrefix(String)

二、序列化器
构建时需要提供KafkaRecordSerializationSchema来将输入数据转换为Kafka的 ProducerRecord。Flink提供了schema构建器以提供一些通用的组件,例如消息键(key)/消息体(value)序列化、topic选择、消息分区,同样也可以通过实现对应的接口来进行更丰富的控制。

KafkaRecordSerializationSchema.builder() \.set_topic_selector(lambda element: <your-topic-selection-logic>) \.set_value_serialization_schema(SimpleStringSchema()) \.set_key_serialization_schema(SimpleStringSchema()) \# set partitioner is not supported in PyFlink.build()

其中消息体(value)序列化方法和topic的选择方法是必须指定的,此外也可以通过 setKafkaKeySerializer(Serializer)或setKafkaValueSerializer(Serializer)来使用Kafka提供而非Flink提供的序列化器。

三、容错
KafkaSink总共支持三种不同的语义保证(DeliveryGuarantee)。
对于 DeliveryGuarantee.AT_LEAST_ONCE和DeliveryGuarantee.EXACTLY_ONCE,Flink checkpoint必须启用。
默认情况下KafkaSink使用DeliveryGuarantee.NONE。
以下是对不同语义保证的解释:

1、DeliveryGuarantee.NONE不提供任何保证:消息有可能会因Kafka broker的原因发生丢失或因Flink的故障发生重复。

2、DeliveryGuarantee.AT_LEAST_ONCE: sink在checkpoint时会等待Kafka缓冲区中的数据全部被Kafka producer确认。消息不会因Kafka broker端发生的事件而丢失,但可能会在Flink重启时重复,因为Flink会重新处理旧数据。

3、DeliveryGuarantee.EXACTLY_ONCE: 该模式下,Kafka sink会将所有数据通过在checkpoint时提交的事务写入。因此,如果consumer只读取已提交的数据,在Flink发生重启时不会发生数据重复。然而这会使数据在checkpoint完成时才会可见,因此请按需调整checkpoint的间隔。
请确认事务ID的前缀(transactionIdPrefix)对不同的应用是唯一的,以保证不同作业的事务 不会互相影响!此外,强烈建议将Kafka的事务超时时间调整至远大于checkpoint最大间隔 + 最大重启时间,否则Kafka对未提交事务的过期处理会导致数据丢失。

四、数据丢失
根据你的Kafka配置,即使在Kafka确认写入后,你仍然可能会遇到数据丢失。特别要记住在 Kafka 的配置中设置以下属性:

acks
log.flush.interval.messages
log.flush.interval.ms
log.flush.*

上述选项的默认值是很容易导致数据丢失的。

2.3.2 应用示例

# -*- coding: UTF-8 -*-
from pyflink.common import SimpleStringSchema, WatermarkStrategy
from pyflink.datastream import StreamExecutionEnvironment
from pyflink.datastream.connectors.kafka import KafkaSource, KafkaOffsetsInitializer, KafkaSink, \KafkaRecordSerializationSchemaenv = StreamExecutionEnvironment.get_execution_environment()
env.set_parallelism(1)brokers = "192.168.43.48:9092"
source = KafkaSource.builder() \.set_bootstrap_servers(brokers) \.set_topics("test") \.set_group_id("my-group") \.set_starting_offsets(KafkaOffsetsInitializer.earliest()) \.set_value_only_deserializer(SimpleStringSchema()) \.build()ds = env.from_source(source, WatermarkStrategy.no_watermarks(), "Kafka Source")record_serializer = KafkaRecordSerializationSchema.builder() \.set_topic("tt") \.set_value_serialization_schema(SimpleStringSchema()) \.build()sink = KafkaSink.builder() \.set_bootstrap_servers(brokers) \.set_record_serializer(record_serializer) \.build()
ds.sink_to(sink)
env.execute()

3 JDBC连接器

该连接器可以向 JDBC 数据库写入数据。

3.1 依赖

已创建的JDBC Sink能够保证至少一次的语义。 更有效的精确执行一次可以通过upsert语句或幂等更新实现。

(1)在https://mvnrepository.com/里输入flink jdbc寻找对应版本的连接器。
flink-connector-jdbc-1.16.0.jar
mysql-connector-java-8.0.19.jar(2)查看mysql版本
select version()
8.0.19

3.2 创建表

DROP TABLE IF EXISTS `books`;
CREATE TABLE `books` (`id` int NOT NULL,`title` varchar(255) DEFAULT NULL,`authors` varchar(255) DEFAULT NULL,`year` int DEFAULT NULL,PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

3.3 应用示例

# -*- coding: UTF-8 -*-
from pyflink.common import Types
from pyflink.datastream import StreamExecutionEnvironment
from pyflink.datastream.connectors.jdbc import JdbcSink, JdbcConnectionOptionsenv = StreamExecutionEnvironment.get_execution_environment()
env.set_parallelism(1)type_info = Types.ROW([Types.INT(), Types.STRING(), Types.STRING(), Types.INT()])
ds = env.from_collection([(101, "Stream", "Fabian", 2019),(102, "Streaming", "Tyle", 2018),(103, "Designing", "Martin", 2017),(104, "Kafka", "Gwen", 2017)], type_info=type_info)
ds.add_sink(JdbcSink.sink("insert into books (id, title, authors, year) values (?, ?, ?, ?)",type_info,JdbcConnectionOptions.JdbcConnectionOptionsBuilder().with_url('jdbc:mysql://localhost:3306/test?useSSL=false&serverTimezone=UTC').with_driver_name('com.mysql.cj.jdbc.Driver').with_user_name('root').with_password('bigdata').build()
))env.execute()

在这里插入图片描述

相关文章:

4、单行函数

最近项目要用到Oracle,奈何之前没有使用过,所以在B站上面找了一个学习视频,用于记录学习过程以及自己的思考。 视频链接: 【尚硅谷】Oracle数据库全套教程,oracle从安装到实战应用 如果有侵权,请联系删除,谢谢。本文主要讲解以下几点:SQL中不同类型的函数在 SELECT 语句…...

PaliGemma 正式发布 — Google 最新发布的前沿开放视觉语言模型

PaliGemma 是 Google 推出的新一代视觉语言模型家族,能够接收图像与文本输入并生成文本输出。 Google 团队已推出三种类型的模型:预训练(PT)模型、混合模型和微调(FT)模型,这些模型分辨率各异,提供多种精度以便使用。 所有模型均在 Hugging Face Hub 的模型库中发布,配…...

Centos Mysql 主从备份

1、主库 设置 my.cnf server_id = 2 必须唯一 binlog-do-db = abo-assist 备份的数据库 log-bin=mysql-bin 开启 binlog 创建同步账号并授权 CREATE USER repl@% IDENTIFIED WITH mysql_native_password BY 123456; GRANT REPLICATION SLAVE ON . TO repl@%; flush privileges;…...

NOIP2024模拟赛7:纯粹当下

直到理想执着当下纯粹NOIP2024模拟赛7:纯粹当下 今日挂分:95pts...... T2\(T\) 组数据, 每组给定 \(n,k,f,a_i\), 一个序列 \(b\) 满足 \(b_i \in [a_i-k,a_i]\), 记 \(g\) 表示至多删去序列中 \(f\) 个数后, 使得剩余所有数的 \(\gcd\), 求 \(g\) 的集合并输出. 标签:转化,调…...

基于java处理一些有规律的字符串

根据相同的符号进行分割的字符串转为list数组String reviewerOaGroup = "张三,李四,王五";//使用三元运算符如果reviewerOaGroup包含某个字符则根据该字符进行分割然后把每一项放入list中,如果不含有该字符则直接把该字符串放入listList<String> reviewerOaGr…...

如何征服工程题

众所周知,在 THU 系列夏令营/冬令营中往往会碰到一些要求手搓 cpu 的工程题。所以你需要学会一些面向对象编程的技巧。 当然下面讲的完全不是面向对象编程。 语言基础 先上网址:cppreference。 C++ 程序是由声明构成的。 全局变量的定义、函数的定义都是声明。 变量 抽象的就…...

流批一体计算引擎-7-[Flink]的DataStream连接器

参考官方手册DataStream Connectors 1 DataStream连接器概述 一、预定义的Source和Sink 一些比较基本的Source和Sink已经内置在Flink里。 1、预定义data sources支持从文件、目录、socket&#xff0c;以及collections和iterators中读取数据。 2、预定义data sinks支持把数据写…...

测试篇(三):测试用例的万能公式、对水杯和登录页面设计测试用例、测试用例的设计方法

目录一、测试用例的万能公式二、对登录页面设计测试用例三、测试用例的设计方法3.1 基于需求的设计方法3.2 等价类3.3 边界值3.4 判定表3.5 正交排列3.6 场景设计法3.7 错误猜测法四、面试真题一、测试用例的万能公式 首先&#xff0c;为"水杯"设计一个测试用例&…...

【进击的算法】基础算法——怎么优雅地控制边界范围

学习范围 &#xff1a; ✔️数组 ✔️边界控制本文作者 &#xff1a; 蓝色学者i 边界控制的艺术前言一、为什么需要控制边界&#xff1f;二、怎么优雅地控制边界&#xff1f;三、令人抓狂的二分查找3.1 题目概述3.2解题思路3.3 解决方案方案一&#xff1a;边界都有效方案二&…...

linux基本功系列之-rpm命令实战

文章目录前言&#x1f680;&#x1f680;&#x1f680;一. rpm命令介绍1.1 RPM包介绍1.2 rpm包的优缺点1.3 rpm包获取方式二. 语法格式及常用选项2.1 RPM安装常用参数2.2 rpm格式介绍三. 应用案例3.1 从本地安装软件包3.2 查询lrzsz的包有没有安装3.3 查询命令是哪个包安装的3.…...

冯诺依曼体系结构及操作系统(OS)的简单认识

文章目录冯诺依曼体系结构操作系统&#xff08;Operator System&#xff09;冯诺依曼体系结构 冯诺依曼结构也称普林斯顿结构&#xff0c;是一种将程序指令存储器和数据存储器合并在一起的存储结构。数学家冯诺依曼提出了计算机制造的三个基本原则&#xff0c;即采用二进制逻辑…...

day4 24. 两两交换链表中的节点 ● 19.删除链表的倒数第N个节点 ●160 链表相交 ● 142.环形链表II

两两交换链表中的节点 链表的指针&#xff0c;要仔细画图&#xff0c;搞清楚cur和cur的next在哪里 这个题还是有点绕的&#xff0c;两两一组交换&#xff0c;还有奇偶数要考虑 class Solution { public:ListNode* swapPairs(ListNode* head) {ListNode* dummyhead new ListNo…...

【Linux】目录权限和默认权限

上期介绍了Linux的文件权限&#xff0c;这期我们仔细来说说Linux环境下目录权限和默认权限一、目录权限1.1 进入目录所需的权限我们在进入目录时需要什么样的权限呢&#xff1f;是r、w还是x呢&#xff1f;下面我们一起来验证一下&#xff1a;&#x1f4cb;如下我门拥有全部目录…...

kaggle竞赛 | 计算机视觉 | 数字图像基础操作

目录cv2基本操作图片哈希图像数据扩展无监督数据扩展方法监督式数据扩展方法cv2基本操作 import numpy as np import matplotlib.pyplot as plt import cv2img cv2.imread(cat.jpeg) plt.imshow(img)img cv2.imread(cat.jpeg) img cv2.cvtColor(img, cv2.COLOR_BGR2RGB) pl…...

7. 好客租房-项目日常推进ing

7. 好客租房-项目日常推进ing 本章节不涉及大量内容,主要是为了推荐项目代码日常进度而设置, 包括添加mock接口, 添加更新房源接口, 为系统添加缓存. 7.1 为前端系统提供mock服务 往往在项目开发中, 为实现前后端并行开发&#xff0c;后端需要对前端所有的请求都都进行支持。…...

前同事居然因为 Pycharm 的这个功能,即使离职三年也依然经常被请去喝茶~

大家好&#xff0c;我是 哈士奇 &#xff0c;一位工作了十年的"技术混子"&#xff0c; 致力于为开发者赋能的UP主, 目前正在运营着 TFS_CLUB社区。 &#x1f4ac; 人生格言&#xff1a;优于别人,并不高贵,真正的高贵应该是优于过去的自己。&#x1f4ac; &#x1f4e…...

python使用类装饰器生成函数的使用日志

1 什么是类装饰器 在了解类装饰器之前&#xff0c;建议大家先了解装饰器的概念。 装饰器知识快速入门链接 类装饰器是 Python 中的一种特殊类型的装饰器&#xff0c;它是一个类而不是一个函数。与函数装饰器不同&#xff0c;类装饰器可以在运行时接收参数并返回一个可调用的对…...

有关Android的TextView组件的几个问题

文章目录小结问题及解决参考小结 TextView组件与EditText类似&#xff0c;但有一些不同&#xff0c;理论上TextView是只读的。尝试了让TextView组件可以弹出SetError的提示信息&#xff0c;只读&#xff0c;并不能弹出Android软键盘。 问题及解决 如果需要将TextView组件不能…...

Spring核心模块解析—BeanDifinition。

BeanDifinition前言什么是BeanDefinition&#xff1f;为什么要有BeanDefinition&#xff1f;BeanDifinition重点源码总结前言 Spring中的BeanDifinition在Bean的实例化流程中占有着非常重要的角色&#xff0c;如果你不了解BeanDifinition的话&#xff0c;面试或者学习Bean的生…...

【目标跟踪】------deepsort

目前主流的目标跟踪算法都是基于Tracking-by-Detecton策略,即基于目标检测的结果来进行目标跟踪。DeepSORT运用的就是这个策略,上面的视频是DeepSORT对人群进行跟踪的结果,每个bbox左上角的数字是用来标识某个人的唯一ID号。 Deepsort的前身是sort算法,sort算法的核心是卡尔…...

教你一键生成形如Springboot的高大上banner打印效果

背景 今天闲来无聊&#xff0c;想搞一个类似于Springboot项目启动时打印效果&#xff0c;如下图&#xff1a; 问题解决方案 那这个打印效果怎么实现的呢&#xff1f; 其实&#xff0c;对于这个中效果实现起来也是很简单的。毕竟依托于Springboot强大的框架&#xff0c;任何问…...

RESTful的意义及其使用规则

本文参考&#xff1a; https://javaguide.cn/system-design/basis/RESTfulAPI.html 何为 RESTful API&#xff1f; GET /classes&#xff1a;列出所有班级 POST /classes&#xff1a;新建一个班级RESTful API 可以让你看到 URLHttp Method 就知道这个 URL 是干什么的&…...

Linux产生死锁的必要条件和常见的锁种类

目录前言产生死锁的4个必要条件预防(解决)死锁Linux常见的锁互斥锁(普通锁)自旋锁互斥锁和自旋锁小结递归锁读写锁乐观锁与悲观锁乐观锁和悲观锁小结其他锁(了解)前言 之前面试的时候&#xff0c;有面试官问我产生死锁的(4个)必要条件&#xff0c;这个我之前有了解过&#xff…...

【HBase入门】8. HBase Java编程(2)——创建表、插入数据、删除数据

前言 本文是HBase Java编程&#xff08;2&#xff09;——创建表、插入数据、删除数据。 需求一&#xff1a;使用Java代码创建表 创建一个名为WATER_BILL的表&#xff0c;包含一个列蔟C1。 实现步骤&#xff1a; 1.判断表是否存在——存在&#xff0c;则退出 2.使用TableDe…...

【初识数据库】进入数据库的大门+数据库基本操作

前言&#xff1a; 大家好&#xff0c;我是良辰丫&#x1f353;&#x1f353;&#x1f353;&#xff0c;这个专栏我将带领大家去探索数据库的汪洋大海&#xff0c;我主要使用的数据库软件是MySQL&#xff0c;数据库软件大同小异&#xff0c;嘿嘿嘿&#xff0c;废话不多说&#x…...

Python Flask 框架设置响应头,一篇文章学明白

flask 响应头设置&#x1f4d6; 导读&#x1f4d6; Python Flask 设置响应头&#x1f389; response.headers 属性&#x1f389; flask.abort() 函数返回特定状态码&#x1f4d6; Flask 中可设置的响应头参数&#x1f4d6; 其他关于响应头的配置&#x1f381; 使用中间件&#…...

阿里“云开发“小程序(uniCould)

博主ps&#xff1a; 网上资料少的可怜&#xff0c;哎&#xff0c;腾讯云涨价了&#xff0c;论服务器&#xff0c;我肯定选的阿里&#xff0c;再着你们对比下unicould的报价就知道了&#xff0c;如果有钱就另当别论了。 所以这片博文&#xff0c;博主试过之后&#xff0c;先抛出…...

Python装饰器使用方法详解

文章目录1 装饰器背景知识1.1 基本概念1.2 应用场景2 简单的装饰器代码3 使用装饰器记录函数执行次数4 带参数的装饰器5 装饰器处理有返回值的函数1 装饰器背景知识 1.1 基本概念 装饰器&#xff08;Decorator&#xff09;是 Python 中一种函数或类&#xff0c;用来修饰其他函…...

【Leetcode每日一题】69. x 的平方根/Sqrt(x)|二分查找---day3

博主简介&#xff1a;努力学习的预备程序媛一枚~博主主页&#xff1a; 是瑶瑶子啦所属专栏: LeetCode每日一题–进击大厂 目录题目描述题目分析&#xff1a;代码分析&#xff1a;题目描述 链接: 69. x 的平方根/Sqrt(x) 给你一个非负整数 x &#xff0c;计算并返回 x 的 算术…...

2023.1完整版:适合的网盘,各大网盘对比测试,速度,安全性,可预计的未来

在网上看到过网盘对比&#xff0c;但发现还是不全&#xff0c;有时还是需要自行测试&#xff0c;所以这里我就给大家列出所有的网盘&#xff0c;也包括一些类似于网盘的平台&#xff1a; 注意&#xff1a;这里统计的平台都是至少要满足可以上传文件的网盘&#xff0c;并且包含个…...

【编程入门】开源记事本(安卓版)

背景 前面已输出多个系列&#xff1a; 《十余种编程语言做个计算器》 《十余种编程语言写2048小游戏》 《17种编程语言10种排序算法》 《十余种编程语言写博客系统》 《十余种编程语言写云笔记》 本系列对比云笔记&#xff0c;将更为简化&#xff0c;去掉了网络调用&#xff0…...

Python流程控制语句之循环语句

上一篇&#xff1a;Python流程控制语句之选择语句 文章目录前言一、while 循环二、for 循环1. 进行数值循环2. 遍历字符串三、循环嵌套总结前言 生活中很多问题都无法一次解决&#xff0c;就像谚语所说&#xff1a;罗马不是一天建成的。一些事物必须周而复始地运转才能保证其存…...

17种编程语言+10种排序算法

开源地址 https://gitee.com/lblbc/simple-works/tree/master/sort 覆盖语言&#xff1a;C、C、C#、Java、Kotlin、Dart、Go、JavaScript(JS)、TypeScript(TS)、ArkTS、swift、PHP。 覆盖平台&#xff1a;安卓(Java、Kotlin)、iOS(SwiftUI)、Flutter(Dart)、Window桌面(C#)、前…...

【JavaSE专栏8】运算符、表达式和语句

作者主页&#xff1a;Designer 小郑 作者简介&#xff1a;Java全栈软件工程师一枚&#xff0c;来自浙江宁波&#xff0c;负责开发管理公司OA项目&#xff0c;专注软件前后端开发&#xff08;Vue、SpringBoot和微信小程序&#xff09;、系统定制、远程技术指导。CSDN学院、蓝桥云…...

【c语言进阶】常见的静态通讯录

&#x1f680;write in front&#x1f680; &#x1f4dc;所属专栏&#xff1a;c语言学习 &#x1f6f0;️博客主页&#xff1a;睿睿的博客主页 &#x1f6f0;️代码仓库&#xff1a;&#x1f389;VS2022_C语言仓库 &#x1f3a1;您的点赞、关注、收藏、评论&#xff0c;是对我…...

27. 作用域

1. 定义 作用域就是一个 python 程序可以直接访问命名空间的正文区域。 在一个 python 程序中&#xff0c;直接访问一个变量&#xff0c;会从内到外依次访问所有的作用域直到找到&#xff0c;否则会报未定义的错误。 python 中&#xff0c;程序的变量并不是在哪个位置都可以访…...

笔试题-2023-华为-数字芯片【纯净题目版】

回到首页:2023 数字IC设计秋招复盘——数十家公司笔试题、面试实录 推荐内容:数字IC设计学习比较实用的资料推荐 题目背景 笔试时间:2022.07.29应聘岗位:数字IC设计题目评价 难易程度:★★★★☆知识覆盖:★★★★☆超纲范围:★☆☆☆☆值得一刷:★★★★☆文章目录 单…...

缓存失效问题和分布式锁引进

缓存失效问题 先来解决大并发读情况下的缓存失效问题&#xff1b; 1、缓存穿透  缓存穿透是指查询一个一定不存在的数据&#xff0c;由于缓存是不命中&#xff0c;将去查询数据库&#xff0c;但是数 据库也无此记录&#xff0c;我们没有将这次查询的 null 写入缓存&#x…...

千峰学习【Ajax】总结

1.同步和异步 2.Ajax状态码 3.创建对象&#xff0c;发送请求 <script>//1.创建XHR&#xff1a; new XMLHttpRequest():var xhr new XMLHttpRequest();// console.log(xhr);//2&#xff0c;配置open(请求方式&#xff0c;请求地址&#xff0c;是否异步(默认为异步)) loc…...

主流的操作系统(带你快速了解)

&#x1f4dc; “作者 久绊A” 专注记录自己所整理的Java、web、sql等&#xff0c;IT技术干货、学习经验、面试资料、刷题记录&#xff0c;以及遇到的问题和解决方案&#xff0c;记录自己成长的点滴。 &#x1f341; 操作系统【带你快速了解】对于电脑来说&#xff0c;如果说…...

【时间复杂度和空间复杂度】

1.时间复杂度时间复杂度的定义&#xff1a;在计算机科学中&#xff0c;算法的时间复杂度是一个数学函数&#xff0c;它定量描述了该算法的额外运行时间。一个算法执行所耗费的时间&#xff0c;从理论上说&#xff0c;是不能算出来的&#xff0c;只有你把你的程序放在机器上跑起…...

GPU虚拟化(留坑)

文章内容大程度参考B站王利明老师对《GPU虚拟化技术分享》的演讲&#xff1a;https://b23.tv/uQKBpcK GPU 有什么用&#xff1f; GPU可以用于图形渲染&#xff0c;也能够用于高性能计算和编解码等场景。 图&#xff1a;GPU 的典型软件架构&#xff08;不含虚拟化&#xff09; …...

排列的时候如何避免重复?

全排列问题&#xff1a;https://leetcode.cn/problems/permutations/submissions/全排列进阶&#xff08;有重复数字&#xff09;&#xff1a;https://leetcode.cn/problems/permutations-ii/solution/第一个全排列问题&#xff0c;经过千辛万苦终于理解了&#xff0c;于是来到…...

还在为ElementUI的原生校验方式苦恼吗,快用享受element-ui-verify插件的快乐吧(待续)

element-ui-verify 本文章意在介绍element-ui-verify插件使用&#xff0c;以及对比elementUI原生校验方式&#xff0c;突显该插件用少量代码也能实现原生的校验效果甚至更好。 1.先观察一个示例 <template><d2-container><el-form :model"ruleForm&qu…...

读书笔记:mini-batch学习 ← 斋藤康毅

如果以全部数据为对象求损失函数的和&#xff0c;则计算过程需要花费较长的时间。因此&#xff0c;我们从全部数据中选出一部分&#xff0c;作为全部数据的“近似”。这种学习方式称为mini-batch学习。 下面给出了从MNIST数据集的训练数据中随机抽取10笔数据的代码。【mini-bat…...

基于微信小程序的新生自助报到系统小程序

文末联系获取源码 开发语言&#xff1a;Java 框架&#xff1a;ssm JDK版本&#xff1a;JDK1.8 服务器&#xff1a;tomcat7 数据库&#xff1a;mysql 5.7/8.0 数据库工具&#xff1a;Navicat11 开发软件&#xff1a;eclipse/myeclipse/idea Maven包&#xff1a;Maven3.3.9 浏览器…...

Python ·信用卡欺诈检测【Catboost】

Python 信用卡欺诈检测【Catboost】 提示&#xff1a;前言 Python 信用卡欺诈检测 提示&#xff1a;写完文章后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录Python 信用卡欺诈检测【Catboost】前言一、导入包二、加载数据三、数据可视化四、…...

【JavaEE初阶】第六节.多线程 (基础篇 )线程安全问题(下篇)

前言 一、内存可见性 二、内存可见性的解决办法 —— volatile关键字 三、wait 和notify 关键字 3.1 wait() 方法 3.2 notify() 方法 3.3 notify All() 方法 3.4 wait 和 sleep 的对比 总结 前言 本节内容接上小节有关线程安全问题&#xff1b;本节内容我们将介绍有关…...

JAVA练习30

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 目录 前言 一、题目-加一 1.题目描述 2.思路与代码 2.1 思路 2.2 代码 总结 前言 提示&#xff1a;这里可以添加本文要记录的大概内容&#xff1a; 1月25日练习内容 …...

辗转相除以及辗转相减法

文章目录前言辗转相除法&#xff08;又名欧几里算法&#xff09;辗转相减法&#xff08;又名更相减损法&#xff09;原始辗转相减法改版辗转相减法&#xff08;减的是指数&#xff09;参考文章前言 在学习Acwing c蓝桥杯辅导课第八讲数论-AcWing 1223. 最大比例时有使用到求指…...

Java基础 IO

IO流 IO流 什么是IO流&#xff1f; 存储和读取数据的解决方案 I&#xff1a;input O&#xff1a;output 流&#xff1a;像水流一样传输数据 IO流的作用&#xff1f; 用于读写数据&#xff08;本地文件&#xff0c;网络&#xff09; IO流按照流向可以分类哪两种流&#xff1f…...

单一数字评估指标、迁移学习、多任务学习、端到端的深度学习

目录1.单一数字评估指标(a single number evaluation metric)有时候要比较那个分类器更好&#xff0c;或者哪个模型更好&#xff0c;有很多指标&#xff0c;很难抉择&#xff0c;这个时候就需要设置一个单一数字评估指标。例1&#xff1a;比较A&#xff0c;B两个分类器的性能&a…...

Linux | 一文带你真正搞懂Linux中的权限问题

在Linux下你有多少权限呢❓一、权限的基本概念二、Linux上的用户分类2.1 超级用户与普通用户2.2 用户之间的切换2.3 文件访问者的分类2.4 用户与访问者之间的联系三、文件属性与访问权限3.1 Linux下的文件类型&#xff08;1&#xff09;文件的八种类型&#xff08;2&#xff09…...

C语言深度解剖-关键字(1)

目录 1.初步了解关键字 2.第一个C程序 3.深刻理解变量 是什么&#xff1f; 怎么用&#xff1f; 为什么&#xff1f; 4.深刻理解定义与声明 5.auto关键字的理解 6.理解关键字register 认识&#xff1a; 本质&#xff1a; register 修饰变量 写在最后&#xff1a; 1…...

STM32+python产生三角波

目录任务目标实现方法python制作数表由于项目需要&#xff0c;需要产生一个三角波&#xff0c;需要覆盖4000个点的一个数组&#xff0c;这样的数组点数太多了&#xff0c;肯定不能自己一个一个手写了。最简单的一个方法是在嵌入式程序中用C写一个函数&#xff0c;对一个数组&am…...

java-List

java-List1. 预备知识-泛型(Generic)1.1 泛型的引入1.2 泛型的分类1.3 泛型类的定义的简单演示1.4 泛型背后作用时期和背后的简单原理1.5 泛型类的使用1.6 泛型总结2. 预备知识-包装类(Wrapper Class)2.1 基本数据类型和包装类直接的对应关系2.2 包装类的使用&#xff0c;装箱(…...

Python简易图书管理系统重构

在本篇课文中&#xff0c;我们将使用Python语言结合MySQL数据库&#xff0c;从零开始构建一个简单的图书管理系统。该系统旨在帮助图书馆管理员轻松管理图书的借阅、归还以及查询图书信息等日常操作。我们将分步介绍需求分析、数据库设计、环境搭建、功能实现等关键环节&#x…...

【Transformer-BEV编码(9)】Sparse4D v2 v3源代码分析。稀疏感知方向新的baseline,相机参数泛化能力差的问题。

前言&#xff1a; 基于BEV的稠密融合算法或许并不是最优的多摄融合感知框架。同时特征级的多摄融合也并不等价于BEV。这两年&#xff0c;PETR系列(PETR, PETR-v2, StreamPETR) 也取得了卓越的性能&#xff0c;并且其输出空间是稀疏的。在PETR系列方法中&#xff0c;对于每个in…...

uniapp外部scss文件使用scss语法不生效.

项目场景&#xff1a; 页面的样式重复我想提取出来作为公共样式 新建scss文件&#xff0c;然后引入&#xff0c;结果样式不生效 问题描述&#xff1a; uniapp官网示例引入css的方法 /* 绝对路径 */ import url(/common/uni.css); import url(/common/uni.css); /* 相对路径 …...

18.双线性插值缩放算法的matlab与FPGA实现

一篇文章为你讲透双线性插值 简介 1.什么是插值 图片放大是图像处理中的一个特别基础的操作。几乎在每一个图片相关的项目中&#xff0c;从传统图像处理到i深度学习&#xff0c;都有应用。   简单来说&#xff0c;插值指利用已知的点来“猜”未知的点&#xff0c;图像领域插…...

变量初始化

提示&#xff1a;文章 文章目录 前言一、背景二、 2.1 2.2 总结 前言 前期疑问&#xff1a; 本文目标&#xff1a; 一、背景 最近在写c代码的时候&#xff0c;就涉及到变量的初始化。这边的变量当然指的是局部变量和类成员变量了。类成员变量其实也是局部变量啦。 另外就…...

Redis和数据库能做到强一致吗?

在现代软件系统中&#xff0c;数据一致性是至关重要的&#xff0c;特别是对于需要处理大量并发请求和实时数据的系统。Redis 和数据库都是常见的数据存储解决方案&#xff0c;但它们在保证数据一致性方面有着不同的特点和限制。 本文将深入探讨 Redis 和数据库是否能够做到强一…...

Mac SourceTree配置ssh git仓库

一、准备条件 1、Mac系统电脑 2、安装好SourceTree 3、获取ssh git仓库地址 二、配置步骤 1、打开终端命令行 ssh -t rsa -C "xxx""xxx"代表注册git仓库时&#xff0c;使用的用户名&#xff0c;可以是字符串也可以是邮箱地址。 如果遇到输入密码&#xf…...

【奈学科技】P7大前端架构师1期

课程概述 一门专为有志于成为大前端架构师人群量身打造的课程。课程内容深度剖析大前端架构各环节核心架构&#xff08;组件化架构、微内核架构、微前端架构、前后端分离架构&#xff09;并对其进行排列组合形成大前端全局架构观以及培养架构师必备的架构思维模型。史无前例的…...

UART 16550 IP核使用详解

AXI UART 16550是Xilinx FPGA中提供的一个UART IP核&#xff0c;它允许通过AXI接口与UART设备进行通信。本文描述了如何使用Xilinx的Vivado Design Suite环境中的工具来定制和生成 UART 16550 IP核&#xff0c;以及如何配置和使用该IP核。 1 UART 16550 IP核的使用 以下是针对…...

mysql社区版最多支持多个连接并发

MySQL社区版对于并发连接数的支持并没有一个固定的上限&#xff0c;它实际上取决于多个因素&#xff0c;包括服务器的硬件配置、MySQL的配置参数以及应用程序的设计等。 硬件配置&#xff1a;服务器的CPU、内存和磁盘I/O等硬件资源会直接影响MySQL可以处理的并发连接数。例如&a…...

【Docker学习】查询容器镜像的docker search

这个命令是使用Docker的必备技能。我们使用的各种官方镜像&#xff0c;一般都能通过这个命令找到。 命令&#xff1a; docker search 描述&#xff1a; 在Docker Hub上查找镜像。Docker Hub是为开发者和开源贡献者设计的容器镜像注册中心&#xff0c;它允许用户查找、使用和…...

蓝桥杯 EDA 组 历届国赛真题解析

一、2021年国赛真题 1.1 CN3767 太阳能充电电路 CN3767 是具有太阳能电池最大功率点跟踪功能的 4A&#xff0c;12V 铅酸电池充电管理集成电路。 最大功率点应指的是电池板的输出电压&#xff0c;跟踪电压其做保护。当然 CN3767 也可以直接使用直流充电&#xff0c;具体可以阅读…...