Debezium和SeaTunnel实现MySQL到Hadoop的实时数据流和全量同步(基于尚硅谷的集群环境)

news2024/11/28 10:39:39

1、hadoop集群连接本地MySQL

1.1 首先测试集群是否可以ping通本地

虚拟机可以ping通网关(192.168.10.2),但不能ping通192.168.10.1,这表明问题可能出在Windows主机的防火墙设置或VMware的网络配置上。

1.1.1 检查Windows防火墙设置

确保Windows防火墙没有阻止ICMP请求(ping)可以临时禁用Windows防火墙进行测试:

  • 打开命令提示符(以管理员身份运行)
  • 输入以下命令来禁用防火墙
netsh advfirewall set allprofiles state off

然后再次尝试从虚拟机ping 192.168.10.1。如果现在可以ping通,说明防火墙是问题所在。需要添加一个允许ICMP的规则。

1.1.2 重新启用防火墙并添加规则

输入以下命令来重新启用防火墙

netsh advfirewall set allprofiles state on

在命令提示符中输入以下命令来添加允许ICMP请求的规则

netsh advfirewall firewall add rule name="Allow ICMPv4" protocol=icmpv4:8,any dir=in action=allow

在命令提示符中输入以下命令来添加允许3306端口的入站规则

netsh advfirewall firewall add rule name="Allow MySQL 3306" dir=in action=allow protocol=TCP localport=3306

1.2 虚拟机连接到物理机上的MySQL服务器

需要确保几个关键点:

  1. MySQL服务器配置:确保MySQL服务器允许远程连接。
  2. 网络配置:确保虚拟机和物理机在同一网络中,并且可以相互通信。
  3. 防火墙设置:确保没有防火墙阻止MySQL的端口(默认是3306)。
  4. MySQL用户权限:确保有用户权限从虚拟机的IP地址连接到MySQL服务器。

1.2.1 配置MySQL服务器以允许远程连接

  1. 登录MySQL服务器

    mysql -uroot -p123456
  2. 查看当前的用户权限

    SHOW GRANTS FOR 'root'@'localhost';
  3. 创建一个允许远程连接的用户

    CREATE USER 'remote_user'@'%' IDENTIFIED BY '123456';
  4. 给这个用户授权

    GRANT ALL PRIVILEGES ON *.* TO 'remote_user'@'%' WITH GRANT OPTION;
    FLUSH PRIVILEGES;
  5. 确保MySQL配置文件(my.cnf或my.ini)允许远程连接

    • 找到MySQL的配置文件,通常在/etc/mysql/目录下。
    • 确保bind-address设置为0.0.0.0或者被注释掉,这样MySQL服务器可以监听所有网络接口。

在虚拟机上执行如下命令:

mysql -h 192.168.10.1 -u remote_user -p

已经成功配置了从Hadoop集群的hadoop102节点访问本地MySQL服务器,并且已经解决了网络和防火墙的问题,现在可以使用SeaTunnel来全量同步news_data数据库的数据到HDFS上 。

2、seatunnel导入数据库全量数据到HDFS(单表)

2.1 下载并安装SeaTunnel

官方网站:Apache SeaTunnel | Apache SeaTunnel

导入到/opt/software下,执行如下命令解压

tar -xzvf apache-seatunnel-2.3.8-bin.tar.gz -C /opt/module/

2.2 安装Connector插件

从2.2.0-beta版本开始,二进制包默认不提供connector依赖。因此,需要执行以下命令来安装所需的connector插件:

sh bin/install_plugin.sh $version

 2.3 驱动jar包

  • 下载MySQL JDBC驱动: 确保下载了正确版本的MySQL JDBC驱动jar包。从MySQL官网下载。
  • 将驱动添加到SeaTunnel的lib目录: 将下载的MySQL JDBC驱动jar包放到SeaTunnel的lib目录下。这样,当SeaTunnel启动时,它就能够加载所需的MySQL驱动类

2.4 配置SeaTunnel任务

