MR实战:IP地址去重

文章目录

  • 1. 实战概述
  • 2. 提出任务
    • 2.1 原始问题
    • 2.2 简单化处理
  • 3. 准备数据
    • 3.1 在云主机上创建文本文件
    • 3.2 上传文件到HDFS指定目录
  • 4. 实现步骤
    • 4.1 创建Maven项目
    • 4.2 添加相关依赖
    • 4.3 创建日志属性文件
    • 4.4 创建网址去重映射器类
    • 4.5 创建网址去重归并器类
    • 4.6 创建网址去重驱动器类
    • 4.7 启动应用,查看结果
  • 5. 拓展练习1 - 显示每个网址重复次数
    • 5.1 修改网址去重归并器
    • 5.2 修改网址去重驱动器类
    • 5.3 启动应用,查看结果
  • 6. 拓展练习2 - 按网址重复次数降序排列
    • 6.1 创建网址实体类
    • 6.2 修改网址去重归并器类
    • 6.3 启动应用,查看结果
    • 6.4 解决重复次数相同的网址被删问题
    • 6.5 启动应用,查看结果
  • 7. 实战小结

1. 实战概述

  • 本次实战通过Hadoop MapReduce实现了IP地址的去重与统计。首先,使用Mapper读取IP地址并输出,Reducer进行去重操作。接着,扩展功能统计每个IP地址的访问次数,并按访问次数降序排列。通过自定义IPBean类和调整Reducer逻辑,解决了排序过程中重复次数相同的IP地址被删除的问题。最终,成功输出去重后的IP地址及其访问次数,并按访问次数降序排列。

2. 提出任务

2.1 原始问题

  • 某人今天访问了许多不同的网站,移动或电信日志会记录每次访问的详细信息。有些网站被频繁访问,而有些则访问次数较少。为了分析该用户的访问行为,需要统计他今天访问了多少个不同的网站。通过处理日志数据,去除重复的网站记录,可以准确计算出他访问的唯一网站数量。这一过程不仅有助于了解用户的浏览习惯,还能为网络优化和个性化推荐提供数据支持。

2.2 简单化处理

  • 假如有如下一些IP地址,如何去掉重复地址?
192.168.234.21
192.168.234.22
192.168.234.21
192.168.234.21
192.168.234.23
192.168.234.21
192.168.234.21
192.168.234.21
192.168.234.25
192.168.234.21
192.168.234.21
192.168.234.26
192.168.234.21
192.168.234.27
192.168.234.21
192.168.234.27
192.168.234.21
192.168.234.29
192.168.234.21
192.168.234.26
192.168.234.21
192.168.234.25
192.168.234.25
192.168.234.21
192.168.234.22
192.168.234.21

3. 准备数据

3.1 在云主机上创建文本文件

  • 执行命令:vim ips.txt,录入IP地址,存盘退出,然后执行命令:cat ips.txt
    在这里插入图片描述

3.2 上传文件到HDFS指定目录

  • 执行命令:hdfs dfs -mkdir -p /deduplicateips/input,创建目录
    在这里插入图片描述
  • 执行命令:hdfs dfs -put ips.txt /deduplicateips/input,上传文件
    在这里插入图片描述

4. 实现步骤

4.1 创建Maven项目

  • 设置项目名称、位置、构建系统、JDK版本……
    在这里插入图片描述
  • 单击【Create】按钮,生成项目基本骨架
    在这里插入图片描述

4.2 添加相关依赖

  • 修改pom.xml文件,添加依赖
    在这里插入图片描述
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>net.huawei.mr</groupId><artifactId>DeduplicateIPs</artifactId><version>1.0-SNAPSHOT</version><properties><maven.compiler.source>8</maven.compiler.source><maven.compiler.target>8</maven.compiler.target><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding></properties><dependencies><!--hadoop客户端--><dependency><groupId>org.apache.hadoop</groupId><artifactId>hadoop-client</artifactId><version>3.3.4</version></dependency><!--单元测试框架--><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.13.2</version></dependency></dependencies></project>
  • 刷新项目依赖
    在这里插入图片描述

4.3 创建日志属性文件

  • resources目录里创建log4j.properties文件
    在这里插入图片描述
log4j.rootLogger=ERROR, stdout, logfile
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d %p [%c] - %m%n
log4j.appender.logfile=org.apache.log4j.FileAppender
log4j.appender.logfile.File=target/deduplicateips.log
log4j.appender.logfile.layout=org.apache.log4j.PatternLayout
log4j.appender.logfile.layout.ConversionPattern=%d %p [%c] - %m%n

