实验3-实时数据流处理-Flink

1.前期准备

(1)Flink基础环境安装

参考文章:

利用docker-compose来搭建flink集群-CSDN博客

显示为这样就成功了

(2)把docker,docker-compose,kafka集群安装配置好

参考文章:

利用docker搭建kafka集群并且进行相应的实践-CSDN博客

这篇文章里面有另外两篇文章的链接,点进去就能够看到

(3)在windows上面,创建一个数据库mysql1(如果没有的话就需要创建),接着在这个数据库里面建一个表min_table

具体代码如下

create database if not exists mysql1; -- 注释符为‘-- '注意有个空格

use mysql1;

CREATE TABLE min_table (

    id INT AUTO_INCREMENT PRIMARY KEY,

    timestamp TIMESTAMP NOT NULL,

    quantity INT NOT NULL,

    amount DOUBLE NOT NULL,

    UNIQUE KEY unique_timestamp (timestamp)

);

create database if not exists mysql1; -- 注释符为‘-- '注意有个空格use mysql1;CREATE TABLE min_table (id INT AUTO_INCREMENT PRIMARY KEY,timestamp TIMESTAMP NOT NULL,quantity INT NOT NULL,amount DOUBLE NOT NULL,UNIQUE KEY unique_timestamp (timestamp));

(4)接着在安装配置了flink的linux虚拟机上面安装好mysql

参考文章:黑马大数据学习笔记4-Hive部署和基本操作_黑马大数据 hive笔记-CSDN博客

 (5)然后同样的在linux虚拟机上面的mysql中创建一个数据库mysql1(如果没有的话就需要创建),接着在这个数据库里面建一个表min_table

具体代码如下

create database if not exists mysql1; -- 注释符为‘-- '注意有个空格

use mysql1;

CREATE TABLE min_table (

    id INT AUTO_INCREMENT PRIMARY KEY,

    timestamp TIMESTAMP NOT NULL,

    quantity INT NOT NULL,

    amount DOUBLE NOT NULL,

    UNIQUE KEY unique_timestamp (timestamp)

);

create database if not exists mysql1; -- 注释符为‘-- '注意有个空格use mysql1;CREATE TABLE min_table (id INT AUTO_INCREMENT PRIMARY KEY,timestamp TIMESTAMP NOT NULL,quantity INT NOT NULL,amount DOUBLE NOT NULL,UNIQUE KEY unique_timestamp (timestamp));

(6)在idea里面新建一个Maven项目,名字叫做FlinkDemo然后往pom.xml中添加以下配置

<dependencies><!-- Flink 的核心库 --><dependency><groupId>org.apache.flink</groupId><artifactId>flink-java</artifactId><version>1.18.0</version></dependency><dependency><groupId>org.apache.flink</groupId><artifactId>flink-streaming-java</artifactId><version>1.18.0</version></dependency><dependency><groupId>org.apache.flink</groupId><artifactId>flink-clients</artifactId><version>1.18.0</version></dependency><!-- Flink Kafka Connector --><dependency><groupId>org.apache.flink</groupId><artifactId>flink-connector-kafka</artifactId><version>3.0.1-1.18</version></dependency><dependency><groupId>org.apache.flink</groupId><artifactId>flink-connector-jdbc</artifactId><version>3.1.1-1.17</version></dependency><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.33</version></dependency></dependencies>
<build><plugins><plugin><artifactId>maven-assembly-plugin</artifactId><configuration><descriptorRefs><descriptorRef>jar-with-dependencies</descriptorRef></descriptorRefs></configuration><executions><execution><phase>package</phase><goals><goal>single</goal></goals></execution></executions></plugin></plugins>
</build>

这个和上面的是一个东西,就看你喜欢一键复制还是分别复制了

