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

Apache Kafka 入门教程

Apache Kafka 入门教程

  • 一、简介
    • 简介
    • 架构
  • 二、Kafka 安装和配置
    • JDK
    • 安装 Kafka
    • 配置文件详解
  • 三、Kafka 的基本操作
    • 启动和关闭
    • Topic 创建和删除
    • Partitions 和 Replication 配置
    • Producer 和 Consumer 使用方法
      • Producer
      • Consumer
  • 四、Kafka 高级应用
    • 消息的可靠性保证
    • Kafka Stream
    • Kafka Connect
  • 五、Kafka 集群管理
    • 集群环境的部署
    • 操作和维护集群
      • 监控和告警
      • 消息备份和恢复
      • 热点问题处理
    • 集群扩容和缩容
      • 扩容操作
      • 缩容操作
  • 六、应用案例
    • 日志收集
    • 数据同步
    • 实时处理
  • 七、优化调优
    • 性能指标优化
    • 参数配置优化
    • 架构设计优化

一、简介

简介

Apache Kafka 是由 Apache 软件基金会开发的一个开源流处理平台,用于处理实时的大规模数据流。Kafka 的目标是为了处理活跃的流式数据,包括传感器数据,网站日志,应用程序内部的消息,等等。它可以处理成千上万的消息,并让你迅速地处理和存储这些消息。在 Kafka 中,生产者负责将消息发送到 Kafka 集群中的 Broker,消费者则从 Broker 订阅并接收消息。

架构

Kafka 的架构由 Producer,Broker 和 Consumer 三部分组成,同时具备高并发、高吞吐量和分布式等特点。Producer 可以将消息发送到 Broker,Consumer 可以从 Broker 订阅和接收消息,而 Broker 则可以存储多个 Topic。一个 Topic 可以有多个 Partition,Partition 中的消息可以通过 Offset 进行管理,Kafka 中的消息以 Append-only 形式进行存储。

二、Kafka 安装和配置

JDK

  1. 下载 JDK,例如:jdk-8u291-linux-x64.tar.gz。
  2. 解压 JDK 到任意目录,例如 /usr/lib/jvm/jdk1.8.0_291。
  3. 配置环境变量,例如:
    $ export JAVA_HOME=/usr/lib/jvm/jdk1.8.0_291$ export CLASSPATH=.:$JAVA_HOME/lib:$JRE_HOME/lib:$CLASSPATH$ export PATH=$JAVA_HOME/bin:$JRE_HOME/bin:$PATH

安装 Kafka

  1. 下载 Kafka,例如:kafka_2.12-2.8.0.tgz。
  2. 解压 Kafka 到任意目录,例如 /opt/kafka。
  3. 修改配置文件,根据需要修改 server.properties 文件。

配置文件详解

Kafka 的配置文件位于 config/server.properties。下面是一些常用的配置项及其含义:

  1. broker.id,Broker 的唯一标识符。
  2. advertised.listeners,监听该 Broker 的客户端连接地址和端口。
  3. log.dirs,消息存储文件目录。
  4. zookeeper.connect,使用的 ZooKeeper 地址和端口。
  5. num.network.threads,用于处理网络请求的线程数。
  6. num.io.threads,用于处理磁盘 IO 的线程数。
  7. socket.receive.buffer.bytes 和 socket.send.buffer.bytes,用于控制 TCP 缓冲区大小。
  8. group.initial.rebalance.delay.ms,当 Consumer Group 内有 Consumer 加入或离开时,延迟多久再开始重新 balabce。
  9. auto.offset.reset,Consumer Group 在消费新的 Topic 或 Partition 时的 offset 已经不存在时,如何设置 offset,默认是 latest。

三、Kafka 的基本操作

启动和关闭

//启动Kafka
$KAFKA_HOME/bin/kafka-server-start.sh $KAFKA_HOME/config/server.properties//关闭Kafka
$KAFKA_HOME/bin/kafka-server-stop.sh

Topic 创建和删除

import kafka.admin.AdminUtils;
import kafka.utils.ZkUtils;//创建Topic
String topicName = "test";
int numPartitions = 3;
int replicationFactor = 2;
Properties topicConfig = new Properties();
AdminUtils.createTopic(zkUtils, topicName, numPartitions, replicationFactor, topicConfig);//删除Topic
AdminUtils.deleteTopic(zkUtils, topicName);