4.4 创建网址去重映射器类

  • 创建net.huawei.mr
    在这里插入图片描述
  • net.huawei.mr包里创建DeduplicateIPsMapper
    在这里插入图片描述
package net.huawei.mr;import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.NullWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Mapper;import java.io.IOException;/*** 功能:网址去重映射器类* 作者:华卫* 日期:2025年01月09日*/
public class DeduplicateIPsMapper extends Mapper<LongWritable, Text, Text, NullWritable> {@Overrideprotected void map(LongWritable key, Text value, Context context)throws IOException, InterruptedException {context.write(value, NullWritable.get());}
}
  • 代码说明:DeduplicateIPsMapper 是一个Hadoop MapReduce的Mapper类,用于处理IP地址的去重任务。它继承自Mapper<LongWritable, Text, Text, NullWritable>,表示输入键为行偏移量(LongWritable),输入值为IP地址(Text),输出键为IP地址(Text),输出值为NullWritable(无实际值)。在map方法中,直接将输入的IP地址作为键输出,值为NullWritable.get(),以便在Reducer阶段进行去重操作。

4.5 创建网址去重归并器类

  • net.huawei.mr包里创建DeduplicateIPsReducer
    在这里插入图片描述
package net.huawei.mr;import org.apache.hadoop.io.NullWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Reducer;import java.io.IOException;/*** 功能:网址去重归并器类* 作者:华卫* 日期:2025年01月09日*/
public class DeduplicateIPsReducer extends Reducer<Text, NullWritable, Text, NullWritable> {@Overrideprotected void reduce(Text key, Iterable<NullWritable> values, Context context)throws IOException, InterruptedException {context.write(key, NullWritable.get());}
}
  • 代码说明:DeduplicateIPsReducer 是一个Hadoop MapReduce的Reducer类,用于实现IP地址的去重功能。它继承自Reducer<Text, NullWritable, Text, NullWritable>,表示输入键为IP地址(Text),输入值为NullWritable,输出键为去重后的IP地址(Text),输出值为NullWritable。在reduce方法中,直接将输入的IP地址作为键输出,值为NullWritable.get(),确保每个IP地址只输出一次,从而实现去重效果。

4.6 创建网址去重驱动器类

  • net.huawei.mr包里创建DeduplicateIPsDriver
    在这里插入图片描述
package net.huawei.mr;import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FSDataInputStream;
import org.apache.hadoop.fs.FileStatus;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.IOUtils;
import org.apache.hadoop.io.NullWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;import java.net.URI;/*** 功能:网址去重驱动器类* 作者:华卫* 日期:2025年01月09日*/
public class DeduplicateIPsDriver {public static void main(String[] args) throws Exception {// 创建配置对象Configuration conf = new Configuration();// 设置客户端使用数据节点主机名属性conf.set("dfs.client.use.datanode.hostname", "true");// 获取工作实例Job job = Job.getInstance(conf);// 设置作业启动类job.setJarByClass(DeduplicateIPsDriver.class);// 设置Mapper类job.setMapperClass(DeduplicateIPsMapper.class);// 设置map任务输出键类型job.setMapOutputKeyClass(Text.class);// 设置map任务输出值类型job.setMapOutputValueClass(NullWritable.class);// 设置Reducer类job.setReducerClass(DeduplicateIPsReducer.class);// 设置reduce任务输出键类型job.setOutputKeyClass(Text.class);// 设置reduce任务输出值类型job.setOutputValueClass(NullWritable.class);// 定义uri字符串(分布式文件系统前缀)String uri = "hdfs://bigdata1:9000";// 创建输入路径Path inputPath = new Path(uri + "/deduplicateips/input");// 创建输出路径Path outputPath = new Path(uri + "/deduplicateips/output");// 获取文件系统FileSystem fs = FileSystem.get(new URI(uri), conf);// 删除输出路径(第2个参数设置是否递归删除)fs.delete(outputPath, true);// 给作业添加输入路径(允许多个)FileInputFormat.addInputPath(job, inputPath);// 给作业设置输出路径(只能一个)FileOutputFormat.setOutputPath(job, outputPath);// 等待作业完成job.waitForCompletion(true);// 输出统计结果System.out.println("======统计结果======");// 获取输出路径的文件状态数组FileStatus[] fileStatuses = fs.listStatus(outputPath);// 遍历文件状态数组for (int i = 1; i < fileStatuses.length; i++) {// 输出结果文件路径System.out.println(fileStatuses[i].getPath());// 获取文件系统字节输入流FSDataInputStream in = fs.open(fileStatuses[i].getPath());// 将结果文件显示在控制台IOUtils.copyBytes(in, System.out, 4096, true);}}
}    
  • 代码说明:DeduplicateIPsDriver 是Hadoop MapReduce任务的驱动器类,负责配置和启动IP地址去重任务。它设置了Mapper和Reducer类,并定义了输入输出路径。通过FileSystem操作HDFS文件系统,删除旧的输出目录并提交作业。作业完成后,读取并输出结果文件内容到控制台。该类实现了从HDFS读取数据、去重处理并将结果写回HDFS的完整流程。

4.7 启动应用,查看结果

