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时可以借助丰富的操作符(如mapreducefilter等)来简化大数据处理任务。
  • 支持多种计算类型: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);

        // 读取文件并生成RDD
        JavaRDD<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设计更加简洁,开发者可以通过高层次的操作(如mapreducefilter)来表达数据处理逻辑,极大地简化了编程。Spark还提供了大量的内建函数,如groupByflatMapreduceByKey等,方便开发者进行各种复杂的数据处理任务。

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);

        // 读取日志文件并生成RDD
        JavaRDD<String> logs = sc.textFile(args[0]);

        // 通过正则表达式提取IP地址,并统计访问次数
        JavaRDD<String> ipAddresses = logs.map(new Function<String, String>() {
            @Override
            public String call(String logLine) throws Exception {
                // 假设IP地址位于日志的第一部分
                return logLine.split(" ")[0];
            }
        });

        JavaPairRDD<String, Integer> ipCounts = ipAddresses.mapToPair(new PairFunction<String, String, Integer>() {
            @Override
            public 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连接URL
        String 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 {
        // 配置HBase
        Configuration 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的能力将继续得到广泛的发挥。

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Pdf手册阅读(1)--数字签名篇

原文阅读摘要 PDF支持的数字签名&#xff0c; 不仅仅是公私钥签名&#xff0c;还可以是指纹、手写、虹膜等生物识别签名。PDF签名的计算方式&#xff0c;可以基于字节范围进行计算&#xff0c;也可以基于Pdf 对象&#xff08;pdf object&#xff09;进行计算。 PDF文件可能包…

运放放大器

1 运放是什么 1.1 运算放大器&#xff0c;常用于做信号处理。如:信号放大、滤波、积分、微分、整流、甚至可以用来做电路主控等等。其功能非常强大 1.2 运放的重要特性 虚短 &#xff08;前提是要有负反馈&#xff09; 1.2.1 虚短的概念是指运放在正常工作过程中&#xff0c…

UE求职Demo开发日志#28 初期几个流程的实现

1 第一小节流程梳理 进入游戏--> 弹出几个文本框介绍背景--> 接取任务收集资源-> 打怪获得源能结晶--> 场景里获得一些金属碎片--> 用源能和金属修复合成台--> 完成第一个任务--> 接第二个任务&#xff0c;打带精英怪的一波&#xff08;小怪1换颜…

【Docker】从瀑布开发到敏捷开发

引言 软件开发方法论是指导团队如何规划、执行和管理软件项目的框架。随着软件行业的不断发展&#xff0c;开发方法论也在不断演进。从传统的瀑布开发到现代的敏捷开发&#xff0c;软件开发方法论经历了深刻的变革。本文将详细探讨瀑布开发和敏捷开发的定义、特点、优缺点以及…

Docker安装常用软件说明

1.总体步骤 2.安装tomcat docker run -d -p 8080:8080 --name tomcat1 tomcat:11.0.8 访问tomcat猫首页 出现404 这是正常情况 Docker 默认采用的是 NAT 网络模式&#xff0c;所以会自动创建 IPtable 规则并自动开放端口&#xff0c;所以无需考虑防火墙问题 新版Tomcat已经…

Node.js笔记入门篇

黑马程序员视频地址&#xff1a; Node.js与Webpack-01.Node.js入门 基本认识 概念 定义&#xff1a;Node.js 是一个免费、开源、跨平台的 JavaScript 运行时环境, 它让开发人员能够创建服务器 Web 应用、命令行工具和脚本 作用&#xff1a;使用Node.js 编写服务器端程序 ✓ …

以简单的方式过一生

这本书大体讲述了三方面的内容&#xff1a;工作、生活、人际交往。我目前工作方面的认知需求比较大&#xff0c;就把工作部分的内容看了一下&#xff0c;其他两个方面就略看了&#xff0c;在这里就不展开了。 一、成为结果导向的人&#xff1a; 如何让自己在职场上成为明确结果…

软件工程教育的革命:AI辅助学习与实践

软件工程教育正面临着巨大的挑战。传统的教学模式往往以理论讲解为主&#xff0c;实践机会不足&#xff0c;导致学生难以将理论知识转化为实际技能。此外&#xff0c;繁琐的代码编写和项目搭建过程也常常耗费学生大量时间和精力&#xff0c;影响学习效率。为了解决这些问题&…

访问Elasticsearch服务 curl ip 端口可以 浏览器不可以

LINUX学习 在虚拟机上面的linux上面用docker 部署Elasticsearch项目后&#xff0c;在linux系统内部用curl ip 端口地址的形式可以访问到Elasticsearch。可以返回数据。 但是在本机的浏览器中输入ip 端口&#xff0c;会报错&#xff0c;找不到服务。 ping 和 trelnet均不通。 …

C++引用深度详解

C引用深度详解 前言1. 引用的本质与核心特性1.1 引用概念1.2 核心特性 2. 常引用与权限控制2.1 权限传递规则2.2 常量引用2.3 临时变量保护1. 样例2. 样例3. 测试 三、引用使用场景分析3.1 函数参数传递输出型参数避免多级指针高效传参 3.2 做函数返回值正确使用危险案例 4. 性…

网易易盾接入DeepSeek,数字内容安全“智”理能力全面升级

今年农历新年期间&#xff0c;全球AI领域再度掀起了一波革命性浪潮&#xff0c;国产通用大模型DeepSeek凭借其强大的多场景理解与内容生成能力迅速“出圈”&#xff0c;彻底改写全球人工智能产业的格局。 作为国内领先的数字内容风控服务商&#xff0c;网易易盾一直致力于探索…

【含开题报告+文档+PPT+源码】基于SpringBoot+Vue旅游管理网站

开题报告 本论文探讨了一款采用现代Web开发技术构建的台州市旅游综合信息与服务平台的设计与实现。该系统基于SpringBoot框架&#xff0c;以其轻量级、快速开发和强大的企业级应用支持能力为核心后端技术支撑&#xff0c;结合Vue.js前端框架及ElementUI组件库&#xff0c;为用…

python-leetcode-寻找峰值

162. 寻找峰值 - 力扣&#xff08;LeetCode&#xff09; class Solution:def findPeakElement(self, nums: List[int]) -> int:left, right 0, len(nums) - 1while left < right:mid left (right - left) // 2if nums[mid] < nums[mid 1]:left mid 1else:right …

2.11学习记录

web——CTFHub XSS学习 学习资料&#xff1a;xss&#xff08;跨站攻击&#xff09; 原理 1.黑客发送带有xss恶意脚本的链接给用户 2.用户点击了恶意链接&#xff0c;访问了目标服务器&#xff08;正常的服务器&#xff09; 3.目标服务器&#xff08;正常的服务器&#xff09…

macOS 上部署 RAGFlow

在 macOS 上从源码部署 RAGFlow-0.14.1&#xff1a;详细指南 一、引言 RAGFlow 作为一款强大的工具&#xff0c;在人工智能领域应用广泛。本文将详细介绍如何在 macOS 系统上从源码部署 RAGFlow 0.14.1 版本&#xff0c;无论是开发人员进行项目实践&#xff0c;还是技术爱好者…

ASP.NET Core WebSocket、SignalR

目录 WebSocket SignalR SignalR的基本使用 WebSocket WebSocket基于TCP协议&#xff0c;支持二进制通信&#xff0c;双工通信。性能和并发能力更强。WebSocket独立于HTTP协议&#xff0c;不过我们一般仍然把WebSocket服务器端部署到Web服务器上&#xff0c;因为可以借助HT…

【蓝桥杯嵌入式】4_key:单击+长按+双击

全部代码网盘自取 链接&#xff1a;https://pan.baidu.com/s/1PX2NCQxnADxYBQx5CsOgPA?pwd3ii2 提取码&#xff1a;3ii2 1、电路图 将4个按键的引脚设置为input&#xff0c;并将初始状态设置为Pull-up&#xff08;上拉输入&#xff09; 为解决按键抖动的问题&#xff0c;我们…

五、AIGC大模型_01大模型基础知识

1、基本概念 1.1 定义 目前&#xff0c;谈到大模型&#xff0c;通常都指的是大语言模型&#xff08;LLMs&#xff0c;即&#xff1a;Large Language Models) 大语言模型是具有大规模参数和复杂计算结构的深度学习模型&#xff0c;通常由深度神经网络构建而成&#xff0c;参数…

微服务与网关

什么是网关 背景 单体项目中&#xff0c;前端只用访问指定的一个端口8080&#xff0c;就可以得到任何想要的数据 微服务项目中&#xff0c;ip是不断变化的&#xff0c;端口是多个的 解决方案&#xff1a;网关 网关&#xff1a;就是网络的关口&#xff0c;负责请求的路由、转发…

Spring Cloud工程完善

目录 完善订单服务 启动类 配置文件 实体类 Controller Service Mapper 测试运行 完成商品服务 启动类 配置文件 实体类 Controller Service Mapper 测试运行 远程调用 需求 实现 1.定义RestTemplate 2.修改order-service中的OrderService 测试运行 Rest…