配置文件mysql_to_hdfs.conf,并将其放置在SeaTunnel的config目录下。这个配置文件应该包含了源(MySQL)和接收器(HDFS)的正确配置。

env {
  execution.parallelism = 1 # 根据你的集群资源调整并行度
}

source {
  JDBC {
    driver = "com.mysql.cj.jdbc.Driver"
    url = "jdbc:mysql://192.168.10.1:3306/news_data?useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC"
    user = "remote_user"
    password = "123456"
    query = "SELECT * FROM news_information"  # 使用查询语句来导入数据
  }
}

sink {
  HdfsFile {
    fs.defaultFS = "hdfs://hadoop102:8020"  # HDFS NameNode 地址
    path = "/news"  # HDFS 目标目录路径
    file_type = "text"  # 文件类型,例如 text, csv, orc 等
    field_delimiter = ","  # 字段分隔符,根据实际情况调整
    file_format_type = "text"  # 指定文件格式类型为文本
  }
}

选择执行模式

 SeaTunnel支持多种执行模式,包括本地模式(local)、独立模式(standalone)、集群模式(yarn/cluster)等。对于大多数大数据任务,推荐使用集群模式来充分利用Hadoop集群的资源。

2.5 环境变量配置

/opt/module/hadoop/etc/hadoop是包含Hadoop配置文件的目录。需要将这个目录路径设置为HADOOP_CONF_DIR环境变量,以便SeaTunnel的Spark作业能够正确地连接到YARN集群。

使用如下命令

sudo vim /etc/profile.d/my_env.sh

在环境变量最后添加如下

export HADOOP_CONF_DIR=/opt/module/hadoop/etc/hadoop

运行以下命令使变量立即生效

source /etc/profile.d/my_env.sh

运行命令

./bin/start-seatunnel-spark-3-connector-v2.sh --config ./config/mysql_to_hdfs.conf --master yarn

SeaTunnel作业通过Spark提交到YARN集群,启动一个SeaTunnel作业,从MySQL读取数据并将其写入到HDFS中,使用YARN作为资源管理器。

 3、seatunnel导入数据库全量数据到HDFS(多表)

在seatunnel的安装目录下创建脚本mysql_full_hdfs.sh

#!/bin/bash

# 获取当前日期
current_date=$(date +%Y-%m-%d)

# 定义数据库连接信息
DB_URL="jdbc:mysql://192.168.10.1:3306/test?useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC"
DB_USER="remote_user"
DB_PASSWORD="123456"

# 定义HDFS路径
HDFS_PATH="hdfs://hadoop102:8020"

# 定义表名数组
TABLES=("stu" "t_user")

# 循环处理每个表
for TABLE in "${TABLES[@]}"; do
  # 创建配置文件内容,包含当前日期
  conf_file="/opt/module/apache-seatunnel-2.3.8/config/${TABLE}_to_hdfs_${current_date}.conf"
  cat > "$conf_file" << EOF
env {
  execution.parallelism = 1
}
source {
  JDBC {
    driver = "com.mysql.cj.jdbc.Driver"
    url = "${DB_URL}"
    user = "${DB_USER}"
    password = "${DB_PASSWORD}"
    query = "SELECT * FROM ${TABLE}"
  }
}
sink {
  HdfsFile {
    fs.defaultFS = "${HDFS_PATH}"
    path = "/news/${TABLE}_full/${current_date}"  # HDFS 目标目录路径,每个表都有自己的目录,并且包含日期
    file_type = "parquet"  # 文件类型改为Parquet
    file_format_type = "parquet"  # 文件格式类型为Parquet
    parquet_compression_CODEC = "gzip"  # 使用gzip压缩
  }
}
EOF

  # 运行Seatunnel任务
  /opt/module/apache-seatunnel-2.3.8/bin/start-seatunnel-spark-3-connector-v2.sh --config "$conf_file" --master yarn

  # 删除配置文件
  rm "$conf_file"
done

使用chmod +x 脚本,再运行脚本。

4、MySQL到Kafka的实时数据流和变更数据捕获(单节点)

Debezium在Kafka Connect集群中监控MySQL数据库变更