  • 运行DeduplicateIPsDriver类,提示没有访问权限
    在这里插入图片描述
  • 执行命令:hdfs dfs -chmod -R 775 /deduplicateips,通过设置权限,确保只有授权用户或组可以修改/deduplicateips目录中的内容,同时其他用户可以读取和执行。
    在这里插入图片描述
  • 执行命令:hdfs dfs -chown -R huawei:supergroup /deduplicateips,更改所有者:将/deduplicateips目录及其内容的所有者设置为 huawei,这意味着huawei用户对该目录及其内容拥有完全控制权。更改组:将/deduplicateips目录及其内容的组设置为 supergroup,这意味着supergroup组的成员可以根据组权限访问该目录及其内容。
    在这里插入图片描述
  • 再次运行DeduplicateIPsDriver
    在这里插入图片描述
  • 可以看到,26个IP地址记录去重之后,只有7个IP地址记录。

5. 拓展练习1 - 显示每个网址重复次数

5.1 修改网址去重归并器

  • DeduplicateIPsReducer类的输出值类型改为IntWritablereduce方法里遍历值迭代器统计网址重复次数
    在这里插入图片描述
package net.huawei.mr;import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.NullWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Reducer;import java.io.IOException;/*** 功能:网址去重归并器类* 作者:华卫* 日期:2025年01月09日*/
public class DeduplicateIPsReducer extends Reducer<Text, NullWritable, Text, IntWritable> {@Overrideprotected void reduce(Text key, Iterable<NullWritable> values, Context context)throws IOException, InterruptedException {// 遍历值迭代器,统计值个数int count = 0;for (NullWritable value: values) {count++;}context.write(key, new IntWritable(count));}
}
  • 代码说明:DeduplicateIPsReducer 是一个Hadoop MapReduce的Reducer类,用于统计每个IP地址的出现次数。它继承自Reducer<Text, NullWritable, Text, IntWritable>,表示输入键为IP地址(Text),输入值为NullWritable,输出键为IP地址(Text),输出值为出现次数(IntWritable)。在reduce方法中,通过遍历values迭代器统计每个IP地址的出现次数,并将结果写入上下文。

5.2 修改网址去重驱动器类

  • 将输出值类型由NullWritable改为IntWritable
    在这里插入图片描述

5.3 启动应用,查看结果

  • 运行DeduplicateIPsDriver
    在这里插入图片描述
  • 目前输出结果默认按照IP地址(key)升序排列。若需根据网址重复次数降序排列,以反映网址的受欢迎程度,可以采取以下方法:首先,自定义一个WritableComparable类(如IPBean),封装IP地址及其重复次数,并实现compareTo方法以按重复次数降序排序。其次,在Reducer中使用TreeSetPriorityQueue存储结果,确保按重复次数排序后再输出。最后,可在Driver类中设置自定义的排序类(SortComparator),使MapReduce框架在Shuffle阶段按重复次数降序排序。通过这种方式,输出结果将按重复次数从高到低排列,直观展示受欢迎程度。

6. 拓展练习2 - 按网址重复次数降序排列

6.1 创建网址实体类