<dependencies>
    <!-- Flink 的核心库 -->
    <dependency>
        <groupId>org.apache.flink</groupId>
        <artifactId>flink-java</artifactId>
        <version>1.18.0</version>
    </dependency>
    <dependency>
        <groupId>org.apache.flink</groupId>
        <artifactId>flink-streaming-java</artifactId>
        <version>1.18.0</version>
    </dependency>
    <dependency>
        <groupId>org.apache.flink</groupId>
        <artifactId>flink-clients</artifactId>
        <version>1.18.0</version>
    </dependency>

    <!-- Flink Kafka Connector -->
    <dependency>
        <groupId>org.apache.flink</groupId>
        <artifactId>flink-connector-kafka</artifactId>
        <version>3.0.1-1.18</version>
    </dependency>
    <dependency>
        <groupId>org.apache.flink</groupId>
        <artifactId>flink-connector-jdbc</artifactId>
        <version>3.1.1-1.17</version>
    </dependency>
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>8.0.33</version>
    </dependency>


</dependencies>
<build>
    <plugins>
        <plugin>
            <artifactId>maven-assembly-plugin</artifactId>
            <configuration>
                <descriptorRefs>
                    <descriptorRef>jar-with-dependencies</descriptorRef>
                </descriptorRefs>
            </configuration>
            <executions>
                <execution>
                    <phase>package</phase>
                    <goals>
                        <goal>single</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>

(7)在该项目的com.examle目录下创建三个文件

     目录结构如下