Partitions 和 Replication 配置

可以在创建Topic时指定Partitions数和Replication Factor,如果需要修改可以通过以下命令修改:

//修改Partitions数
bin/kafka-topics.sh --zookeeper localhost:2181 --alter --topic test --partitions 4//修改Replication Factor
bin/kafka-topics.sh --zookeeper localhost:2181 --alter --topic test --replication-factor 3

Producer 和 Consumer 使用方法

Producer

import org.apache.kafka.clients.producer.*;Properties props = new Properties();
props.put("bootstrap.servers", "localhost:9092");
props.put("acks", "all");
props.put("retries", 0);
props.put("batch.size", 16384);
props.put("linger.ms", 1);
props.put("buffer.memory", 33554432);
props.put("key.serializer", "org.apache.kafka.common.serialization.StringSerializer");
props.put("value.serializer", "org.apache.kafka.common.serialization.StringSerializer");Producer<String, String> producer = new KafkaProducer<>(props);
for (int i = 0; i < 100; i++)producer.send(new ProducerRecord<String, String>("test", Integer.toString(i), Integer.toString(i)));producer.close();

Consumer

import org.apache.kafka.clients.consumer.*;
import java.time.Duration;
import java.util.Collections;
import java.util.Properties;Properties props = new Properties();
props.put("bootstrap.servers", "localhost:9092");
props.put("group.id", "test");
props.put("auto.commit.interval.ms", "1000");
props.put("key.deserializer", "org.apache.kafka.common.serialization.StringDeserializer");
props.put("value.deserializer", "org.apache.kafka.common.serialization.StringDeserializer");Consumer<String, String> consumer = new KafkaConsumer<>(props);
consumer.subscribe(Collections.singletonList("test"));
while (true) {ConsumerRecords<String, String> records = consumer.poll(Duration.ofMillis(100));for (ConsumerRecord<String, String> record : records)System.out.printf("offset = %d, key = %s, value = %s%n", record.offset(), record.key(), record.value());
}

四、Kafka 高级应用

消息的可靠性保证

在 Kafka 中消息的可靠性保证是通过两种机制来实现的:支持副本机制和 ISR (In-Sync Replicas)列表。

  1. 支持副本机制
    副本机制是指一个主题(Topic)下的分区(Partition)可以有多个副本,每个副本都存储了完整的消息,其中一个副本被指定为 leader 副本,其他副本为 follower 副本。当 producer 发送消息到某个分区时,只需要发送给 leader 副本,leader 副本再将消息分发给其他 follower 副本,这样就保证了消息的可靠性。即使某个 follower 副本出现了故障,也不会影响消息的消费,因为其他副本依然存放着完整的消息。

  2. ISR (In-Sync Replicas)列表
    ISR 列表是指当前与 leader 副本保持同步的所有 follower 副本构成的列表。当某个 follower 副本落后于 leader 副本时,会从 ISR 列表中移除,直到追上 leader 副本后再加入到 ISR 列表中。这个机制保证了 Kafka 集群的高可用性,同时也保证了消息的可靠性。

  3. At least once 语义
    Kafka 默认保证的是 At least once 语义,即 “至少处理一次”,这种语义可以通过消息的重复消费来保证,但是会带来处理效率的损失。如果希望保证消息仅被处理一次,可以选择使用幂等性(Idempotence)或事务机制。

Kafka Stream

Kafka Stream 是 Kafka 生态系统中基于流处理模型的一个库。它充分利用了 Kafka 的优点,比如高吞吐、扩展性好、可靠性高等,支持实时的数据流处理和批量处理,并且操作符也非常丰富。

  1. Stream 流处理模型
    Stream 流处理模型是一种将输入数据流转换为输出数据流的模型,可以完成实时的数据处理。在 Kafka Stream 中,数据流由一个一个记录(Record)组成,每个记录由一个键(Key)和一个值(Value)构成。通过对 Stream 流处理模型的熟练掌握,可以快速开发出高效、高可靠性的流处理程序。

  2. 操作符详解
    操作符是 Kafka Stream 中最核心的概念,是用于转换数据流的最基本单元。Kafka Stream 提供了丰富的操作符,包括过滤器、映射器、聚合器、分组器等,开发者可以根据需要灵活选择。其中,映射器和聚合器是最常用的操作符,它们可以完成对数据流的各种处理和转换。