  • net.huawei.mr包里创建IPBean
    在这里插入图片描述
package net.huawei.mr;import org.apache.hadoop.io.WritableComparable;import java.io.DataInput;
import java.io.DataOutput;
import java.io.IOException;/*** 功能:网址实体类* 作者:华卫* 日期:2025年01月09日*/
public class IPBean implements WritableComparable<IPBean> {private String ip;private int count;public String getIp() {return ip;}public void setIp(String ip) {this.ip = ip;}public int getCount() {return count;}public void setCount(int count) {this.count = count;}@Overridepublic int compareTo(IPBean o) {return o.count - this.count;}/*** 序列化操作** @param out* @throws IOException*/@Overridepublic void write(DataOutput out) throws IOException {out.writeUTF(ip);out.writeInt(count);}/*** 反序列化操作** @param in* @throws IOException*/@Overridepublic void readFields(DataInput in) throws IOException {ip = in.readUTF();count = in.readInt();}
}
  • 代码说明:IPBean 是一个自定义的Hadoop WritableComparable 类,用于封装IP地址及其访问次数。它实现了WritableComparable<IPBean>接口,支持序列化和反序列化操作。compareTo方法按访问次数降序排序,确保在MapReduce任务中能够按重复次数从高到低排列结果。通过writereadFields方法,实现了数据的序列化和反序列化,便于在Hadoop集群中传输和存储。

6.2 修改网址去重归并器类

  • DeduplicateIPsReducer 通过 TreeSet 实现IP地址去重和按访问次数降序排序。在 reduce 方法中统计IP地址出现次数,封装为 IPBean 并存入 TreeSetcleanup 方法遍历 TreeSet,按访问次数降序输出结果。利用 TreeSet 的自动排序功能,简化了排序逻辑,代码清晰高效,适用于大数据场景下的IP地址分析与处理。
package net.huawei.mr;import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.NullWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Reducer;import java.io.IOException;
import java.util.TreeSet;/*** 功能:网址去重归并器类* 作者:华卫* 日期:2025年01月09日*/
public class DeduplicateIPsReducer extends Reducer<Text, NullWritable, Text, IntWritable> {// 使用TreeSet存储IPBean对象,自动按访问次数降序排序private TreeSet<IPBean> treeSet = new TreeSet<>();@Overrideprotected void reduce(Text key, Iterable<NullWritable> values, Context context)throws IOException, InterruptedException {// 统计当前IP地址的访问次数int count = 0;for (NullWritable value: values) {count++;}// 创建IPBean对象,封装IP地址和访问次数IPBean ib = new IPBean();ib.setIp(key.toString());  // 设置IP地址ib.setCount(count);        // 设置访问次数// 将IPBean对象添加到TreeSet中,TreeSet会自动按访问次数降序排序treeSet.add(ib);}@Overrideprotected void cleanup(Context context) throws IOException, InterruptedException {// 遍历TreeSet,将排序后的IP地址及其访问次数写入上下文for (IPBean ib: treeSet) {context.write(new Text(ib.getIp()), new IntWritable(ib.getCount()));}}
}

6.3 启动应用,查看结果

  • 运行DeduplicateIPsDriver
    在这里插入图片描述
  • 虽然使用 TreeSet 成功实现了按网址重复次数降序排列,但带来了一个新问题:TreeSet 会自动去重,导致重复次数相同的网址被删除。例如,7个不同网址中,重复次数相同的网址被合并,最终只剩下4个网址。为了解决这个问题,可以采用 List 结合 Collections.sort() 的方式替代 TreeSet

6.4 解决重复次数相同的网址被删问题

  • 修改网址去重归并器类
    在这里插入图片描述
package net.huawei.mr;import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.NullWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Reducer;import java.io.IOException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;/*** 功能:网址去重归并器类* 作者:华卫* 日期:2025年01月09日*/
public class DeduplicateIPsReducer extends Reducer<Text, NullWritable, Text, IntWritable> {// 用于存储IP地址及其访问次数的列表private List<IPBean> ibList = new ArrayList<>();@Overrideprotected void reduce(Text key, Iterable<NullWritable> values, Context context)throws IOException, InterruptedException {// 统计当前IP地址的访问次数int count = 0;for (NullWritable value: values) {count++;}// 创建IPBean对象,封装IP地址和访问次数IPBean ib = new IPBean();ib.setIp(key.toString());  // 设置IP地址ib.setCount(count);        // 设置访问次数// 将IPBean对象添加到列表中ibList.add(ib);}@Overrideprotected void cleanup(Context context) throws IOException, InterruptedException {// 对列表中的IPBean对象按访问次数降序排序Collections.sort(ibList);// 遍历排序后的列表,将结果写入上下文for (IPBean ib: ibList) {context.write(new Text(ib.getIp()), new IntWritable(ib.getCount()));}}
}
  • DeduplicateIPsReducer 类通过 ListCollections.sort() 实现IP地址的去重和按访问次数降序排序。在 reduce 方法中统计IP地址的访问次数,封装为 IPBean 并存入 List。在 cleanup 方法中,使用 Collections.sort()List 按访问次数降序排序,并遍历输出结果。这种方式避免了 TreeSet 自动去重的问题,确保重复次数相同的网址都能正确显示。

6.5 启动应用,查看结果