DatabaseSink.java
package com.example;import org.apache.flink.streaming.api.datastream.DataStream;
import org.apache.flink.streaming.api.functions.sink.SinkFunction;
import org.apache.flink.connector.jdbc.JdbcSink;
import org.apache.flink.connector.jdbc.JdbcExecutionOptions;
import org.apache.flink.connector.jdbc.JdbcConnectionOptions;
import org.apache.flink.types.Row;
import org.apache.flink.api.common.typeinfo.Types;
import org.apache.flink.api.java.tuple.Tuple3;import java.sql.PreparedStatement;
import java.sql.Timestamp;public class DatabaseSink {private String url;private String username;private String password;public DatabaseSink(String url, String username, String password) {this.url = url;this.username = username;this.password = password;}public void addSink(DataStream<Tuple3<Timestamp, Long, Double>> stream) {stream.addSink(JdbcSink.sink("INSERT INTO min_table (timestamp, quantity, amount) VALUES (?, ?, ?) ON DUPLICATE KEY UPDATE quantity = quantity + VALUES(quantity), amount = amount + VALUES(amount)",(ps, t) -> {ps.setTimestamp(1, t.f0);ps.setLong(2, t.f1);ps.setDouble(3, t.f2);},new JdbcExecutionOptions.Builder().withBatchSize(5000).withBatchIntervalMs(200).withMaxRetries(5).build(),new JdbcConnectionOptions.JdbcConnectionOptionsBuilder().withUrl(this.url).withDriverName("com.mysql.jdbc.Driver").withUsername(this.username).withPassword(this.password).build()));}
}
LocalFlinkTest.java
package com.example;import org.apache.flink.api.common.eventtime.WatermarkStrategy;
import org.apache.flink.api.common.functions.FilterFunction;
import org.apache.flink.api.common.functions.FlatMapFunction;
import org.apache.flink.api.common.restartstrategy.RestartStrategies;
import org.apache.flink.api.common.serialization.SimpleStringSchema;
import org.apache.flink.api.java.tuple.Tuple;
import org.apache.flink.api.java.tuple.Tuple3;
import org.apache.flink.connector.kafka.source.KafkaSource;
import org.apache.flink.connector.kafka.source.enumerator.initializer.OffsetsInitializer;
import org.apache.flink.streaming.api.datastream.DataStream;
import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment;
import org.apache.flink.streaming.api.windowing.assigners.TumblingProcessingTimeWindows;
import org.apache.flink.streaming.api.windowing.time.Time;
import org.apache.flink.streaming.api.functions.windowing.ProcessWindowFunction;
import org.apache.flink.util.Collector;
import org.apache.flink.connector.jdbc.JdbcConnectionOptions;
import org.apache.flink.connector.jdbc.JdbcExecutionOptions;
import org.apache.flink.connector.jdbc.JdbcSink;
import org.apache.kafka.clients.consumer.OffsetResetStrategy;import java.sql.Timestamp;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.concurrent.TimeUnit;public class LocalFlinkTest {public static void main(String[] args) throws Exception {SimpleDateFormat sdf = new SimpleDateFormat(("yyyy-MM-dd HH:mm"));SimpleDateFormat sdf_hour = new SimpleDateFormat("yyyy-MM-dd HH");final StreamExecutionEnvironment env =StreamExecutionEnvironment.getExecutionEnvironment();env.setRestartStrategy(RestartStrategies.fixedDelayRestart(333, // 尝试重启的次数org.apache.flink.api.common.time.Time.of(10, TimeUnit.SECONDS) // 延迟));env.setRestartStrategy(RestartStrategies.noRestart());KafkaSource<String> source = KafkaSource.<String>builder().setBootstrapServers("192.168.88.101:19092,192.168.88.101:29092,192.168.88.101:39092") // 你的 Kafka 服务器地址.setGroupId("testGroup") // 你的消费者组 ID.setTopics("foo") // 你的主题.setValueOnlyDeserializer(new SimpleStringSchema()).setStartingOffsets(OffsetsInitializer.committedOffsets(OffsetResetStrategy.LATEST)) // 从消费者组的最新偏移量开始消费.build();DataStream<String> stream = env.fromSource(source,WatermarkStrategy.noWatermarks(), "Kafka Source");
// flatMap 函数,它接收一个输入元素,并可以输出零个、一个或多个元素。
// 在这个函数中,输入元素是从 Kafka 中读取的一行数据,输出元素是一个包含交易量的元组。
// 近 1 分钟与当天累计的总交易金额、交易数量
//                DataStream<String> stream = env.readTextFile("D:\\idea\\flinkTest\\src\\main\\java\\com\\springbootdemo\\2.csv", "GBK");DataStream<Tuple3<Timestamp, Long, Double>> transactionVolumes = stream.filter(new FilterFunction<String>() {@Overridepublic boolean filter(String value) throws Exception {// 假设文件的第一行是表头,这里跳过它return !value.startsWith("time");}}).flatMap(new FlatMapFunction<String, Tuple3<Timestamp, Long,Double>>() {@Overridepublic void flatMap(String line, Collector<Tuple3<Timestamp, Long,Double>> out) {try {String[] fields = line.split(",");String s = fields[0];
// 解析时间字符串后,将日期时间对象的秒字段设置为 0Date date = sdf.parse(s);Timestamp sqlTimestamp = new Timestamp(date.getTime());double price = Double.parseDouble(fields[3]);long quantity = Long.parseLong(fields[4]);double amount = price * quantity;out.collect(Tuple3.of(sqlTimestamp, quantity, amount));
// System.out.println(line);} catch (Exception e) {System.out.println(line);                        }}}); // 过滤掉解析失败的记录;// 计算每 500 毫秒的数据
// keyBy(t -> t.f0)代表以第一个字段 Timestamp 为键,确保一个窗口内的时间都是相同的DataStream<Tuple3<Timestamp,Long ,Double>> oneSecondAmounts =transactionVolumes.keyBy(t -> t.f0).windowAll(TumblingProcessingTimeWindows.of(Time.seconds(10))).reduce((Tuple3<Timestamp,Long ,Double> value1,Tuple3<Timestamp,Long ,Double> value2) -> {
//                            System.out.println(Tuple3.of(value1.f0,value1.f1 + value2.f1, value1.f2 + value2.f2));return Tuple3.of(value1.f0,value1.f1 + value2.f1, value1.f2 +value2.f2);});oneSecondAmounts.print();DatabaseSink dbSink = new DatabaseSink("jdbc:mysql://localhost:3306/mysql1", "root", "123456");dbSink.addSink(oneSecondAmounts);env.execute("Kafka Flink Demo");}
}
DatabaseSink dbSink = new DatabaseSink("jdbc:mysql://localhost:3306/mysql1", "root", "123456");

这里的密码应该改成你自己的。(当然博主本人的是123456)

FlinkTest.java
package com.example;import org.apache.flink.api.common.eventtime.WatermarkStrategy;
import org.apache.flink.api.common.functions.FilterFunction;
import org.apache.flink.api.common.functions.FlatMapFunction;
import org.apache.flink.api.common.restartstrategy.RestartStrategies;
import org.apache.flink.api.common.serialization.SimpleStringSchema;
import org.apache.flink.api.java.tuple.Tuple;
import org.apache.flink.api.java.tuple.Tuple3;
import org.apache.flink.connector.kafka.source.KafkaSource;
import org.apache.flink.connector.kafka.source.enumerator.initializer.OffsetsInitializer;
import org.apache.flink.streaming.api.datastream.DataStream;
import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment;
import org.apache.flink.streaming.api.windowing.assigners.TumblingProcessingTimeWindows;
import org.apache.flink.streaming.api.windowing.time.Time;
import org.apache.flink.streaming.api.functions.windowing.ProcessWindowFunction;
import org.apache.flink.util.Collector;
import org.apache.flink.connector.jdbc.JdbcConnectionOptions;
import org.apache.flink.connector.jdbc.JdbcExecutionOptions;
import org.apache.flink.connector.jdbc.JdbcSink;
import org.apache.kafka.clients.consumer.OffsetResetStrategy;import java.sql.Timestamp;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.concurrent.TimeUnit;public class FlinkTest {public static void main(String[] args) throws Exception {SimpleDateFormat sdf = new SimpleDateFormat(("yyyy-MM-dd HH:mm"));SimpleDateFormat sdf_hour = new SimpleDateFormat("yyyy-MM-dd HH");final StreamExecutionEnvironment env =StreamExecutionEnvironment.getExecutionEnvironment();env.setRestartStrategy(RestartStrategies.fixedDelayRestart(333, // 尝试重启的次数org.apache.flink.api.common.time.Time.of(10, TimeUnit.SECONDS) // 延迟));env.setRestartStrategy(RestartStrategies.noRestart());KafkaSource<String> source = KafkaSource.<String>builder().setBootstrapServers("192.168.88.101:19092,192.168.88.101:29092,192.168.88.101:39092") // 你的 Kafka 服务器地址.setGroupId("testGroup") // 你的消费者组 ID.setTopics("foo") // 你的主题.setValueOnlyDeserializer(new SimpleStringSchema()).setStartingOffsets(OffsetsInitializer.committedOffsets(OffsetResetStrategy.LATEST)) // 从消费者组的最新偏移量开始消费.build();DataStream<String> stream = env.fromSource(source,WatermarkStrategy.noWatermarks(), "Kafka Source");
// flatMap 函数,它接收一个输入元素,并可以输出零个、一个或多个元素。
// 在这个函数中,输入元素是从 Kafka 中读取的一行数据,输出元素是一个包含交易量的元组。
// 近 1 分钟与当天累计的总交易金额、交易数量
//                DataStream<String> stream = env.readTextFile("D:\\idea\\flinkTest\\src\\main\\java\\com\\springbootdemo\\2.csv", "GBK");DataStream<Tuple3<Timestamp, Long, Double>> transactionVolumes = stream.filter(new FilterFunction<String>() {@Overridepublic boolean filter(String value) throws Exception {// 假设文件的第一行是表头,这里跳过它return !value.startsWith("time");}}).flatMap(new FlatMapFunction<String, Tuple3<Timestamp, Long,Double>>() {@Overridepublic void flatMap(String line, Collector<Tuple3<Timestamp, Long,Double>> out) {try {String[] fields = line.split(",");String s = fields[0];
// 解析时间字符串后,将日期时间对象的秒字段设置为 0Date date = sdf.parse(s);Timestamp sqlTimestamp = new Timestamp(date.getTime());double price = Double.parseDouble(fields[3]);long quantity = Long.parseLong(fields[4]);double amount = price * quantity;out.collect(Tuple3.of(sqlTimestamp, quantity, amount));
// System.out.println(line);} catch (Exception e) {System.out.println(line);                        }}}); // 过滤掉解析失败的记录;// 计算每 500 毫秒的数据
// keyBy(t -> t.f0)代表以第一个字段 Timestamp 为键,确保一个窗口内的时间都是相同的DataStream<Tuple3<Timestamp,Long ,Double>> oneSecondAmounts =transactionVolumes.keyBy(t -> t.f0).windowAll(TumblingProcessingTimeWindows.of(Time.seconds(10))).reduce((Tuple3<Timestamp,Long ,Double> value1,Tuple3<Timestamp,Long ,Double> value2) -> {
//                            System.out.println(Tuple3.of(value1.f0,value1.f1 + value2.f1, value1.f2 + value2.f2));return Tuple3.of(value1.f0,value1.f1 + value2.f1, value1.f2 +value2.f2);});oneSecondAmounts.print();DatabaseSink dbSink = new DatabaseSink("jdbc:mysql://192.168.88.101:3306/mysql1", "root", "123456");dbSink.addSink(oneSecondAmounts);env.execute("Kafka Flink Demo");}
}
DatabaseSink dbSink = new DatabaseSink("jdbc:mysql://192.168.88.101:3306/mysql1", "root", "123456");

这里的密码和主机号(192.168.88.101)应该改成你自己的密码和主机号

2.开始实验,分为本地测试和flink测试

(1)启动node1,打开Finalshell,启动docker,启动kafka集群,flink集群

systemctl start docker
cd /export/server
docker-compose -f kafka.yml up -d
docker-compose -f flink.yml up -d
docker ps

效果如下

(2)先进行本地测试(这里只需要用到kafka集群)

打开两个node1的窗口
在第二个窗口进入kafka2容器,启动消费者进程

代码

docker exec -it kafka2 /bin/bash
cd /opt/bitnami/kafka/bin
kafka-console-consumer.sh --bootstrap-server 172.23.0.11:9092,172.23.0.12:9092,172.23.0.13:9092 --topic foo

 效果如下

进入idea,运行这个文件LocalFlinkTest.java

在第一个窗口进入kafka1容器,发送文件的前5行

[root@node1 server]# docker exec -it kafka1 /bin/bash

root@a2f7152188c1:/#  cd /opt/bitnami/kafka/bin

root@a2f7152188c1:/opt/bitnami/kafka/bin# head -n 5 /bitnami/kafka/stock-part10.csv | kafka-console-producer.sh --broker-list 172.23.0.11:9092,172.23.0.12:9092,172.23.0.13:9092 --topic foo

root@a2f7152188c1:/opt/bitnami/kafka/bin#

代码

docker exec -it kafka1 /bin/bash
cd /opt/bitnami/kafka/bin
head -n 5 /bitnami/kafka/stock-part10.csv | kafka-console-producer.sh --broker-list 172.23.0.11:9092,172.23.0.12:9092,172.23.0.13:9092 --topic foo

接着在idea里面查看

在mysql里查看

到这里,本地测试就已经成功了!

(3)再进行flink测试,先在idea这里双击packge,然后去target目录看看有没有多出这两个文件(先运行文件FlinkTest.java先)

运行文件FlinkTest.java

在idea这里双击packge,然后去target目录看看有没有多出这两个文件 

进入网页node1:8081,上传这个名字更长的jar包

输入这个路径
D:\JetBrains\idea-project\FlinkDemo\target
(反正就是target目录的位置)

添加成功后

点一下那个玩意儿填入如下内容com.example.FlinkTest

这个com.example.FlinkTest是FlinkTest.java在项目中的路径

以及选择输入3

然后点击submit提交即可,结果显示正常运行

再回到node1的第一个窗口,
在这个位置
root@41d3910fe6c9:/opt/bitnami/kafka/bin#输入以下代码(kafka1的/opt/bitnami/kafka/bin目录下)来发个文件过去

代码

cat /bitnami/kafka/stock-part10.csv | kafka-console-producer.sh --broker-list 172.23.0.11:9092,172.23.0.12:9092,172.23.0.13:9092 --topic foo

任意点开一个,在监控参数中选择numRecordsInPerSecond可以查看每秒处理数据速度。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Java】—— 图书管理系统

基于往期学习的类和对象、继承、多态、抽象类和接口来完成一个控制台版本的 “图书管理系统” 在控制台界面中实现用户与程序交互 任务目标&#xff1a; 1、系统中能够表示多本图书的信息 2、提供两种用户&#xff08;普通用户&#xff0c;管理员&#xff09; 3、普通用户…

Google BERT入门(3)Transformer的自注意力机制的理解(下)

文章目录 4.自注意力机制的理解步骤 4 4.自注意力机制的理解 步骤 4 我们计算了查询矩阵和键矩阵之间的点积&#xff0c;得到了分数&#xff0c;然后使用softmax函数对分数进行了归一化。现在&#xff0c;自注意力机制的最后一步是计算注意力矩阵Z。 注意力矩阵包含句子中每…

大舍传媒-关于海外媒体宣发的探讨

关于海外媒体宣发的探讨 一、海外媒体宣发的重要性 在当今全球化的时代&#xff0c;海外媒体宣发对于企业、组织和个人来说具有至关重要的意义。通过有效的海外媒体宣发&#xff0c;可以提升品牌知名度&#xff0c;拓展国际市场&#xff0c;增强影响力&#xff0c;吸引更多的潜…

城市基础设施数字化管理:打造安全、智能的城市生命线

随着数字化转型的深入&#xff0c;城市基础设施生命线的安全管理正面临前所未有的机遇与挑战。城市基础设施&#xff0c;包括交通、能源、供水、排水、通信等&#xff0c;是城市运行的“生命线”&#xff0c;其安全治理直接关系到城市的稳定与人民生活的安全。 数字化转型对城…

241207-通过Docker部署Wiki.JS并设置ElasticSearch进行中文搜索

A. 最终效果 B. 配置文件 version: "3" services:wiki:image: ghcr.io/requarks/wiki:2container_name: wikijsports:- "3000:3000"volumes:- /home/lgk/Projects/WikiJS/config:/configenvironment:- DB_TYPEpostgres- DB_HOSTdatabase- DB_PORT5432- DB…

ConcurrentLinkedQueue<>实现生产者-消费者问题理解和简易demo

1.ConcurrentLinkedQueue<> ConcurrentLinkedQueue 是 Java 中的一个线程安全的无界队列实现。它基于无锁&#xff08;lock-free&#xff09;的算法&#xff0c;采用了一个高效的、非阻塞的、可伸缩并发控制机制。这使得在高并发场景下能够实现较高的吞吐量。 无界性质…

LDR6500:音频双C支持,数字与模拟的完美结合

在当今数字化快速发展的时代&#xff0c;音频设备的兼容性和性能成为了用户关注的重点。LDR6500&#xff0c;作为乐得瑞科技精心研发的USB Power Delivery&#xff08;PD&#xff09;协议芯片&#xff0c;凭借其卓越的性能和广泛的应用兼容性&#xff0c;为音频设备领域带来了新…

面试技术点之安卓篇

一、基础 二、高级 三、组件 Android中SurfaceView和TextureView有什么区别&#xff1f; 参考 Android中SurfaceView和TextureView有什么区别&#xff1f; 四、三方框架 五、系统源码 六、性能优化

Mock神器:Easy-Mock 私有化部署及使用介绍

在现代前后端分离的开发模式中&#xff0c;后端接口的数据模拟是一个常见且必要的需求。尤其是在后端接口尚未开发完成时&#xff0c;前端开发需要依赖模拟数据进行开发与测试。Easy-Mock 是一个非常流行的开源工具&#xff08;虽然它已经停止更新好长时间了&#xff09;&#…

React v19稳定版发布12.5

&#x1f916; 作者简介&#xff1a;水煮白菜王 &#xff0c;一位资深前端劝退师 &#x1f47b; &#x1f440; 文章专栏&#xff1a; 前端专栏 &#xff0c;记录一下平时在博客写作中&#xff0c;总结出的一些开发技巧✍。 感谢支持&#x1f495;&#x1f495;&#x1f495; 目…

如何在Ubuntu中利用repo和git地址下载获取imx6ull的BSP

01-设置git的用户名和邮箱 git config --global user.name "suwenhao" git config --global user.email "2487872782qq.com"这里不设置的话后面在第5步的repo配置中还是会要求输入&#xff0c;而且以后进行相关操作都要输入&#xff0c;不妨现在就进行配置…

高德地图3D地图SDK造成ANR问题记录

问题描述&#xff1a; 在新接手的项目中使用到了高德地图的3D的SDK,其依赖导入如下 api com.amap.api:3dmap:latest.integrationapi com.amap.api:search:9.7.0在使用过程中&#xff0c;用到了TileOverlay图层&#xff0c;使用过程中有一下两个问题&#xff1a; 1.在特定的AMAP…

【AI实战项目】基于OpenCV的“颜色识别项目”完整操作过程

OpenCV是一个广受欢迎且极为流行的计算机视觉库&#xff0c;它因其强大的功能、灵活性和开源特性而在开发者和研究者中备受青睐。 学习OpenCV主要就是学习里面的计算机视觉算法。要学习这些算法的原理&#xff0c;知道它们适用于哪些场景&#xff0c;然后通过Python编写代码来…

浅谈网络 | 应用层之云网络隔离GRE/VXLAN

目录 前言GRE 隧道技术VXLANGRE/VXLAN接入云平台 前言 之前提到&#xff0c;为云平台中的租户实现隔离时&#xff0c;常用的策略是基于 VLAN。然而&#xff0c;VLAN 只有 12 位&#xff0c;共支持 4096 个 ID&#xff0c;这在最初设计时看似足够&#xff0c;但随着云计算的快速…

Spark on Yarn安装配置,大数据技能竞赛(容器环境)

Spark on Yarn模式&#xff0c;即把Spark作为一个客户端&#xff0c;将作业提交给Yarn服务&#xff0c;由于在生产环境中&#xff0c;很多时候都要与Hadoop使用同一个集群&#xff0c;因此采用Yarn来管理资源调度&#xff0c;可以有效提高资源利用率。 环境说明&#xff1a; 服…

java+springboot+mysql在线文件管理系统

项目介绍&#xff1a; 使用javaspringbootmysql开发的在线文件管理系统&#xff0c;系统包含管理员、使用员、监察员角色&#xff0c;功能如下&#xff1a; 管理员&#xff1a;使用员管理&#xff1b;监测员管理&#xff1b;留言管理&#xff08;回复&#xff09;&#xff1b…

SD Express 卡漏洞导致笔记本电脑和游戏机遭受内存攻击

Positive Technologies 最近发布的一份报告揭示了一个名为 DaMAgeCard 的新漏洞&#xff0c;攻击者可以利用该漏洞利用 SD Express 内存卡直接访问系统内存。 该漏洞利用了 SD Express 中引入的直接内存访问 (DMA) 功能来加速数据传输速度&#xff0c;但也为对支持该标准的设备…

基于单片机的智能灯光控制系统

摘要 现在的大部分的大学&#xff0c;都是采用了一种“绿色”的教学方式&#xff0c;再加上现在的大学生缺乏环保意识&#xff0c;所以在学校里很多的教室&#xff0c;在白天的时候灯都会打开&#xff0c;这是一种极大的浪费&#xff0c;而且随时都有可能看到&#xff0c;这是…

ros项目dual_arm_pick-place(urdf文件可视化查看)

前言 一直想写一些项目的讲解&#xff0c;今天&#xff08;2024.12.05&#xff09;可以说正式开始了。 dual_arm_pick-place项目&#xff0c;是关于两个机械臂协同传递物品。 正文 这次的话&#xff0c;给大家讲一下里面的urdf文件。 这篇文章主要来看一下项目中的urdf文件…

springSecurity权限控制

权限控制&#xff1a;不同的用户可以使用不同的功能。 我们不能在前端判断用户权限来控制显示哪些按钮&#xff0c;因为这样&#xff0c;有人会获取该功能对应的接口&#xff0c;就不需要通过前端&#xff0c;直接发送请求实现功能了。所以需要在后端进行权限判断。&#xff0…