Java在大数据处理中的应用:从MapReduce到Spark
Java在大数据处理中的应用:从MapReduce到Spark
大数据时代的到来让数据的存储、处理和分析变得前所未有的重要。随着数据量的剧增,传统的单机计算方式已经无法满足处理需求。为了解决这个问题,许多分布式计算框架应运而生,其中MapReduce和Apache Spark是两种主流的解决方案。在大数据处理过程中,Java作为一种高效、平台无关的编程语言,扮演了至关重要的角色。本文将带你深入了解Java在大数据处理中的应用,重点探讨从MapReduce到Spark的演进。
一、MapReduce:分布式计算的先驱
MapReduce是Google提出的分布式计算模型,已被广泛应用于大数据处理。其核心思想是将一个复杂的任务分解为多个小的任务,并通过Map阶段和Reduce阶段进行并行处理。Java在MapReduce的实现中起到了关键作用,特别是Hadoop生态系统中的实现。
1.1 MapReduce工作原理
MapReduce作业通常包括两个阶段:Map阶段和Reduce阶段。
- Map阶段:将输入数据分成多个小块并进行处理,输出一组键值对。
- Reduce阶段:将相同键的键值对汇总进行处理,并产生最终结果。
1.2 Java实现MapReduce
在Hadoop框架中,Java是MapReduce的主要编程语言。下面是一个简单的MapReduce示例,实现统计文本中每个单词出现的次数。
代码示例:WordCount
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.mapreduce.Mapper;
import org.apache.hadoop.mapreduce.Reducer;
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;import java.io.IOException;public class WordCount {// Map类public static class TokenizerMapper extends Mapper<Object, Text, Text, IntWritable> {private final static IntWritable one = new IntWritable(1);private Text word = new Text();public void map(Object key, Text value, Context context) throws IOException, InterruptedException {String[] words = value.toString().split("\\s+");for (String w : words) {word.set(w);context.write(word, one);}}}// Reduce类public static class IntSumReducer extends Reducer<Text, IntWritable, Text, IntWritable> {private IntWritable result = new IntWritable();public void reduce(Text key, Iterable<IntWritable> values, Context context) throws IOException, InterruptedException {int sum = 0;for (IntWritable val : values) {sum += val.get();}result.set(sum);context.write(key, result);}}// 主函数public static void main(String[] args) throws Exception {Configuration conf = new Configuration();Job job = Job.getInstance(conf, "word count");job.setJarByClass(WordCount.class);job.setMapperClass(TokenizerMapper.class);job.setCombinerClass(IntSumReducer.class);job.setReducerClass(IntSumReducer.class);job.setOutputKeyClass(Text.class);job.setOutputValueClass(IntWritable.class);FileInputFormat.addInputPath(job, new Path(args[0]));FileOutputFormat.setOutputPath(job, new Path(args[1]));System.exit(job.waitForCompletion(true) ? 0 : 1);}
}
1.3 MapReduce的优缺点
优点:
- 高可靠性:由于数据是分布式存储的,即使部分节点失效,作业仍能继续执行。
- 扩展性强:可以轻松扩展集群规模,以处理更大的数据集。
缺点:
- 性能问题:MapReduce作业的性能可能受到磁盘I/O瓶颈的限制,尤其是中间数据的存储。
- 编程复杂性:开发者需要处理很多底层细节,如数据的序列化、作业的调度等。
二、Spark:提升大数据处理效率的利器
Spark是一个开源的大数据计算框架,诞生于UC Berkeley,并已经成为大数据处理领域的领先技术。与MapReduce不同,Spark提供了更高效的内存计算能力,同时也提供了更简洁的编程模型。Spark基于RDD(Resilient Distributed Dataset)提供了分布式数据处理能力,支持包括批处理、流处理、机器学习和图计算在内的多种功能。
2.1 Spark的核心特性
- 内存计算:Spark最大的一大亮点是内存计算。它通过将数据集缓存到内存中,避免了MapReduce中频繁的磁盘I/O操作,从而显著提升了计算性能。
- 简化编程模型:与MapReduce相比,Spark的API更加简单,尤其是对Java开发者来说,使用Spark时可以借助丰富的操作符(如
map、reduce、filter等)来简化大数据处理任务。 - 支持多种计算类型:Spark不仅支持批处理,还可以处理流数据、机器学习模型和图计算任务。
2.2 Java实现Spark任务
Spark的Java API可以方便地进行大数据处理。下面是一个简单的Spark示例,计算一个文本文件中每个单词的出现次数。
代码示例:Spark WordCount
import org.apache.spark.api.java.JavaRDD;
import org.apache.spark.api.java.JavaSparkContext;
import org.apache.spark.api.java.function.Function;
import org.apache.spark.api.java.function.PairFunction;
import org.apache.spark.SparkConf;
import scala.Tuple2;public class WordCount {public static void main(String[] args) {// 创建Spark配置和上下文SparkConf conf = new SparkConf().setAppName("WordCount");JavaSparkContext sc = new JavaSparkContext(conf);// 读取文件并生成RDDJavaRDD<String> input = sc.textFile(args[0]);// 处理数据,统计单词数量JavaRDD<String> words = input.flatMap(line -> Arrays.asList(line.split(" ")).iterator());JavaPairRDD<String, Integer> wordCounts = words.mapToPair(word -> new Tuple2<>(word, 1)).reduceByKey((a, b) -> a + b);// 输出结果wordCounts.saveAsTextFile(args[1]);sc.close();}
}
2.3 Spark的优缺点
优点:
- 性能优越:由于Spark使用内存计算,避免了MapReduce中的磁盘I/O,性能更高。
- 易于使用:Spark提供了更高层次的API,支持更直观的操作。
- 多样化计算:Spark不仅支持批处理任务,还支持流处理、机器学习、图计算等任务。
缺点:
- 内存消耗大:虽然内存计算加速了计算,但对于内存的要求较高,集群资源的消耗也可能变得比较大。
- 依赖较多:使用Spark时,可能需要更多的配置和调优,特别是在大规模集群上运行时。
三、MapReduce与Spark的应用对比
在实际应用中,选择MapReduce还是Spark往往依赖于具体的业务需求和场景。虽然两者都用于分布式数据处理,但它们的技术特点和适用场景有所不同。本文将进一步对比这两者在实际应用中的差异,帮助开发者更好地做出选择。
3.1 性能对比:MapReduce vs Spark
性能是MapReduce与Spark之间的核心差异之一。在处理大数据时,Spark的内存计算通常会比MapReduce的磁盘I/O计算效率更高。下面我们详细分析两者的性能差异。
MapReduce性能特点
MapReduce依赖于将数据分布到多个节点,并在每个节点上执行操作。每次Map或Reduce阶段的计算结果都会写入磁盘,这会导致磁盘I/O瓶颈。对于一些任务,如需要多次迭代的计算,MapReduce的性能就显得较为低下。
Spark性能特点
Spark通过将数据存储在内存中,避免了频繁的磁盘I/O,从而大大提升了性能。Spark还支持将中间结果缓存到内存中,避免了重复计算,因此在处理类似机器学习算法(如K-means聚类)或图算法时,Spark能够比MapReduce更高效。
3.2 扩展性对比:MapReduce vs Spark
扩展性是指处理数据量逐渐增大的时候,系统的表现如何。MapReduce和Spark在扩展性方面有不同的优势。
MapReduce扩展性
MapReduce具有良好的扩展性。由于它的核心依赖于Hadoop的分布式存储(HDFS)和任务调度框架(YARN),它能够非常容易地通过增加节点来扩展计算能力。因此,对于超大规模数据集,MapReduce能够提供较为稳定的扩展性。
Spark扩展性
Spark也具有较好的扩展性,但其内存计算模式要求节点的内存容量更大,因此在某些情况下,扩展性可能受限。特别是在处理大规模数据时,如果内存不够,可能会导致计算失败。不过,Spark的内存计算优势使得它在数据处理速度上比MapReduce更具优势。
3.3 易用性对比:MapReduce vs Spark
MapReduce易用性
MapReduce的编程模型较为底层,要求开发者明确地处理任务的分解、输入输出、以及中间数据的存储等细节。这些细节虽然提供了灵活性,但也增加了编程的复杂性。对于不熟悉分布式计算的开发者来说,编写MapReduce作业可能需要较高的学习曲线。
Spark易用性
Spark的API设计更加简洁,开发者可以通过高层次的操作(如map、reduce、filter)来表达数据处理逻辑,极大地简化了编程。Spark还提供了大量的内建函数,如groupBy、flatMap、reduceByKey等,方便开发者进行各种复杂的数据处理任务。
3.4 任务类型适应性:MapReduce vs Spark
MapReduce任务类型
MapReduce最适合用来处理批量数据的单次计算任务。例如,日志分析、ETL(Extract, Transform, Load)操作等大多数离线批处理任务都能非常适合MapReduce。然而,MapReduce并不擅长处理复杂的迭代计算任务,尤其是需要多次计算的算法,如机器学习算法或图算法。
Spark任务类型
Spark更为适合于处理包括流处理、机器学习、图计算等在内的多种任务。对于机器学习任务,Spark提供了MLlib库,能够高效地进行各种算法训练与评估。对于图计算,Spark也提供了GraphX库,支持大规模图的处理与计算。此外,Spark支持实时流处理(通过Spark Streaming),适合处理需要实时响应的数据流。
四、Java与Spark结合的实践案例
在现代大数据应用中,Java与Spark的结合已经成为许多企业和开发者的首选方案。Java不仅能够利用Spark的强大功能,而且由于其平台无关性和较强的性能表现,成为大数据处理中的重要语言。
4.1 使用Java开发Spark作业
Java与Spark的结合相对直观。我们可以通过Java API在Spark中实现各种数据处理任务,以下是一个实际的案例:假设我们需要处理一个日志文件,提取出每个IP访问的次数。
代码示例:日志文件的IP访问统计
import org.apache.spark.api.java.JavaRDD;
import org.apache.spark.api.java.JavaSparkContext;
import org.apache.spark.api.java.function.Function;
import org.apache.spark.api.java.function.PairFunction;
import org.apache.spark.SparkConf;
import scala.Tuple2;public class LogIPCount {public static void main(String[] args) {// 创建Spark配置和上下文SparkConf conf = new SparkConf().setAppName("LogIPCount");JavaSparkContext sc = new JavaSparkContext(conf);// 读取日志文件并生成RDDJavaRDD<String> logs = sc.textFile(args[0]);// 通过正则表达式提取IP地址,并统计访问次数JavaRDD<String> ipAddresses = logs.map(new Function<String, String>() {@Overridepublic String call(String logLine) throws Exception {// 假设IP地址位于日志的第一部分return logLine.split(" ")[0];}});JavaPairRDD<String, Integer> ipCounts = ipAddresses.mapToPair(new PairFunction<String, String, Integer>() {@Overridepublic Tuple2<String, Integer> call(String ip) throws Exception {return new Tuple2<>(ip, 1);}}).reduceByKey((a, b) -> a + b);// 输出结果ipCounts.saveAsTextFile(args[1]);sc.close();}
}
4.2 实际应用场景:电商数据分析
在电商平台的日志分析中,Java和Spark常常结合使用来进行海量数据的实时处理与分析。通过Spark Streaming和Java API,可以实现对用户行为数据的实时分析,如统计某一商品的点击量、用户的实时购物行为、推荐系统的实时计算等。
例如,假设我们需要在用户点击商品的同时,实时计算出当前用户的点击数,并将结果存储在数据库中。利用Spark Streaming结合Java,可以轻松实现这一需求,保证系统的实时响应能力。
4.3 Java与Spark的结合:优势与挑战
优势:
- 成熟的生态系统:Java在大数据领域拥有强大的生态系统,特别是在与Hadoop、Spark等大数据技术的结合方面,Java提供了丰富的库和框架。
- 平台无关性:Java的跨平台特性确保了开发的应用可以在多种操作系统上运行,适合多样化的部署需求。
挑战:
- 内存消耗问题:虽然Java可以高效地与Spark结合,但由于Spark的大规模内存计算,仍需要合理配置集群的内存资源,避免内存溢出等问题。
- 调试困难:分布式环境下的应用调试相比单机程序要复杂得多,尤其是在Java与Spark的结合过程中,调试过程可能较为繁琐。
五、Java在大数据生态系统中的整合
Java不仅在MapReduce和Spark中扮演着重要角色,它还在整个大数据生态系统中发挥着至关重要的作用。除了MapReduce和Spark,Java还可以与许多其他大数据工具和框架无缝集成,包括Hadoop、Hive、HBase等。这些工具的组合帮助开发者构建强大且高效的大数据应用,解决不同的数据处理需求。
5.1 Java与Hadoop的整合
Hadoop是一个流行的开源大数据框架,它的核心组成包括HDFS(分布式文件系统)和YARN(资源管理器)。Java与Hadoop的结合使得开发者可以通过编写MapReduce作业来处理存储在HDFS上的海量数据。
Hadoop与Java的关系
Hadoop的MapReduce框架主要是用Java来实现的。因此,Java开发者能够轻松使用Hadoop来处理分布式计算任务,Hadoop提供了Java API用于与HDFS和YARN进行交互。通过Java,我们可以创建MapReduce作业并将其提交给Hadoop集群进行执行。
代码示例:读取HDFS中的文件
以下是一个简单的Java代码示例,展示了如何使用Hadoop API来读取HDFS中的文件并打印文件内容:
import org.apache.hadoop.fs.*;
import org.apache.hadoop.conf.Configuration;import java.io.IOException;public class HDFSReader {public static void main(String[] args) throws IOException {// 配置Hadoop环境Configuration conf = new Configuration();FileSystem fs = FileSystem.get(conf);// 获取HDFS文件路径Path filePath = new Path(args[0]);FSDataInputStream inputStream = fs.open(filePath);// 读取并打印文件内容int byteRead;while ((byteRead = inputStream.read()) != -1) {System.out.print((char) byteRead);}// 关闭输入流inputStream.close();fs.close();}
}
这个例子展示了如何通过Java API读取HDFS中的文件。Java与Hadoop的紧密集成使得在大数据处理过程中能够高效地访问分布式数据。
5.2 Java与Hive的整合
Apache Hive是一个基于Hadoop的数据仓库工具,它提供了SQL查询能力来处理存储在HDFS中的数据。Java可以通过Hive JDBC连接来与Hive进行交互,执行SQL查询并获取处理结果。
Java调用Hive
开发者可以通过使用Hive的JDBC驱动,在Java应用中执行Hive SQL查询。以下是一个简单的Java代码示例,展示如何通过JDBC连接Hive,并执行一个SQL查询。
import java.sql.*;public class HiveJDBCExample {public static void main(String[] args) {// Hive JDBC连接URLString jdbcUrl = "jdbc:hive2://localhost:10000/default";String user = "hive";String password = "";// 连接到Hive并执行查询try (Connection conn = DriverManager.getConnection(jdbcUrl, user, password)) {Statement stmt = conn.createStatement();ResultSet rs = stmt.executeQuery("SELECT * FROM my_table");// 输出查询结果while (rs.next()) {System.out.println("Column 1: " + rs.getString(1) + ", Column 2: " + rs.getString(2));}} catch (SQLException e) {e.printStackTrace();}}
}
这个示例展示了如何通过Hive的JDBC连接在Java中执行SQL查询,操作存储在HDFS中的结构化数据。Java与Hive的集成为开发者提供了方便的查询接口,特别适用于需要在大数据平台上进行数据分析的场景。
5.3 Java与HBase的整合
HBase是一个分布式、列式存储的NoSQL数据库,通常用于存储海量的结构化和半结构化数据。Java可以通过HBase的客户端API与HBase进行交互,读取和写入数据。
HBase与Java的结合
HBase提供了Java API来执行各种数据库操作,如插入、更新、删除和查询。以下是一个简单的Java示例,展示如何通过Java连接到HBase,并执行一个基本的插入操作。
import org.apache.hadoop.hbase.client.*;
import org.apache.hadoop.hbase.*;
import org.apache.hadoop.conf.Configuration;import java.io.IOException;public class HBaseExample {public static void main(String[] args) throws IOException {// 配置HBaseConfiguration config = HBaseConfiguration.create();Connection connection = ConnectionFactory.createConnection(config);Table table = connection.getTable(TableName.valueOf("my_table"));// 创建Put对象Put put = new Put("row1".getBytes());put.addColumn("cf1".getBytes(), "col1".getBytes(), "value1".getBytes());// 插入数据table.put(put);// 关闭连接table.close();connection.close();}
}
在这个示例中,Java通过HBase API插入了一行数据。HBase与Java的整合使得开发者可以灵活地操作大规模分布式数据库,并能够高效地处理大量数据。
六、Java与大数据工具的高级集成
随着大数据技术的不断发展,Java在大数据处理中的作用变得更加多样化。除了MapReduce、Spark、Hive和HBase,Java还可以与许多其他大数据工具进行高级集成,包括Flume、Kafka、Flink等。下面我们简要介绍一些常见的大数据工具以及它们如何与Java协作。
6.1 Java与Apache Flume的整合
Apache Flume是一个分布式的日志收集、聚合和传输系统。它主要用于将日志和数据从不同的来源(如Web服务器、应用服务器等)流式传输到HDFS或其他数据存储系统。Java可以通过Flume的客户端API来发送数据流。
Flume与Java集成
Java通过Flume的客户端API,可以将应用程序生成的日志或数据实时发送到Flume。Flume会将这些数据传输到目标存储系统(如HDFS、HBase等)。
6.2 Java与Apache Kafka的整合
Apache Kafka是一个高吞吐量的分布式消息队列系统,广泛用于实时流数据的传输。Java可以使用Kafka的Producer和Consumer API来发送和接收消息。
Kafka与Java集成
Java应用程序可以通过Kafka的Producer API将数据流推送到Kafka主题,并通过Consumer API实时消费这些消息。Kafka与Java的集成使得开发者能够构建实时数据流处理系统。
6.3 Java与Apache Flink的整合
Apache Flink是一个分布式流处理框架,适用于实时数据处理和批处理任务。Java可以使用Flink的API来定义实时数据流处理应用,如流式计算和事件驱动的分析。
Flink与Java集成
Java开发者可以使用Flink提供的丰富API,编写实时数据流处理程序,处理来自Kafka、HDFS等的数据流。Flink与Java的结合,使得实时流数据处理变得更加高效和灵活。
七、未来展望:Java与大数据的深度融合
随着大数据技术的不断演进,Java在大数据领域的应用也将不断深化。从MapReduce到Spark,再到与Hive、HBase、Flink等大数据工具的集成,Java将继续在大数据处理领域扮演着重要角色。未来,随着数据处理需求的不断增长,Java在大数据生态系统中的角色将更加不可或缺,尤其是在高效的分布式计算、流数据处理、机器学习等领域,Java的能力将继续得到广泛的发挥。

相关文章:
Java在大数据处理中的应用:从MapReduce到Spark
Java在大数据处理中的应用:从MapReduce到Spark 大数据时代的到来让数据的存储、处理和分析变得前所未有的重要。随着数据量的剧增,传统的单机计算方式已经无法满足处理需求。为了解决这个问题,许多分布式计算框架应运而生,其中Ma…...
SwiftUI 中 .overlay 两种写法的区别及拓展
SwiftUI 中 .overlay 两种写法的区别及拓展 一、.overlay 简介功能语法 二、写法 1:.overlay(Circle().stroke(Color.blue, lineWidth: 2))代码示例解释优点适用场景 三、写法 2:.overlay { Circle().stroke(.white, lineWidth: 4) }代码示例解释优点适用…...
深入理解QT的View-Model-Delegate机制和用法
文章目录 Model-View-Delegate机制Model(数据模型)设置模型属性访问元素操作元素数据排序封装好的模型View(视图)显示数据数据选择Delegate(代理)数据选择易用封装类QListWidgetQTreeWidgetQTableWidget元素拖拽代理模型参考示例Model-View-Delegate机制 Qt的View/Model/Deleg…...
C# ASP.NET 介绍
.NET学习资料 .NET学习资料 .NET学习资料 一、概述 ASP.NET是由微软创建的一个开源 Web 框架,用于使用.NET 构建现代化的 Web 应用程序和服务。它为开发者提供了一套丰富的工具、库和编程模型,使得创建功能强大、高效且安全的 Web 应用变得更加容易。…...
深入理解指针初阶:从概念到实践
一、引言 在 C 语言的学习旅程中,指针无疑是一座必须翻越的高峰。它强大而灵活,掌握指针,能让我们更高效地操作内存,编写出更优化的代码。但指针也常常让初学者望而生畏,觉得它复杂难懂。别担心,本文将用通…...
《手札·行业篇》开源Odoo MES系统与SKF Observer Phoenix API在化工行业的双向对接方案
一、项目背景 化工行业生产过程复杂,设备运行条件恶劣,对设备状态监测、生产数据采集和质量控制的要求极高。通过开源Odoo MES系统与SKF Observer Phoenix API的双向对接,可以实现设备状态的实时监测、生产数据的自动化采集以及质量数据的同步…...
oracle11g搭建主从集群
安装oracle11g参考:centos安装oracle11g数据库-CSDN博客 一、主库操作 sqlplus / as sysdba 1、开启归档模式和强制日志模式 shutdown immediate startup mount #开启归档模式和强制日志模式 alter database archivelog; alter database force logging; #开启补…...
暂未整理啊
测码学院 python的数据类型 不可变数据类型:字符串/数字/元组/ type(变量名) 获得数据的类型 str:字符串 int:整数 float:浮点数 bool:true/false 布尔类型 list:列表 dict&…...
重庆西站公路桥梁自动化监测
1.项目概述 重庆西站属于渝黔铁路的配套工程,是承担兰渝、川黔、渝昆等多条铁路的特级客运站,未来重庆铁路三大客运站之一。作为我国西部地区规模最大的火车站、重庆西站于2014年在沙坪坝区上桥开工建设,该站东临内环高速,西靠中梁山&#x…...
JavaScript系列(70)--响应式编程进阶详解
JavaScript响应式编程进阶详解 🔄 今天,让我们深入探讨JavaScript响应式编程的进阶内容。响应式编程是一种强大的编程范式,它能够帮助我们更好地处理异步数据流和状态管理。 响应式编程进阶概念 🌟 💡 小知识&#x…...
安装指定版本的pnpm
要安装指定版本的 pnpm,可以使用以下方法: 方法 1: 使用 pnpm 安装指定版本 你可以通过 pnpm 的 add 命令来安装指定版本: pnpm add -g pnpm<版本号>例如,安装 pnpm 的 7.0.0 版本: pnpm add -g pnpm7.0.0方法…...
Dockerfiles 的 Top 10 常见 DevOps/SRE 面试问题及答案
1. RUN 和 CMD 之间有什么区别? RUN : 在镜像构建过程中执行命令,创建一个新的层。通常用于安装软件包。 示例: RUN apt-get update && apt-get install -y curlCMD : 指定容器启动时默认运行的命令。它在运行时执行,而不是在构建过程…...
头条百度批量采集软件说明文档
旧版说明文档《头条号文章批量采集软件4.0版本说明文档!头条/微头条文章批量采集》 头条的采集软件已经更新了好多个版本了,一直没有做详细的介绍文档,最近更新了一些功能进去,一块来写一下说明文档。 1、主界面 2、头条作者采集…...
36.日常算法
1.最小栈 题目来源 设计一个支持 push ,pop ,top 操作,并能在常数时间内检索到最小元素的栈。 实现 MinStack 类: MinStack() 初始化堆栈对象。 void push(int val) 将元素val推入堆栈。 void pop() 删除堆栈顶部的元素。 int top() 获取堆…...
计算机考研复试上机04
目录 6、向量 1)完数与盈数(清华大学复试上机题) 7、队列 1)约瑟夫问题 No. 2 8、栈 1)简单计算器(浙江大学复试上机题) 2)堆栈的使用(吉林大学复试上机题…...
【面试】面试常见的智力题
引言 在技术面试中,除了考察编程能力和算法知识外,智力题也是常见的考察方式。智力题不仅能够测试候选人的逻辑思维能力,还能反映其解决问题的创造力和应变能力。本文将整理一些常见的面试智力题,并详细分析解题思路,…...
【动态规划】风扫枯杨,满地堆黄叶 - 9. 完全背包问题
本篇博客给大家带来的是完全背包问题之动态规划解法技巧. 🐎文章专栏: 动态规划 🚀若有问题 评论区见 ❤ 欢迎大家点赞 评论 收藏 分享 如果你不知道分享给谁,那就分享给薯条. 你们的支持是我不断创作的动力 . 王子,公主请阅🚀 要开心要快乐顺…...
BGP基础协议详解
BGP基础协议详解 一、BGP在企业中的应用二、BGP概述2.1 BGP的特点2.2 基本配置演示2.3 抓包观察2.4 BGP的特征三、BGP对等体关系四、bgp报文4.1 BGP五种报文类型(重点)4.2 BGP报文格式-报文头格式4.3 Open报文格式4.4 Update报文格式4.5 Notification报文格式4.6 Route-refre…...
LeetCode刷题---数组---840
矩阵中的幻方 https://leetcode.cn/problems/magic-squares-in-grid/submissions/598584907/ 题目: 3 x 3 的幻方是一个填充有 从 1 到 9 的不同数字的 3 x 3 矩阵,其中每行,每列以及两条对角线上的各数之和都相等。 给定一个由整数组成…...
Visual Studio踩过的坑
统计Unity项目代码行数 编辑-查找和替换-在文件中查找 查找内容输入 b*[^:b#/].*$ 勾选“使用正则表达式” 文件类型留空 也有网友做了指定,供参考 !*\bin\*;!*\obj\*;!*\.*\*!*.meta;!*.prefab;!*.unity 打开Unity的项目 注意:只是看࿰…...
【深度学习入门实战】基于Keras的手写数字识别实战(附完整可视化分析)
本人主页:机器学习司猫白 ok,话不多说,我们进入正题吧 项目概述 本案例使用经典的MNIST手写数字数据集,通过Keras构建全连接神经网络,实现0-9数字的分类识别。文章将包含: 关键概念图解完整实现代码训练过程可视化模型效果深度分析环境准备 import numpy as np impo…...
SkyWalking 10.1.0 实战:从零构建全链路监控,解锁微服务性能优化新境界
文章目录 前言一、集成SkyWalking二、SkyWalking使用三、SkyWalking性能剖析四、SkyWalking 告警推送4.1 配置告警规则4.2 配置告警通知地址4.3 下发告警信息4.4 测试告警4.5 慢SQL查询 总结 前言 在传统监控系统中,我们通过进程监控和日志分析来发现系统问题&…...
计算机毕业设计——Springboot的旅游管理
🎉**欢迎来到琛哥的技术世界!**🎉 📘 博主小档案: 琛哥,一名来自世界500强的资深程序猿,毕业于国内知名985高校。 🔧 技术专长: 琛哥在深度学习任务中展现出卓越的能力&a…...
【通俗易懂说模型】反向传播(附多元分类与Softmax函数)
🌈 个人主页:十二月的猫-CSDN博客 🔥 系列专栏: 🏀深度学习_十二月的猫的博客-CSDN博客 💪🏻 十二月的寒冬阻挡不了春天的脚步,十二点的黑夜遮蔽不住黎明的曙光 目录 1. 前言 2. …...
Kickstart自动化安装过程中自动选择较小的磁盘安装操作系统
Kickstart自动化安装过程中自动选择较小的磁盘安装操作系统 需求 在实际生成操作过程中,一般会遇到物理服务器存在多块盘的情况。 安装过程中,磁盘的标签是随机分配的,并不是空间较小的盘,就会使用较小的磁盘标签 而需求往往需要…...
128,【1】buuctf [极客大挑战 2019]PHP
进入靶场 提示了备份文件 抓包,扫描 扫描出了两个有反应的 访问index.php没反应,但www.zip成功下载了文件 index.php里得到如下有用信息 <?phpinclude class.php;$select $_GET[select];$resunserialize($select);?> 所以我们要通过GET 方…...
3.3 学习UVM中的uvm_driver 类分为几步?
文章目录 前言1. 定义2. 核心功能3. 适用场景4. 使用方法5. 完整代码示例5.1 事务类定义5.2 Driver 类定义5.3 Sequencer 类定义5.4 测试平台 6. 代码说明7. 总结 前言 以下是关于 UVM 中 uvm_driver 的详细解释、核心功能、适用场景、使用方法以及一个完整的代码示例ÿ…...
系统思考—双环学习
前几天,一个企业高管向我提到:“我们调整了N次方案,市场策略、团队激励、管理制度,能改的全改了,怎么还是不见起色?” 这让我想到典型的单环学习,简单来说就是:发现问题 → 采取行动…...
QTreeView和QTableView单元格添加超链接
QTreeView和QTableView单元格添加超链接的方法类似,本文仅以QTreeView为例。 在QTableView仿Excel表头排序和筛选中已经实现了超链接的添加,但是需要借助delegate,这里介绍一种更简单的方式,无需借助delegate。 一.效果 二.实现 QHTreeView.h #ifndef QHTREEVIEW_H #def…...
elastic search 的 highlight
Elasticsearch 的 highlight 功能用于在搜索结果中突出显示匹配的文本片段。这对于用户界面上的搜索结果展示非常有用,因为它可以帮助用户快速定位到他们搜索的关键词。 1. 基本用法 在 Elasticsearch 中,highlight 功能通常在查询中使用,并…...