4.1 MySQL配置

创建用户:首先,需要使用 CREATE USER 命令来创建一个新的用户。

CREATE USER 'debezium'@'192.168.10.102' IDENTIFIED BY '123456';

授予权限:然后,可以使用 GRANT 命令来授予这个用户所需的权限。

GRANT SUPER, REPLICATION CLIENT, SELECT ON *.* TO 'debezium'@'192.168.10.102';

为用户 debezium 授予 LOCK TABLES 权限

请注意,授予 LOCK TABLES 权限可能会影响数据库的并发性,因为它允许用户锁定表。在授予权限时,应始终确保遵循最小权限原则,只授予用户完成其任务所需的权限。

GRANT SUPER, REPLICATION CLIENT, SELECT ON *.* TO 'debezium'@'192.168.10.102';

为用户 debezium 授予 RELOAD 权限 

GRANT RELOAD ON *.* TO 'debezium'@'192.168.10.102';

请注意,授予 RELOAD 权限允许用户执行 FLUSH TABLES WITH READ LOCK 命令,这在 Debezium 连接器进行初始快照时是必要的。确保在授予权限时,用户 debezium 已经存在于 MySQL 中,并且使用的是正确的主机地址(在本例中为虚拟机的 IP 地址 192.168.10.102)。

刷新权限:最后,需要刷新 MySQL 的权限设置,使新权限生效:

FLUSH PRIVILEGES;

请注意,上述步骤中的 '192.168.10.102' 应该替换为虚拟机的 IP 地址,因为这是 Kafka Connect 尝试连接到 MySQL 数据库的地址。

MySQL的配置文件:

# 后续换为允许的IP
bind-address = 0.0.0.0
log-bin=mysql-bin
binlog-format = ROW
binlog-row-image = FULL
expire_logs_days = 10

4.2 下载安装Zookeeper

在zoo.cfg下配置如下信息:

tickTime=2000
initLimit=10
syncLimit=5
dataDir=/opt/module/zookeeper/zkData
clientPort=2181

在bin目录下执行

./zkServer.sh start 

4.3 下载安装Kafka

在config目录的server.properties配置文件中,配置如下信息:

broker.id=0
advertised.listeners=PLAINTEXT://hadoop102:9092
num.network.threads=3
num.io.threads=8
socket.send.buffer.bytes=102400
socket.receive.buffer.bytes=102400
socket.request.max.bytes=104857600
log.dirs=/opt/module/kafka/datas
num.partitions=1
num.recovery.threads.per.data.dir=1
offsets.topic.replication.factor=1
transaction.state.log.replication.factor=1
transaction.state.log.min.isr=1
log.retention.hours=168
log.retention.check.interval.ms=300000
zookeeper.connect=hadoop102:2181/kafka
zookeeper.connection.timeout.ms=18000
group.initial.rebalance.delay.ms=0

在bin目录下执行

./kafka-server-start.sh /opt/module/kafka/config/server.properties 

4.4 下载安装Debezium

下载到/opt/software

 wget https://repo1.maven.org/maven2/io/debezium/debezium-connector-mysql/1.9.5.Final/debezium-connector-mysql-1.9.5.Final-plugin.tar.gz

解压到:/opt/module/kafka/libs 下

tar -xzf debezium-connector-mysql-1.9.5.Final-plugin.tar.gz -C /opt/module/kafka/libs/

把 debezium-connector-mysql 里面的jar包移动到libs目录下。