Kafka Connect

Kafka Connect 是 Kafka 生态系统中用于将数据集成到和从 Kafka 中的工具。它通过 Connector 来实现数据的传输,Kafka Connect 可以集成各种数据源和数据目的地,如文件、数据库、消息队列等。使用 Kafka Connect 可以快速的完成数据的导入和导出,并且可以实现数据的有效管理和监控。

  1. Connector 快速入门教程
    Kafka Connect 的使用非常简单,只需要编写一个 Connector 配置文件,然后启动 Kafka Connect 进程即可。在 Connector 的配置文件中,需要指定数据源和数据目的地的配置信息,并定义如何从数据源中读取数据,以及如何将数据发送到数据目的地中。

  2. 实现自定义 Connect
    如果 Kafka Connect 自带的 Connector 不能满足需求,开发者还可以自定义 Connector 来实现数据的导入和导出。开发者可以参考 Kafka Connect 源码中已经实现的 Connector 来进行开发,并根据需要完善自己的 Connector 功能。通过自定义 Connector,开发者可以灵活定制符合自己业务需求的数据接入方案。

五、Kafka 集群管理

集群环境的部署

为了部署 Kafka 集群,可以按如下步骤进行:

  1. 确保集群所有节点的操作系统都是一致的,建议使用 CentOS 7。
  2. 下载并配置 JDK,Kafka 依赖于 Java 运行环境。
  3. 下载 Kafka 安装包,解压到指定目录。
  4. 修改 Kafka 配置文件 server.properties,需要注意的配置项包括以下几个:
    • broker.id:表示当前节点的 ID,必须在所有节点中唯一。
    • listeners:用于设置 Kafka 绑定的地址和端口,其中端口号需要在每个节点上都是唯一的。建议使用 IP 地址而非主机名作为监听地址。
    • log.dirs:表示消息日志保存的路径,建议为每个节点分别设置,避免多个节点共用一个目录导致数据混乱。
    • zookeeper.connect:表示 ZooKeeper 的连接地址,ZooKeeper 是 Kafka 集群的重要组件。

操作和维护集群

Kafka 集群的运维主要包括以下几个方面:

监控和告警

Kafka 集群应该具备完善的监控和告警机制,能够及时检测和处理集群中的异常情况,防止集群的宕机或数据丢失等问题。通常使用开源监控系统,如 Prometheus、Grafana。

消息备份和恢复

为了防止消息丢失,Kafka 集群需要配置合适的备份策略,保证消息能够在系统故障或数据中心故障时依然可用。具体可以采用多副本备份策略或异地多活等方式来备份数据,也可以使用相关的数据备份工具。

热点问题处理

如果集群出现消费热点问题,需要及时排查,可以使用 Kafka 自带的 Consumer Lag 工具或第三方工具进行分析,找出出现热点的原因并制定相应的解决方案。

集群扩容和缩容

当 Kafka 集群无法满足业务需求或需要优化性能时,我们可能需要对集群进行扩容或缩容操作。

扩容操作

扩容可通过增加节点数量和调整多个配置项来进行:

  1. 增加节点数量:新增节点需要与集群中的其它节点具有相同的环境配置,包括操作系统和 Java 版本等。新增节点后需要更新 server.properties 文件,并重启 Kafka 进程才能让新节点生效。同时需要重新分配分区并执行数据迁移。
  2. 调整多个配置项:可以通过调整消息生产和消费的吞吐量、扩容 Broker 的资源、增加副本数等一系列操作来提升 Kafka 集群的性能。

缩容操作

缩容可通过减少节点数量和删除多个配置项来进行:

  1. 减少节点数量:需要首先确认是否有冗余的节点存在,如果存在冗余节点可以将其停机或从集群中移除。同时需要更新 server.properties 文件,并重启 Kafka 进程才能让缩容生效。需要注意的是,在进行节点缩容时需要重新分配分区和执行数据迁移。
  2. 删除多个配置项:可以通过调整消息保留时间、削弱单个 Broker 的吞吐量等一系列操作来缩小 Kafka 集群的规模。

在进行扩容和缩容操作前,需要通过合适的监控工具了解当前集群的状态和性能表现,根据实际需求进行配置和调整。同时使用备份策略,确保数据的完整性和可用性。