  • 运行DeduplicateIPsDriver
    在这里插入图片描述
  • 程序成功实现了IP地址的去重和访问次数的统计。结果按访问次数降序排列,便于分析哪些IP地址访问频率较高。

7. 实战小结

  • 本次实战通过Hadoop MapReduce实现了IP地址的去重与统计。首先,使用Mapper读取IP地址并输出,Reducer进行去重操作。接着,扩展功能统计每个IP地址的访问次数,并按访问次数降序排列。通过自定义IPBean类和调整Reducer逻辑,解决了排序过程中重复次数相同的IP地址被删除的问题。最终,成功输出去重后的IP地址及其访问次数,并按访问次数降序排列。这一过程不仅展示了Hadoop MapReduce的强大功能,还为大数据处理中的去重和排序提供了实用解决方案。通过本次实战,深入理解了MapReduce的工作机制,并掌握了如何优化数据处理流程以满足实际需求。

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

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

相关文章

AnaConda下载PyTorch慢的解决办法

使用Conda下载比较慢&#xff0c;改为pip下载 复制下载链接到迅雷下载 激活虚拟环境&#xff0c;安装whl&#xff0c;即可安装成功 pip install D:\openai.wiki\ChatGLM2-6B\torch-2.4.1cu121-cp38-cp38-win_amd64.whl

Photoshop PS批处理操作教程(批量修改图片尺寸、参数等)

前言 ‌Photoshop批处理的主要作用‌是通过自动化处理一系列相似的操作来同时应用于多张图片&#xff0c;从而节省时间和精力&#xff0c;提高工作效率。批处理功能特别适用于需要批量处理的任务&#xff0c;如图像尺寸调整、颜色校正、水印添加等‌。 操作步骤 1.创建动作 …

Web渗透测试之XSS跨站脚本 防御[WAF]绕过手法

目录 XSS防御绕过汇总 参考这篇文章绕过 XSS payload XSS防御绕过汇总 服务端知道有网络攻击或者xss攻 Html 通过js代码 标签属性等手段进行一个过滤 不允许出现css的payload 前端过滤 我可以在抓包工具里面修改 抓包工具是不受前端的防御 也 就是浏览器 服务端过滤…

git提交

基本流程&#xff1a;新建分支 → 分支上开发(写代码) → 提交 → 合并到主分支 拉取最新代码因为当前在 master 分支下&#xff0c;你必须拉取最新代码&#xff0c;保证当前代码与线上同步&#xff08;最新&#xff09;&#xff0c;执行以下命令&#xff1a;bashgit pull orig…

多云架构,JuiceFS 如何实现一致性与低延迟的数据分发

随着大模型的普及&#xff0c;GPU 算力成为稀缺资源&#xff0c;单一数据中心或云区域的 GPU 资源常常难以满足用户的全面需求。同时&#xff0c;跨地域团队的协作需求也推动了企业在不同云平台之间调度数据和计算任务。多云架构正逐渐成为一种趋势&#xff0c;然而该架构下的数…

【Git原理和使用】Git 分支管理(创建、切换、合并、删除、bug分支)

一、理解分支 我们可以把分支理解为一个分身&#xff0c;这个分身是与我们的主身是相互独立的&#xff0c;比如我们的主身在这个月学C&#xff0c;而分身在这个月学java&#xff0c;在一个月以后我们让分身与主身融合&#xff0c;这样主身在一个月内既学会了C&#xff0c;也学…

静态路由配置与调试——计算机网络实训day1

文章目录 操作前准备一、实验目的二、实验要求三、实验过程1、在R1和R2上配置设备名称。基本配置设备命名 2、在R1和R2上配置接口IP地址&#xff0c;并查看IP地址的配置情况。3、在R1和R2上配置静态路由&#xff0c;并查看路由表。静态路由缺省路由&#xff08;默认路由&#x…

农产品直播带货方案拆解

作为一名经验丰富的营销策划人道叔&#xff0c;今天我来拆解一下咱们4A营销广告圈的这份《直播天府川农好物带货方案》&#xff0c;让你能学到很多实用的策略和技巧&#xff0c;直接应用到你的策划工作中去。 首先&#xff0c;咱们看看背景分析。 助农直播现在可是个大热门&a…

【Qt】控件概述和QWidget核心属性1(enabled、geometry、windowTitle、windowIcon、QRC机制)

一、控件概念 界面上各种元素、各种部分的统称&#xff08;如按钮、输入框、下拉框、单选复选框...&#xff09; Qt作为GUI开发框架&#xff0c;内置了各种的常用控件&#xff0c;并支持自定义控件。 二、控件体系发展 1.没有完全的控件&#xff0c;需要使用绘图API手动绘制…

【杂谈】-50+个生成式人工智能面试问题(四)

7、生成式AI面试问题与微调相关 Q23. LLMs中的微调是什么&#xff1f; 答案&#xff1a;虽然预训练语言模型非常强大&#xff0c;但它们并不是任何特定任务的专家。它们可能对语言有惊人的理解能力&#xff0c;但仍需要一些LLMs微调过程&#xff0c;开发者通过这个过程提升它…

spring boot 多数据源集成mysql、postgresql、phoenix、doris等

如何搭建多数据源项目只要以下简单几步; 一. 创建核心在config.datasource文件夹里 二. 引入相对应的jar包 三. 创建数据库连接配置 四. 写逻辑代码进行验证 1.DataSource package com.irootech.config.datasource;import java.lang.annotation.*;Target({ElementType.MET…

01-51单片机LED与独立按键

一、单片机概述 注意&#xff1a;个人学习笔记&#xff0c;里面涉及到的C语言和进程转换相关的知识在C语言部分已经写了&#xff0c;这里是默认都会的状态学习单片机。 1.什么是单片机 单片机&#xff0c;英文Micro Controller Unit&#xff0c;简称MCU。其内部集成了CPU、R…

音视频入门基础:MPEG2-PS专题(6)——FFmpeg源码中,获取PS流的视频信息的实现

音视频入门基础&#xff1a;MPEG2-PS专题系列文章&#xff1a; 音视频入门基础&#xff1a;MPEG2-PS专题&#xff08;1&#xff09;——MPEG2-PS官方文档下载 音视频入门基础&#xff1a;MPEG2-PS专题&#xff08;2&#xff09;——使用FFmpeg命令生成ps文件 音视频入门基础…

【网络协议】静态路由详解

网络中的路由器通过以下两种方式之一发现远程网络&#xff1a; 静态配置路由动态路由协议 在本文&#xff0c;我们将学习关于静态路由的各种概念&#xff0c;例如如何配置静态路由、路由表如何进行决策、路由接口等相关知识。 文章目录 引言直连网络静态路由路由表原则原则1原…

Dependency check 通过Maven构建时,配置Mysql数据库遇到的三个坑

使用过Dependency check的同学&#xff0c;一定会遇到这个问题—— 每次执行依赖扫描时&#xff0c;由于网络问题会导致NVD下载种子数据的过程中的种种失败&#xff0c;不仅浪费了大量时间&#xff0c;还会因为下载文件的不完整性直接导致依赖检测的失败。所以我在使用Dependen…

【面试题】技术场景 5、日志采集ELK

日志采集的重要性与采集方式 重要性&#xff1a;在项目开发、测试及生产环境中&#xff0c;日志是定位系统问题的关键手段&#xff0c;对系统维护与问题排查至关重要。采集方式 常规采集&#xff1a;按天保存日志文件至专门目录&#xff0c;文件名包含项目名、端口及日期&…

【数据库】三、SQL语言

文章目录 三、SQL语言1 概述2 数据定义(DDL)2.1 定义数据库2.2 定义基本表2.3 修改基本表2.4 删除基本表 3 数据操作(DML)3.1 数据查询3.1.1 单表查询3.1.2 连接查询3.1.3 嵌套查询3.1.4 集合查询 3.2 数据更新3.2.1 插入数据3.2.2 修改数据3.2.3 删除数据 4 数据控制(DCL)5 视…

Unity中 Xlua使用整理(二)

1.Xlua的配置应用 xLua所有的配置都支持三种方式&#xff1a;打标签&#xff1b;静态列表&#xff1b;动态列表。配置要求&#xff1a; 列表方式均必须是static的字段/属性 列表方式均必须放到一个static类 建议不用标签方式 建议列表方式配置放Editor目录&#xff08;如果是H…

Python Matplotlib教程-Matplotlib 多子图布局

Python Matplotlib 多子图布局 Matplotlib 是 Python 中最常用的数据可视化库&#xff0c;它提供了强大的功能来绘制不同类型的图表。在实际应用中&#xff0c;通常需要将多个图表绘制在同一个画布上&#xff0c;这就需要用到 多子图布局。本篇文章将详细介绍如何使用 Matplot…