cp debezium-connector-mysql/*.jar /opt/module/kafka/libs/

在/opt/module/kafka/config目录下的connect-distributed.properties 配置文件中添加

plugin.path=/opt/module/kafka/libs

在config目录下创建配置文件mysql-connector.json,并且添加如下信息

{"name":"mysql-connector","config":{"connector.class":"io.debezium.connector.mysql.MySqlConnector","tasks.max":"1","database.hostname":"192.168.10.1","database.port":"3306","database.user":"debezium","database.password":"123456","database.server.id":"184054","database.server.name":"mydb","database.include.list":"test","database.history.kafka.bootstrap.servers":"hadoop102:9092","schema.history.internal.kafka.bootstrap.servers":"hadoop102:9092","schema.history.internal.kafka.topic":"schema-changes.test","key.converter":"org.apache.kafka.connect.json.JsonConverter","key.converter.schemas.enable":"false","value.converter":"org.apache.kafka.connect.json.JsonConverter","value.converter.schemas.enable":"false","database.history.kafka.topic":"dbhistory.test","database.ssl.mode":"REQUIRED","database.ssl.truststore.location":"/path/to/truststore.jks","database.ssl.truststore.password":"truststore-password","database.connectionTimeZone":"UTC"}}

 在config目录下创建配置文件debezium.properties,如下信息:

bootstrap.servers=hadoop102:9092
key.converter=org.apache.kafka.connect.json.JsonConverter
value.converter=org.apache.kafka.connect.json.JsonConverter
key.converter.schemas.enable=true
value.converter.schemas.enable=true
internal.key.converter=org.apache.kafka.connect.json.JsonConverter
internal.value.converter=org.apache.kafka.connect.json.JsonConverter
internal.key.converter.schemas.enable=false
internal.value.converter.schemas.enable=false
offset.storage.topic=connect-offsets
offset.flush.interval.ms=10000
# 设置 offset topic 的复制因子为 1
config.storage.topic=connect-configs
config.storage.replication.factor=1
offset.storage.replication.factor=1
status.storage.topic=connect-status
status.storage.replication.factor=1
status.flush.interval.ms=5000
group.id=connect-cluster
name=mysql-connector
connector.class=io.debezium.connector.mysql.MySqlConnector
tasks.max=1
database.hostname=192.168.10.1
database.port=3306
database.user=debezium
database.password=123456
database.server.id=184054
database.server.name=mydb
database.history.kafka.bootstrap.servers=hadoop102:9092
database.history.kafka.topic=dbhistory.mydb
database.history.store.only.monitored.tables.ddl=true
table.include.list=test.stu,test.t_user

将zookeeper和kafka启动起来,再启动kafka-connect。

kafka的bin目录下

./connect-distributed.sh /opt/module/kafka/config/debezium.properties

执行注册命令,kafka的config目录下

curl -i -X POST -H "Accept:application/json" -H "Content-Type:application/json" http://hadoop102:8083/connectors/ -d @mysql-connector.json

查看状态

curl -s http://hadoop102:8083/connectors/mysql-connector/status

删除

url -X DELETE localhost:8083/connectors/mysql-connector

 5、MySQL到Kafka的实时数据流和变更数据捕获(多节点)

5.1 Zookeeper配置

  • hadoop102节点上
tickTime=2000
initLimit=10
syncLimit=5
dataDir=/opt/module/zookeeper/zkData
clientPort=2181
server.2=hadoop102:2888:3888
server.3=hadoop103:2888:3888
server.4=hadoop104:2888:3888

/opt/module/zookeeper/zkData目录下有一个文件myid,里面的内容是:2

  •  hadoop103节点上
tickTime=2000
initLimit=10
syncLimit=5
dataDir=/opt/module/zookeeper/zkData
clientPort=2181
server.2=hadoop102:2888:3888
server.3=hadoop103:2888:3888
server.4=hadoop104:2888:3888

/opt/module/zookeeper/zkData目录下有一个文件myid,里面的内容是:3

  •  hadoop104节点上
tickTime=2000
initLimit=10
syncLimit=5
dataDir=/opt/module/zookeeper/zkData
clientPort=2181
server.2=hadoop102:2888:3888
server.3=hadoop103:2888:3888
server.4=hadoop104:2888:3888

/opt/module/zookeeper/zkData目录下有一个文件myid,里面的内容是:4

5.2 Kafka配置

  • hadoop102节点上
broker.id=0
advertised.listeners=PLAINTEXT://hadoop102:9092
num.network.threads=3
num.io.threads=8
socket.send.buffer.bytes=102400
socket.receive.buffer.bytes=102400
socket.request.max.bytes=104857600
log.dirs=/opt/module/kafka/datas
num.partitions=1
num.recovery.threads.per.data.dir=1
offsets.topic.replication.factor=1
transaction.state.log.replication.factor=1
transaction.state.log.min.isr=1
log.retention.hours=168
log.retention.check.interval.ms=300000
zookeeper.connect=hadoop102:2181,hadoop103:2181,hadoop104:2181/kafka
zookeeper.connection.timeout.ms=18000
group.initial.rebalance.delay.ms=0
  • hadoop103节点上

只需要修改kafka/config/server.properties

broker.id=1
advertised.listeners=PLAINTEXT://hadoop103:9092
  • hadoop104节点上

只需要修改kafka/config/server.properties

broker.id=2
advertised.listeners=PLAINTEXT://hadoop104:9092

5.3 Dezebium下载安装

hadoop102、hadoop103、hadoop104下载了debezium,并且jar包放到了/opt/module/kafka/libs目录。每个节点的/opt/module/kafka/config/connect-distributed.properties配置文件内容都是

bootstrap.servers=hadoop102:9092,hadoop103:9092,hadoop104:9092
group.id=connect-cluster
key.converter=org.apache.kafka.connect.json.JsonConverter
value.converter=org.apache.kafka.connect.json.JsonConverter
key.converter.schemas.enable=true
value.converter.schemas.enable=true
offset.storage.topic=connect-offsets
offset.storage.replication.factor=3
config.storage.topic=connect-configs
config.storage.replication.factor=3
status.storage.topic=connect-status
status.storage.replication.factor=3
offset.flush.interval.ms=10000
plugin.path=/opt/module/kafka/libs
internal.key.converter=org.apache.kafka.connect.json.JsonConverter
internal.value.converter=org.apache.kafka.connect.json.JsonConverter
internal.key.converter.schemas.enable=false
internal.value.converter.schemas.enable=false
status.flush.interval.ms=5000

每个节点的/opt/module/kafka/config下创建了一个配置文件:mysql-connector.json,内容如下:

{
    "name": "mysql-connector",
    "config": {
        "connector.class": "io.debezium.connector.mysql.MySqlConnector",
        "tasks.max": "1",
        "database.hostname": "192.168.10.1",
        "database.port": "3306",
        "database.user": "debezium",
        "database.password": "123456",
        "database.server.id": "184054",
        "database.server.name": "mydb",
        "database.include.list": "news_data",
        "database.history.kafka.bootstrap.servers": "hadoop102:9092,hadoop103:9092,hadoop104:9092",
        "schema.history.internal.kafka.bootstrap.servers": "hadoop102:9092,hadoop103:9092,hadoop104:9092",
        "schema.history.internal.kafka.topic": "schema-changes.news_data",
        "key.converter": "org.apache.kafka.connect.json.JsonConverter",
        "key.converter.schemas.enable": "false",
        "value.converter": "org.apache.kafka.connect.json.JsonConverter",
        "value.converter.schemas.enable": "false",
        "database.history.kafka.topic": "dbhistory.news_data",
        "database.ssl.mode": "REQUIRED",
        "database.ssl.truststore.location": "/path/to/truststore.jks",
        "database.ssl.truststore.password": "truststore-password",
        "database.connectionTimeZone": "UTC"
    }
}

启动Zookeeper、Kafka,在hadoop102、hadoop103、hadoop104节点上依次启动Kafka-connect,并且在其中一台(hadoop102)注册即可。

  • hadoop102上执行如下语句
curl -s http://hadoop102:8083/connectors/mysql-connector/status
  • hadoop103上执行如下语句
curl -s http://hadoop103:8083/connectors/mysql-connector/status
  •  hadoop104上执行如下语句
curl -s http://hadoop104:8083/connectors/mysql-connector/status

 都得到如下结果:

{
    "name": "mysql-connector",
    "connector": {
        "state": "RUNNING",
        "worker_id": "192.168.10.102:8083"
    },
    "tasks": [
        {
            "id": 0,
            "state": "RUNNING",
            "worker_id": "192.168.10.102:8083"
        }
    ],
    "type": "source"
}

当hadoop102的Kafka-connect关闭时

  • hadoop103上执行如下语句
curl -s http://hadoop103:8083/connectors/mysql-connector/status
  •  hadoop104上执行如下语句
curl -s http://hadoop104:8083/connectors/mysql-connector/status

 都得到如下结果:

{
    "name": "mysql-connector",
    "connector": {
        "state": "RUNNING",
        "worker_id": "192.168.10.103:8083"
    },
    "tasks": [
        {
            "id": 0,
            "state": "RUNNING",
            "worker_id": "192.168.10.103:8083"
        }
    ],
    "type": "source"
}

 成功地在多节点上配置了Zookeeper、Kafka和Debezium连接器,并且能够在Kafka Connect集群中注册和运行Debezium连接器

6、kafka写入HDFS

在hadoop102节点上的flume下编写一个配置文件kafka_to_hdfs.conf,内容如下:

# Define the sources, sinks, and channels
a1.sources = r1
a1.sinks = k1
a1.channels = c1

# # Configure the source
a1.sources.r1.type = org.apache.flume.source.kafka.KafkaSource
a1.sources.r1.batchSize = 1000
a1.sources.r1.batchDurationMillis = 2000
a1.sources.r1.kafka.bootstrap.servers = hadoop102:9092,hadoop103:9092,hadoop104:9092
a1.sources.r1.kafka.topics = mydb.news_data.comment_information,mydb.news_data.media_information,mydb.news_data.news_information,mydb.news_data.user_information,mydb.news_data.user_auth

# # Interceptor configuration
a1.sources.r1.interceptors = i1
a1.sources.r1.interceptors.i1.type = org.atguigu.news.flume.interceptor.TimestampInterceptor$Builder

# # Configure the channel
a1.channels.c1.type = memory
a1.channels.c1.capacity = 10000
a1.channels.c1.transactionCapacity = 1000

# # Configure the sink
a1.sinks.k1.type = hdfs
a1.sinks.k1.hdfs.path = hdfs://hadoop102:8020/news_data/%{table}_inc/%Y-%m-%d
a1.sinks.k1.hdfs.filePrefix = events
a1.sinks.k1.hdfs.fileType = DataStream
a1.sinks.k1.hdfs.writeFormat = Text
a1.sinks.k1.hdfs.rollInterval = 0
a1.sinks.k1.hdfs.rollSize = 134217728
a1.sinks.k1.hdfs.rollCount = 0
a1.sinks.k1.hdfs.useLocalTimeStamp = true

# # Bind the source and sink to the channel
a1.sources.r1.channels = c1
a1.sinks.k1.channel = c1

编写拦截器代码打jar包放入hadoop102的flume的lib目录下,jar包代码如下:

package org.atguigu.news.flume.interceptor;

import com.alibaba.fastjson.JSONObject;
import org.apache.flume.Context;
import org.apache.flume.Event;
import org.apache.flume.interceptor.Interceptor;
import java.nio.charset.StandardCharsets;
import java.util.List;
import java.util.Map;
public class TimestampInterceptor implements Interceptor {
    @Override
    public void initialize() {
        // Initialization logic, if needed
    }
    @Override
    public Event intercept(Event event) {
        // 1. Get header and body data
        Map<String, String> headers = event.getHeaders();
        String body = new String(event.getBody(), StandardCharsets.UTF_8);

        try {
            // 2. Parse body data as JSON
            JSONObject jsonObject = JSONObject.parseObject(body);
            // 3. Extract timestamp and table name
            String ts = jsonObject.getString("ts_ms");
            JSONObject source = jsonObject.getJSONObject("source");
            String tableName = source.getString("table");
            // 4. Put timestamp and table name into headers
            headers.put("timestamp", ts);
            headers.put("table", tableName);
            return event;
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }
    @Override
    public List<Event> intercept(List<Event> events) {
        for (Event event : events) {
            if (intercept(event) == null) {
                events.remove(event);
            }
        }
        return events;
    }
    @Override
    public void close() {
        // Clean up resources, if needed
    }
    public static class Builder implements Interceptor.Builder {
        @Override
        public Interceptor build() {
            return new TimestampInterceptor();
        }
        @Override
        public void configure(Context context) {
            // Configuration logic, if needed
        }
    }
}

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

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

相关文章

个人信息窗口(三)

个人信息窗口&#xff08;三&#xff09; 前言 在上一集我们就可以显示我们就可以全部显示所有的未隐藏的组件了&#xff0c;但是隐藏的组件我们还没有蛆完成&#xff0c;所以我们这一集就需要去做隐藏组件的显示&#xff0c;以及如何切换到隐藏的组件的功能。 需求分析并实…

centos7 nginx优化

优化nginx进程个数的策略 在高并发、高访问量的web服务场景&#xff0c;需要事先启动好更多的nginx进程&#xff0c;以保证快速响应并处理大量并发用户的请求。worker_processes 1;一般调整到与CPU的颗数相同查看LInux可查看CPU个数及总核数grep processor /proc/cpuinfo|wc …

开放式耳机排行榜前十名,开放式耳机全价位段盘点

关于开放式蓝牙耳机的品牌选择&#xff0c;这是一个常见的问题。因为市面上的蓝牙耳机种类繁多&#xff0c;各种样式和类型层出不穷&#xff0c;让许多消费者感到困惑&#xff0c;不知道如何选择一款适合自己的蓝牙耳机。一款好的蓝牙耳机不仅需要音质好、配置高&#xff0c;还…

计算机毕业设计hadoop+spark知识图谱中药推荐系统 中药材推荐系统 中药可视化 中药数据分析 中药爬虫 机器学习 深度学习 人工智能 大数据

温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 摘 要 本文所探讨的领域是…

深度学习-2:数据向量化

向量化 在逻辑回归中&#xff0c;x,w,b都是列向量&#xff0c;若要计算w.T*xb&#xff0c;不向量化的话就需要for循环计算起来很麻烦 向量化后&#xff0c;使用numpy.dot(w,x)函数即可快速计算 逻辑回归向量化

接口测试(六)jmeter——参数化(配置元件 --> 用户定义的变量)

一、jmeter——参数化&#xff08;配置元件 --> 用户定义的变量&#xff09; 注&#xff1a;示例仅供参考 1. 参数化格式&#xff1a;${变量名} 2. 配置元件&#xff1a;用户定义的变量 3. 添加【用户定义的变量】&#xff0c;【线程组】–>【添加】–>【配置元件】–…

手持无人机飞手执照,会组装调试入伍当兵有多香!

手持无人机飞手执照&#xff0c;并具备组装调试技能&#xff0c;在入伍当兵时确实会具有显著的优势和吸引力。以下是对这一情况的详细分析&#xff1a; 一、无人机飞手执照的优势 1. 法规遵从与安全保障&#xff1a; 根据《民用无人驾驶航空器系统驾驶员管理暂行规定》等相关…

深入浅出 Vue3 nextTick

程序员节日快乐~ #1024程序员节 | 征文# nextTick 概念 当你在 Vue 的响应式数据模型中对数据进行修改时&#xff0c;这些变化并不会立即同步到 DOM 上_&#xff0c;而是会在当前的微任务队列&#xff08;microtask queue&#xff09;执行完毕后进行批量更新。这种机制被称为…

【宝塔面板】轻松使用docker搭建lobe-chat项目(AI对话)

我们的目的&#xff1a;就是下面的这个玩意&#xff1a; 主要也就三步 1、创建容器编排模版 2、创建容器 3、配置 第一步&#xff1a;创建编排模版 代码我放下面了&#xff1a;&#xff08;你要记住这里开放的是3210端口&#xff09; # https://github.com/lobehub/lobe-ch…

Spring Boot驱动的植物健康监测革命

1系统概述 1.1 研究背景 随着计算机技术的发展以及计算机网络的逐渐普及&#xff0c;互联网成为人们查找信息的重要场所&#xff0c;二十一世纪是信息的时代&#xff0c;所以信息的管理显得特别重要。因此&#xff0c;使用计算机来管理植物健康系统的相关信息成为必然。开发合适…

Linux Redis查询key与移除日常操作

维护老项目Express node 编写的后端程序、有这么一个方法、没有设置redis过期时间&#xff08;建议设置过期时间&#xff0c;毕竟登录生产服务器并不是每个人都有权限登录的&#xff01;&#xff01;&#xff01;&#xff09;。如果变动只能通过登录生产服务器、手动修改… 于…

自动化抖音点赞取消脚本批量处理

&#x1f31f; 前言 欢迎来到我的技术小宇宙&#xff01;&#x1f30c; 这里不仅是我记录技术点滴的后花园&#xff0c;也是我分享学习心得和项目经验的乐园。&#x1f4da; 无论你是技术小白还是资深大牛&#xff0c;这里总有一些内容能触动你的好奇心。&#x1f50d; &#x…

CSS综合案例——新闻详情

一、知识点 1、文字颜色 属性名&#xff1a;color 属性值&#xff1a; 颜色表示方式属性值说明使用场景颜色关键字颜色英文单词red,green,blue学习测试rgb表示法rg(r,g,b)r,g,b表示红绿蓝三原色&#xff0c;取值0-255了解rgba表示法rgba(r,g,b,a)a表示透明度&#xff0c;取…

CVE-2024-36401 Geoserver远程代码执行漏洞复现

目录 CVE-2024-36401 Geoserver远程代码执行漏洞 影响版本 环境搭建 漏洞复现 poc GeoServer是一个用Java编写的开源软件服务器&#xff0c;允许用户共享和编辑地理空间数据。它为提供交互操作性而设计&#xff0c;使用开放标准发布来自任何主要空间数据源的数据。 CVE-20…

大模型日常:支持中英混合及多语言文生语音的MeloTTS本地部署

简要介绍 MeloTTS 是一个强大的多语言文本转语音库&#xff0c;特别设计以支持CPU环境下的实时语音合成&#xff0c;无需依赖GPU。该库能够输出自然流畅的语音&#xff0c;提供了一种高效便捷的方式&#xff0c;将文本信息转换为听觉内容。MeloTTS不仅支持多种语言&#xff0c…

Ubuntu20.04安装opencv3.1.0(包含详细解决报错方法)

我的环境是cuda10.1 cmake是3.16.5 第一步骤&#xff1a;下载安装包 第二步骤&#xff1a;编译环境安装 第三步骤&#xff1a;解压opencv安装包&#xff0c;并且在opencv文件夹内新建build文件夹 第四步骤&#xff1a;打开cmake-gui&#xff0c; 第五步骤&#xff1a;进行…

驱动-----内核启动

目录 一、最小系统 二.操作系统 三.操作系统的启动 四.linux启动准备工作 五.安装nfs和tftp环境 六.总结 设备驱动:驱使设备行动的程序。 裸机程序:没有和操作系统结合的驱动程序pwm.c,uart.c,adc.c 有操作系统的时候,应用层不能直接操作硬件,由底层写驱动的人写…

凹凸性和拐点的概念

二阶导不存在也可能是拐点 判断拐点的充分条件

第三十一篇:TCP协议如何解决丢包的问题,TCP系列六

前面我们说TCP协议是可靠的、基于字节流、面向连接的传输层通信协议&#xff1b; 这里我想换种说法&#xff1a;与其说是TCP协议是可靠的&#xff0c;不如说传输层程序软件实现了TCP协议的规范&#xff08;网络层次模型&#xff0c;每一层都有对应的程序软件&#xff09;&…

【从零开始的LeetCode-算法】3185. 构成整天的下标对数目 II

给你一个整数数组 hours&#xff0c;表示以 小时 为单位的时间&#xff0c;返回一个整数&#xff0c;表示满足 i < j 且 hours[i] hours[j] 构成 整天 的下标对 i, j 的数目。 整天 定义为时间持续时间是 24 小时的 整数倍 。 例如&#xff0c;1 天是 24 小时&#xff0c…