六、应用案例

日志收集

Kafka 作为一个分布式的消息队列,其在日志收集方面能够做到高效、可靠且低延迟的处理。以下是一个简单的 Java 代码示例,用于将系统日志发送到 Kafka 集群中:

import org.apache.kafka.clients.producer.*;
import java.util.Properties;public class KafkaLogProducer {private final KafkaProducer<String, String> producer;private final String topic;public KafkaLogProducer(String brokers, String topic) {Properties prop = new Properties();// 配置 Kafka 集群地址prop.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG, brokers);// 配置 key 和 value 的序列化器prop.put(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG, "org.apache.kafka.common.serialization.StringSerializer");prop.put(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG, "org.apache.kafka.common.serialization.StringSerializer");this.producer = new KafkaProducer(prop);this.topic = topic;}public void sendLog(String message) {producer.send(new ProducerRecord<>(topic, message));}public void close() {producer.close();}
}

数据同步

Kafka 除了可以作为日志收集的工具之外,还可以用于数据同步。使用 Kafka 可以将数据从一个系统复制到另一个系统,并且可以实现异步和批量处理。以下是一个简单的 Java 代码示例,用于把数据从源数据库同步到目标数据库:

import org.apache.kafka.clients.consumer.*;
import org.apache.kafka.clients.producer.*;
import java.sql.*;
import java.util.Properties;public class KafkaDataSync {private final KafkaConsumer<String, String> consumer;private final KafkaProducer<String, String> producer;private final String sourceTopic;private final String targetTopic;public KafkaDataSync(String brokers, String sourceTopic, String targetTopic) {Properties prop = new Properties();// 配置 Kafka 集群地址prop.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG, brokers);// 配置 key 和 value 的序列化器prop.put(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG, "org.apache.kafka.common.serialization.StringSerializer");prop.put(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG, "org.apache.kafka.common.serialization.StringSerializer");this.producer = new KafkaProducer(prop);// 配置消费者组Properties props = new Properties();props.put(ConsumerConfig.BOOTSTRAP_SERVERS_CONFIG, brokers);props.put(ConsumerConfig.GROUP_ID_CONFIG, "group1");props.put(ConsumerConfig.KEY_DESERIALIZER_CLASS_CONFIG, "org.apache.kafka.common.serialization.StringDeserializer");props.put(ConsumerConfig.VALUE_DESERIALIZER_CLASS_CONFIG, "org.apache.kafka.common.serialization.StringDeserializer");consumer = new KafkaConsumer(props);consumer.subscribe(Arrays.asList(sourceTopic));this.sourceTopic = sourceTopic;this.targetTopic = targetTopic;}public void start() throws SQLException {while (true) {ConsumerRecords<String, String> records = consumer.poll(Duration.ofMillis(100));for (ConsumerRecord<String, String> record : records) {String message = record.value();// 将数据解析并同步到目标数据库syncData(message);}}}public void close() {consumer.close();producer.close();}private void syncData(String message) {// 数据同步逻辑代码// ...// 将同步后的数据发送到目标 Kafka Topic 中producer.send(new ProducerRecord<>(targetTopic, message));}}

实时处理

Kafka 作为一个分布式流处理平台,具有强大的实时处理能力。可以支持多种实时计算框架和处理引擎,例如 Apache Storm、Apache Flink 和 Apache Spark 等。以下是一个简单的 Kafka 流处理代码示例,用于统计指定时间范围内的日志数量:

import org.apache.kafka.streams.*;
import org.apache.kafka.streams.kstream.*;
import java.util.Properties;public class KafkaStreamProcessor {public static void main(String[] args) {Properties props = new Properties();// 配置 Kafka 集群地址props.put(StreamsConfig.BOOTSTRAP_SERVERS_CONFIG, "localhost:9092");// 配置 key 和 value 的序列化器和反序列化器props.put(StreamsConfig.DEFAULT_KEY_SERDE_CLASS_CONFIG, Serdes.String().getClass().getName());props.put(StreamsConfig.DEFAULT_VALUE_SERDE_CLASS_CONFIG, Serdes.String().getClass().getName());StreamsBuilder builder = new StreamsBuilder();KStream<String, String> messages = builder.stream("logs");// 统计指定时间范围内的日志数量KTable<Windowed<String>, Long> logsCount = messages.mapValues(log -> 1).groupByKey().windowedBy(TimeWindows.of(Duration.ofMinutes(5))).count();logsCount.toStream().foreach((key, value) -> System.out.println(key.toString() + " -> " + value));KafkaStreams streams = new KafkaStreams(builder.build(), props);streams.start();}
}

七、优化调优

性能指标优化

Kafka 集群的性能受多种因素影响,为了提高 Kafka 集群的性能,需要关注以下几个重要的性能指标:

  • 消息吞吐量(Message throughput):指 Kafka 集群每秒能够处理的消息数量,这取决于硬件配置、网络和磁盘速度、消息大小和复杂度等因素。
  • 延迟(Latency):指消息从生产者发送到被消费者接收到的时间间隔,这主要取决于网络延迟和磁盘 I/O 性能。
  • 磁盘使用率(Disk utilization):指 Kafka 集群磁盘空间使用情况,如果磁盘使用率过高,可能会导致性能下降甚至堆积。
  • 网络带宽(Network bandwidth):指 Kafka 集群节点之间的网络传输速度,如果带宽不足,可能会限制消息吞吐量和延迟。

参数配置优化

Kafka 集群的性能受多个参数的影响,为了优化 Kafka 集群的性能,需要考虑以下几个关键参数:

  • 分区数量(number of partitions):分区数对于 Kafka 集群的性能至关重要,它决定了消息并行处理的能力。在平衡并行处理和分布式存储之间做出权衡是至关重要的。
  • 复制因子(replication factor):Kafka 提供了副本机制来保证数据的可靠性,增加副本机制可以提高容错能力,但也会增加网络负载和磁盘使用率。副本因子的选择应该根据数据的关键程度和集群的需求进行调整。
  • 批量大小(batch size):批量发送和接收消息是优化 Kafka 吞吐量的一个重要方法。较大的批量大小可以减少网络传输和 I/O 操作的数量,从而提高吞吐量。同时,较大的批量大小也会使得消息的延迟增大,需要做好权衡。
  • 最大连接数(maximum connections):Kafka 服务器使用一次处理一个连接的方式,因此连接上限对于 Kafka 集群性能而言非常重要。过多的连接可能会导致服务器资源不足,从而造成性能的下降。

架构设计优化

为了进一步提高 Kafka 集群的性能和可靠性,需要对集群的系统架构进行优化。以下是一些常用的系统架构优化方法:

  • 添加缓存层(Add a caching layer):使用缓存将频繁访问的数据存储到内存中,可以减少 I/O 负载,加速数据访问。
  • 数据压缩(Use data compression):在 Kafka 集群中使用消息压缩算法,可以大幅减少网络传输和磁盘写入。
  • 垂直扩展和水平扩展(Vertical and horizontal scaling):通过增加节点或者增加机器来扩展 Kafka 集群的规模,从而提高其性能和容错能力。
  • 异地多活(Geo-replication):将多个 Kafka 集群分布在不同地理位置,通过异地多活技术实现数据冗余,提高数据的可用性。

相关文章:

Apache Kafka 入门教程

Apache Kafka 入门教程 一、简介简介架构 二、Kafka 安装和配置JDK安装 Kafka配置文件详解 三、Kafka 的基本操作启动和关闭Topic 创建和删除Partitions 和 Replication 配置Producer 和 Consumer 使用方法ProducerConsumer 四、Kafka 高级应用消息的可靠性保证Kafka StreamKaf…...

python皮卡丘编程代码教程,用python打印皮卡丘

大家好&#xff0c;小编来为大家解答以下问题&#xff0c;如何用print函数打印一只皮卡丘&#xff0c;用python如何打印丘比特之心&#xff0c;现在让我们一起来看看吧&#xff01;...

shell脚本:数据库的分库分表

#!/bin/bash ######################### #File name:db_fen.sh #Version:v1.0 #Email:admintest.com #Created time:2023-07-29 09:18:52 #Description: ########################## MySQL连接信息 db_user"root" db_password"RedHat123" db_cmd"-u${…...

AtCoder Beginner Contest 312(A~D)

A //语法题也要更仔细嘞&#xff0c;要不然也会wa #include <bits/stdc.h> // #pragma GCC optimize(3,"Ofast","inline") // #pragma GCC optimize(2) using namespace std; typedef long long LL; #define int LL typedef pair<int, int> …...

SQL中Partition的相关用法

使用Partition可以根据指定的列或表达式将数据分成多个分区。每个分区都是逻辑上独立的&#xff0c;可以单独进行查询、插入、更新和删除操作。Partition可以提高查询性能&#xff0c;因为它可以限制在特定分区上执行查询&#xff0c;而不是在整个表上执行。 在SQL中&#xff…...

微服务——Docker

docker与虚拟机的区别 首先要知道三个层次 硬件层:计算机硬件 内核层:与硬件交互&#xff0c;提供操作硬件的指令 应用层: 系统应用封装内核指令为函数&#xff0c;便于程序员调用。用户程序基于系统函数库实现功能。 docker在打包的时候直接把应用层的函数库也进行打包&a…...

测试|测试用例方法篇

测试|测试用例方法篇 文章目录 测试|测试用例方法篇1.测试用例的基本要素&#xff1a;测试环境&#xff0c;操作步骤&#xff0c;测试数据&#xff0c;预期结果…2.测试用例带来的好处3.测试用例的设计思路&#xff0c;设计方法&#xff0c;具体设计方法之间的关系**设计测试用…...

负载均衡的策略有哪些? 负载均衡的三种方式?

负载均衡的策略有哪些? 负载均衡的策略有如下&#xff1a; 1. 轮询&#xff08;Round Robin&#xff09;&#xff1a;按照请求的顺序轮流分配到不同的服务器。 2. 权重&#xff08;Weighted&#xff09;&#xff1a;给不同的服务器分配不同的权重&#xff0c;根据权重比例来…...

二十三章:抗对抗性操纵的弱监督和半监督语义分割的属性解释

0.摘要 弱监督语义分割从分类器中生成像素级定位&#xff0c;但往往会限制其关注目标对象的一个小的区域。AdvCAM是一种图像的属性图&#xff0c;通过增加分类分数来进行操作。这种操作以反对抗的方式实现&#xff0c;沿着像素梯度的相反方向扰动图像。它迫使最初被认为不具有区…...

curator实现的zookeeper可重入锁

Curator是一个Apache开源的ZooKeeper客户端库&#xff0c;它提供了许多高级特性和工具类&#xff0c;用于简化在分布式环境中使用ZooKeeper的开发。其中之一就是可重入锁。 Curator提供了InterProcessMutex类来实现可重入锁。以下是使用Curator实现ZooKeeper可重入锁的示例&am…...

抽象工厂模式——产品族的创建

1、简介 1.1、简介 抽象工厂模式为创建一组对象提供了一种解决方案。与工厂方法模式相比&#xff0c;抽象工厂模式中的具体工厂不只是创建一种产品&#xff0c;它负责创建一族产品 1.2、定义 抽象工厂模式&#xff08;Abstract Factory Pattern&#xff09;&#xff1a;提供…...

【C语言初阶篇】自定义类型结构体我不允许还有人不会!

&#x1f3ac; 鸽芷咕&#xff1a;个人主页 &#x1f525; 个人专栏:《C语言初阶篇》 《C语言进阶篇》 ⛺️生活的理想&#xff0c;就是为了理想的生活! 文章目录 &#x1f4cb; 前言1 . 什么是结构体1.1 结构的定义1.2 结构的声明 2.结构体初始化2.1 用标签名定义和初始化2.2…...

重大更新|Sui主网即将上线流动性质押,助力资产再流通

Sui社区一直提议官方上线流动质押功能&#xff0c;现在通过SIP过程&#xff0c;已经升级该协议以实现这一功能。 Sui使用委托权益证明机制&#xff08;DPoS&#xff09;来选择和奖励负责运营网络的验证节点。为了保障网络安全&#xff0c;验证节点通过质押SUI token获得质押奖…...

day3 驱动开发 c语言编程

通过ioctl&#xff08;内核应用层&#xff09; 控制led灯三盏&#xff0c;风扇&#xff0c;蜂鸣器&#xff0c;小马达 头文件head.h #ifndef __LED_H__ #define __LED_H__typedef struct {volatile unsigned int TZCR; // 0x000volatile unsigned int res1[2]; // 0x…...

【字节跳动青训营】后端笔记整理-3 | Go语言工程实践之测试

**本文由博主本人整理自第六届字节跳动青训营&#xff08;后端组&#xff09;&#xff0c;首发于稀土掘金&#xff1a;&#x1f517;Go语言工程实践之测试 | 青训营 目录 一、概述 1、回归测试 2、集成测试 3、单元测试 二、单元测试 1、流程 2、规则 3、单元测试的例…...

【Android】Recyclerview的缓存复用

介绍 RecyclerView是Android开发中常用的一个高度可定制的列表视图组件。它是在ListView和GridView的基础上进行了改进和增强&#xff0c;旨在提供更好的性能和更灵活的布局管理。 RecyclerView的主要特点如下&#xff1a; 灵活的布局管理器&#xff08;LayoutManager&#…...

机器学习:混合高斯聚类GMM(求聚类标签)+PCA降维(3维降2维)习题

使用混合高斯模型 GMM&#xff0c;计算如下数据点的聚类过程&#xff1a; Datanp.array([1,2,6,7]) 均值初值为: μ1,μ21,5 权重初值为: w1,w20.5,0.5 方差: std1,std21,1 K2 10 次迭代后数据的聚类标签是多少&#xff1f; 采用python代码实现&#xff1a; from scipy import…...

libuv库学习笔记-processes

Processes libuv提供了相当多的子进程管理函数&#xff0c;并且是跨平台的&#xff0c;还允许使用stream&#xff0c;或者说pipe完成进程间通信。 在UNIX中有一个共识&#xff0c;就是进程只做一件事&#xff0c;并把它做好。因此&#xff0c;进程通常通过创建子进程来完成不…...

c++ 给无名形参提供默认值

如上图&#xff0c;若函数的形参不在函数体里使用&#xff0c;可以不提供形参名&#xff0c;而且可以给此形参提供默认值。也能编译通过。 在看vs2019上的源码时&#xff0c;也出现了这种写法。应用SFINAE&#xff08;substitute false is not an error&#xff09;原则&#x…...

NO1.使用命令行创建Maven工程

①在工作空间目录下打开命令窗口 ②使用命令行生成Maven工程 mvn archetype:generate 运行 MVN 原型&#xff1a;生成命令,下面根据提示操作 选择一个数字或应用过滤器&#xff08;格式&#xff1a;[groupId&#xff1a;]artifactId&#xff0c;区分大小写包含&#xff09;&a…...

深度学习入门(一):神经网络基础

一、深度学习概念 1、定义 通过训练多层网络结构对位置数据进行分类或回归&#xff0c;深度学习解决特征工程问题。 2、深度学习应用 图像处理语言识别自然语言处理 在移动端不太好&#xff0c;计算量太大了&#xff0c;速度可能会慢 eg.医学应用、自动上色 3、例子 使用…...

网络知识整理

网络知识整理 网络拓扑网关默认网关 数据传输拓扑结构层面协议层面 网络拓扑 网关 连接两个不同的网络的设备都可以叫网关设备&#xff0c;网关的作用就是实现两个网络之间进行通讯与控制。 网关设备可以是交换机(三层及以上才能跨网络) 、路由器、启用了路由协议的服务器、代…...

如何有效地使用ChatGPT写小说讲故事?

​构思故事情节&#xff0c;虽有趣但耗时&#xff0c;容易陷入写作瓶颈。ChatGPT可提供灵感&#xff0c;帮你解决写作难题。要写出引人入胜的故事&#xff0c;关键在于抓住八个要素——主题、人物、视角、背景、情节、语气、冲突和解决办法。 直接给出故事模板&#xff0c;你可…...

原生求生记:揭秘UniApp的原生能力限制

文章目录 1. 样式适配问题2. 性能问题3. 原生能力限制4. 插件兼容性问题5. 第三方组件库兼容性问题6. 全局变量污染7. 调试和定位问题8. 版本兼容性问题9. 前端生态限制10. 文档和支持附录&#xff1a;「简历必备」前后端实战项目&#xff08;推荐&#xff1a;⭐️⭐️⭐️⭐️…...

网络编程 IO多路复用 [epoll版] (TCP网络聊天室)

//head.h 头文件 //TcpGrpSer.c 服务器端 //TcpGrpUsr.c 客户端 通过IO多路复用实现服务器在单进程单线程下可以与多个客户端交互 API epoll函数 #include<sys/epoll.h> int epoll_create(int size); 功能&#xff1a;创建一个epoll句柄//创建红黑树根…...

【go-zero】浅析 01

“github.com/google/uuid” uuid.New().String() go-zero 文档 https://www.w3cschool.cn/gozero/ go-zero 官网 https://go-zero.dev/ 快速开始&#xff1a; $ mkdir go-zero-demo $ cd go-zero-demo $ go mod init go-zero-demo $ goctl api new greet $ go mod tidy Done…...

音视频——视频流H264编码格式

1 H264介绍 我们了解了什么是宏快&#xff0c;宏快作为压缩视频的最小的一部分&#xff0c;需要被组织&#xff0c;然后在网络之间做相互传输。 H264更深层次 —》宏块 太浅了 ​ 如果单纯的用宏快来发送数据是杂乱无章的&#xff0c;就好像在没有集装箱 出现之前&#xff0c;…...

【使用深度学习的城市声音分类】使用从提取音频特征(频谱图)中提取的深度学习进行声音分类研究(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…...

机器学习完整路径

一个机器学习项目从开始到结束大致分为 5 步&#xff0c;分别是定义问题、收集数据和预处理、选择算法和确定模型、训练拟合模型、评估并优化模型性能。是一个循环迭代的过程&#xff0c;优秀的模型都是一次次迭代的产物。 定义问题 要剖析业务场景&#xff0c;设定清晰的目标…...

CK-00靶机详解

CK-00靶机详解 靶场下载地址&#xff1a;https://download.vulnhub.com/ck/CK-00.zip 这个靶场扫描到ip打开后发现主页面css是有问题的&#xff0c;一般这种情况就是没有配置域名解析。 我们网站主页右击查看源代码&#xff0c;发现一个域名。 把域名添加到我们hosts文件中。…...

网站维护一年多少费/百度大数据查询

使用INSERT....SELECT语句将数据从一个表复制到另一个表。 例如&#xff1a;INSERT INTO nobe(yea,subje,winne)SELECT nobel.yr,nobel.subject,nobel.winnerFROM nobelWHERE nobel.yr2009以上代码就是将nobel表中yr为2009的数据复制到nobe表中。 不过INSERT....SELECT还有其他…...

溜冰后做爰在线网站/市场营销案例分析

2019独角兽企业重金招聘Python工程师标准>>> 修改系统源更新命令&#xff1a; sudo pacman -Syy 或 sudo pacman -Syu;通过界面修改系统源为‘china 修改为 china 并 刷新镜像列表 添加 Arch linux 官方源编辑 /etc/pacman.conf 添加如下代码[archlinuxcn]SigLevel …...

星沙做网站/郑州seo优化服务

Vue中v-if和v-show之间的区别 1.本质区别 v-show:把标签display设置为none&#xff0c;控制隐藏 v-if:动态的向DOM树内添加或者删除DOM元素2.编译的区别 v-show:其实就是在控制css v-if:切换有一个局部编译/卸载的过程&#xff0c;切换过程中合适地销毁和重建内部的事件监听…...

长春网站建设SEO优化营销/销售外包公司

原文链接&#xff1a;https://dev.to/brunooliveira/rust-understanding-traits-1-45md原文标题&#xff1a;Rust - understanding traits 1公众号&#xff1a;Rust 碎碎念概述(Introduction)如今很多语言都是面向对象&#xff0c;支持这种范式&#xff0c;或者不是直接面向对象…...

定制网站建设设计公司/seo系统培训班

什么是箱型图 箱形图&#xff08;Box-plot&#xff09;又称为盒须图、盒式图或箱线图&#xff0c;是一种用作显示一组数据分散情况资料的统计图。因形状如箱子而得名。在各种领域也经常被使用&#xff0c;常见于品质管理。&#xff08;来源&#xff1a;百度百科【箱型图】词条&…...

影院资讯 wordpress/北京seo顾问服务

请写出图的邻接矩阵和邻接表&#xff0c;深度和广度遍历结果&#xff0c;最小生成树的结果 1.邻接矩阵 详见本人博客&#xff1a;图的存储结构&#xff1a;邻接矩阵 2.邻接表 详见本人博客&#xff1a;图的存储结构&#xff1a;邻接表 3.深度遍历结果&#xff1a;1234657 &am…...