云计算期中测试

news2024/9/22 13:22:57

云计算期中测试

文章目录

  • 云计算期中测试
    • 一、前言
    • 二、第一题
      • 1、命令方式
      • 2、java API方式
    • 三、第二题
      • 1、创建CSV文件并将其上传到HDFS
      • 2、编写利用MapReduce框架的java代码
      • 3、打包java项目
      • 4、在Hadoop集群上提交jar文件来运行MapReduce作业

一、前言

在实验开始之前我们需要在虚拟机里面启动HDFS,进入到Hadoop安装目录里面的sbin目录里面执行start-all.sh命令即可启动成功,然后使用jps查看全部节点是否已经启动了,在昨天的做题的时候我在最开始上传文件到hdfs 的时候报错:could only be written to 0 of the 1 minReplication nodes,there are 0 datanode(s) running这个错误说明datanode没有启动成功,我们可以首先尝试停止hadoop,然后再启动。

如果还是没有解决,那就格式化一下 ,然后记得在出现Re-format filesystem in Storage Directory root= /usr/local/servers/hadoop/tmp/nndata; location= null ? (Y or N)的时候输入N,不然你的clusterID就会发生变化,就无法启动了,如果你不小心输入成了Y,那么你需要去到./hadoop/tmp目录中,修改dndatanndata两个目录中的VERSION文件中的clusterID一样,将nndata中的clusterID值替换掉到dndata中的clusterID值,然后再重新启动一下Hadoop就能成功解决了。

二、第一题

在Hadoop分布式文件系统上,分别采用命令方式和java API方式实现文件上传、下载,目录的创建、删除、重命名及目录文件信息的查看。编写程序完成java API操作。

1、命令方式

  • 文件上传:

    在这里插入图片描述

  • 文件下载:

    在这里插入图片描述

  • 目录的创建:
    在这里插入图片描述

  • 目录的删除:

    在这里插入图片描述

  • 目录的重命名:

    在这里插入图片描述

  • 目录文件信息查看:

    在这里插入图片描述

命令行的方式很简单,在这里就不做过多的示范,直接粘贴图片。

如果有不懂的操作可以去我的大数据学习专栏里面看一下,里面有详细步骤。

2、java API方式

下面是我编写的简单实现的java程序代码:

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.*;

import java.io.IOException;

public class HadoopFileSystemExample {
    private static final String HDFS_URI = "hdfs://localhost:9000";
    private static final String FILE_PATH = "/path/to/local/file.txt";
    private static final String HDFS_PATH = "/path/in/hdfs/file.txt";
    private static final String DIRECTORY_PATH = "/path/in/hdfs/directory";

    public static void main(String[] args) {
        try {
            // 创建Hadoop配置对象
            Configuration conf = new Configuration();
            // 设置Hadoop文件系统URI
            conf.set("fs.defaultFS", HDFS_URI);

            // 获取Hadoop文件系统实例
            FileSystem fs = FileSystem.get(conf);

            // 文件上传
            uploadFile(fs);

            // 文件下载
            downloadFile(fs);

            // 创建目录
            createDirectory(fs);

            // 删除目录
            deleteDirectory(fs);

            // 重命名文件或目录
            rename(fs);

            // 查看目录文件信息
            listFiles(fs);

            // 关闭文件系统
            fs.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    private static void uploadFile(FileSystem fs) throws IOException {
        // 本地文件路径
        Path localPath = new Path(FILE_PATH);
        // HDFS文件路径
        Path hdfsPath = new Path(HDFS_PATH);

        // 上传文件
        fs.copyFromLocalFile(localPath, hdfsPath);

        System.out.println("文件上传成功!");
    }

    private static void downloadFile(FileSystem fs) throws IOException {
        // HDFS文件路径
        Path hdfsPath = new Path(HDFS_PATH);
        // 本地文件路径
        Path localPath = new Path(FILE_PATH);

        // 下载文件
        fs.copyToLocalFile(hdfsPath, localPath);

        System.out.println("文件下载成功!");
    }

    private static void createDirectory(FileSystem fs) throws IOException {
        // 目录路径
        Path directoryPath = new Path(DIRECTORY_PATH);

        // 创建目录
        fs.mkdirs(directoryPath);

        System.out.println("目录创建成功!");
    }

    private static void deleteDirectory(FileSystem fs) throws IOException {
        // 目录路径
        Path directoryPath = new Path(DIRECTORY_PATH);

        // 删除目录(递归删除)
        fs.delete(directoryPath, true);

        System.out.println("目录删除成功!");
    }

    private static void rename(FileSystem fs) throws IOException {
        // 原始文件或目录路径
        Path oldPath = new Path(HDFS_PATH);
        // 新文件或目录路径
        Path newPath = new Path("/new/path/in/hdfs/file.txt");

        // 重命名文件或目录
        fs.rename(oldPath, newPath);

        System.out.println("重命名成功!");
    }

    private static void listFiles(FileSystem fs) throws IOException {
        // 目录路径
        Path directoryPath = new Path("/path/in/hdfs");

        // 获取目录下的文件和子目录信息
        FileStatus[] fileStatuses = fs.listStatus(directoryPath);

        System.out.println("目录下的文件和子目录信息:");
        for (FileStatus fileStatus : fileStatuses) {
            System.out.println(fileStatus.getPath());
        }
    }
}

我们需要在指定目录中建立一个java文件,例如:HadoopFileSystemExample.java,然后将上面代码复制到创建的java文件中,然后在文件所在目录下的终端输入如下命令进行编译java代码:

javac -classpath $(hadoop classpath) HadoopFileSystemExample.java

这将使用Hadoop的类路径编译Java代码,并在同一目录下生成一个.class文件。

然后我们运行Java程序。使用以下命令运行程序:

java -classpath $(hadoop classpath):. HadoopFileSystemExample

这将运行Java程序,并根据代码中的操作与Hadoop分布式文件系统进行交互。

运行结果如下:

在这里插入图片描述

三、第二题

利用MapReduce编程框架,统计自己编写的数据采集文件信息,例如商品的销售订单信息,

​ 商品名称 单价 进价

​ 华为手机 4000 3500

​ Hp电脑 8000 7500

利用MapReduce编程框架编写程序统计每种商品的销售情况,统计出利润最高和销量最好的商品。


这道题目是我研究最久的题目,期间出现了各种问题,不过最后都解决掉了,在这里我把遇到的问题都列举出来,如果你们也遇见了相同的问题可以进行参考一下。

经过多次尝试,我认为将题目给出商品的销售订单信息保存到一个csv文件中更方便我们进行操作。


1、创建CSV文件并将其上传到HDFS

我们在指定目录中创建例如:sales.csv文件,然后将题目信息复制进去:

商品名称,单价,进价
华为手机,4000,3500
Hp电脑,8000,7500

保存退出之后,我们首先使用第一题所用创建目录命令在HDFS上创建一个input目录,然后将sales.csv文件上传到该目录中作为我们后续代码中输入目录。

2、编写利用MapReduce框架的java代码

  • 创建一个java项目目录,例如我创建的是sales

  • 创建一个继承自Mapper类的SalesMapper类,用于实现Map阶段的逻辑。在map()方法中,解析CSV文件的每一行数据,提取商品名称、单价和进价,并将商品名称作为输出的键,销售额和利润作为输出的值。

    import org.apache.hadoop.io.LongWritable;
    import org.apache.hadoop.io.Text;
    import org.apache.hadoop.mapreduce.Mapper;
    
    import java.io.IOException;
    
    public class SalesMapper extends Mapper<LongWritable, Text, Text, SalesData> {
    
        @Override
        protected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {
            // 跳过CSV文件的标题行
            if (key.get() == 0 && value.toString().startsWith("商品名称")) {
                return;
            }
    
            // 解析CSV文件的每一行数据
            String[] fields = value.toString().split(",");
            String productName = fields[0];
            int unitPrice = Integer.parseInt(fields[1]);
            int costPrice = Integer.parseInt(fields[2]);
    
            // 计算销售额和利润
            int salesAmount = unitPrice;
            int profit = unitPrice - costPrice;
    
            // 将商品名称作为键,销售数据作为值进行输出
            context.write(new Text(productName), new SalesData(salesAmount, profit));
        }
    }
    
  • 创建一个继承自Reducer类的SalesReducer类,用于实现Reduce阶段的逻辑。在reduce()方法中,对同一商品的销售数据进行累加,计算出总销售额和总利润,并输出到最终结果。

    import org.apache.hadoop.io.Text;
    import org.apache.hadoop.mapreduce.Reducer;
    
    import java.io.IOException;
    
    public class SalesReducer extends Reducer<Text, SalesData, Text, Text> {
    
        @Override
        protected void reduce(Text key, Iterable<SalesData> values, Context context) throws IOException, InterruptedException {
            int totalSalesAmount = 0;
            int totalProfit = 0;
    
            // 对同一商品的销售数据进行累加
            for (SalesData data : values) {
                totalSalesAmount += data.getSalesAmount();
                totalProfit += data.getProfit();
            }
    
            String output = "商品名称: " + key.toString() + "\t销售额: " + totalSalesAmount + "\t利润: " + totalProfit;
    
            // 输出每种商品的销售情况
            context.write(new Text("每种商品的销售情况:"), new Text(output));
    
            // 输出利润最高的商品
            if (totalProfit > context.getConfiguration().getInt("maxProfit", 0)) {
                context.getConfiguration().setInt("maxProfit", totalProfit);
                context.getConfiguration().set("profitMaxProduct", key.toString());
            }
    
            // 输出销量最好的商品
            if (totalSalesAmount > context.getConfiguration().getInt("maxSalesAmount", 0)) {
                context.getConfiguration().setInt("maxSalesAmount", totalSalesAmount);
                context.getConfiguration().set("salesMaxProduct", key.toString());
            }
        }
    
        @Override
        protected void cleanup(Context context) throws IOException, InterruptedException {
            // 输出利润最高的商品
            String maxProfitProduct = context.getConfiguration().get("profitMaxProduct");
            context.write(new Text("利润最高的商品:"), new Text(maxProfitProduct));
    
            // 输出销量最好的商品
            String maxSalesProduct = context.getConfiguration().get("salesMaxProduct");
            context.write(new Text("销量最好的商品:"), new Text(maxSalesProduct));
        }
    }
    
  • 创建一个自定义的数据类型SalesData,用于存储销售数据。

    import org.apache.hadoop.io.Writable;
    
    import java.io.DataInput;
    import java.io.DataOutput;
    import java.io.IOException;
    
    public class SalesData implements Writable {
        private int salesAmount;
        private int profit;
    
        public SalesData() {
            // 默认构造函数,需要提供无参构造函数
        }
    
        public SalesData(int salesAmount, int profit) {
            this.salesAmount = salesAmount;
            this.profit = profit;
        }
    
        public int getSalesAmount() {
            return salesAmount;
        }
    
        public int getProfit() {
            return profit;
        }
    
        @Override
        public void write(DataOutput dataOutput) throws IOException {
            dataOutput.writeInt(salesAmount);
            dataOutput.writeInt(profit);
        }
    
        @Override
        public void readFields(DataInput dataInput) throws IOException {
            salesAmount = dataInput.readInt();
            profit = dataInput.readInt();
        }
    
        @Override
        public String toString() {
            return salesAmount + "\t" + profit;
        }
    }
    
  • 创建一个SalesDriver类作为程序的入口点,设置MapReduce作业的相关配置。

    import org.apache.hadoop.conf.Configuration;
    import org.apache.hadoop.fs.Path;
    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;
    
    public class SalesDriver {
    
        public static void main(String[] args) throws Exception {
            Configuration conf = new Configuration();
            conf.setInt("maxProfit", 0);
            conf.setInt("maxSalesAmount", 0);
    
            Job job = Job.getInstance(conf, "Sales Statistics");
    
            job.setJarByClass(SalesDriver.class);
            job.setMapperClass(SalesMapper.class);
            job.setReducerClass(SalesReducer.class);
    
            job.setMapOutputKeyClass(Text.class);
            job.setMapOutputValueClass(SalesData.class);
            job.setOutputKeyClass(Text.class);
            job.setOutputValueClass(Text.class);
    
            FileInputFormat.addInputPath(job, new Path(args[0]));
            FileOutputFormat.setOutputPath(job, new Path(args[1]));
    
            System.exit(job.waitForCompletion(true) ? 0 : 1);
        }
    }
    

3、打包java项目

  • 在我们创建的java项目根目录下创建一个名为src的文件夹。

  • 将所有的Java源代码文件(.java)移动到src文件夹中。

  • 在项目根目录中创建一个名为Manifest.txt的文件,用于指定JAR文件的入口点。

  • Manifest.txt文件中,添加以下内容:

    Main-Class: <Main-Class>
    

    <Main-Class>替换为包含main方法的主类的完整类名,例如我的是SalesDriver

  • 回到项目根目录下,使用以下命令编译Java源代码并创建一个临时目录来保存编译后的类文件:

    mkdir classes
    javac -d classes src/*.java
    

    如果你在使用编译命令时出现程序包×××存在的问题,这个时候我们需要将Hadoop相关的jar文件添加到编译路径中才可以解决:

    javac -classpath /usr/local/servers/hadoop/share/hadoop/common/h
    
    adoop-common-3.1.3.jar:/usr/local/servers/hadoop/share/hadoop/mapreduce/hadoop-map
    
    reduce-client-core-3.1.3.jar -d classes src/*.java
    

    注意上面的命令是一个而不是多个。

  • 创建一个空的JAR文件,命名为SalesAnalysis.jar

    jar -cvf SalesAnalysis.jar -C classes/ .
    
  • 将编译后的类文件和Manifest.txt添加到JAR文件中:

    jar -uf SalesAnalysis.jar -C classes/ . 
    
    jar -uf SalesAnalysis.jar Manifest.txt
    

    在这里插入图片描述

到现在,我们的整个java项目就打包成功了。

4、在Hadoop集群上提交jar文件来运行MapReduce作业

我们将打包好的SalesAnalysis.jar使用如下命令提交到集群上面:

hadoop jar SalesAnalysis.jar SalesDriver /input/sales.csv /output  

顺利执行之后终端会打印如下信息:

2023-05-17 11:06:42,618 INFO client.RMProxy: Connecting to ResourceManager at localhost/127.0.0.1:8032
2023-05-17 11:06:43,193 WARN mapreduce.JobResourceUploader: Hadoop command-line option parsing not performed. Implement the Tool interface and execute your application with ToolRunner to remedy this.
2023-05-17 11:06:43,207 INFO mapreduce.JobResourceUploader: Disabling Erasure Coding for path: /tmp/hadoop-yarn/staging/root/.staging/job_1684292771788_0001
2023-05-17 11:06:43,321 INFO sasl.SaslDataTransferClient: SASL encryption trust check: localHostTrusted = false, remoteHostTrusted = false
2023-05-17 11:06:43,477 INFO input.FileInputFormat: Total input files to process : 1
2023-05-17 11:06:43,519 INFO sasl.SaslDataTransferClient: SASL encryption trust check: localHostTrusted = false, remoteHostTrusted = false
2023-05-17 11:06:43,948 INFO sasl.SaslDataTransferClient: SASL encryption trust check: localHostTrusted = false, remoteHostTrusted = false
2023-05-17 11:06:43,969 INFO mapreduce.JobSubmitter: number of splits:1
2023-05-17 11:06:44,182 INFO sasl.SaslDataTransferClient: SASL encryption trust check: localHostTrusted = false, remoteHostTrusted = false
2023-05-17 11:06:44,202 INFO mapreduce.JobSubmitter: Submitting tokens for job: job_1684292771788_0001
2023-05-17 11:06:44,202 INFO mapreduce.JobSubmitter: Executing with tokens: []
2023-05-17 11:06:44,394 INFO conf.Configuration: resource-types.xml not found
2023-05-17 11:06:44,394 INFO resource.ResourceUtils: Unable to find 'resource-types.xml'.
2023-05-17 11:06:44,947 INFO impl.YarnClientImpl: Submitted application application_1684292771788_0001
2023-05-17 11:06:45,030 INFO mapreduce.Job: The url to track the job: http://panli:8088/proxy/application_1684292771788_0001/
2023-05-17 11:06:45,031 INFO mapreduce.Job: Running job: job_1684292771788_0001
2023-05-17 11:06:51,218 INFO mapreduce.Job: Job job_1684292771788_0001 running in uber mode : false
2023-05-17 11:06:51,219 INFO mapreduce.Job:  map 0% reduce 0%
2023-05-17 11:06:57,472 INFO mapreduce.Job:  map 100% reduce 0%
2023-05-17 11:07:03,546 INFO mapreduce.Job:  map 100% reduce 100%
2023-05-17 11:07:04,570 INFO mapreduce.Job: Job job_1684292771788_0001 completed successfully
2023-05-17 11:07:04,707 INFO mapreduce.Job: Counters: 53
        File System Counters
                FILE: Number of bytes read=48
                FILE: Number of bytes written=435907
                FILE: Number of read operations=0
                FILE: Number of large read operations=0
                FILE: Number of write operations=0
                HDFS: Number of bytes read=177
                HDFS: Number of bytes written=228
                HDFS: Number of read operations=8
                HDFS: Number of large read operations=0
                HDFS: Number of write operations=2
        Job Counters 
                Launched map tasks=1
                Launched reduce tasks=1
                Data-local map tasks=1
                Total time spent by all maps in occupied slots (ms)=3234
                Total time spent by all reduces in occupied slots (ms)=4120
                Total time spent by all map tasks (ms)=3234
                Total time spent by all reduce tasks (ms)=4120
                Total vcore-milliseconds taken by all map tasks=3234
                Total vcore-milliseconds taken by all reduce tasks=4120
                Total megabyte-milliseconds taken by all map tasks=3311616
                Total megabyte-milliseconds taken by all reduce tasks=4218880
        Map-Reduce Framework
                Map input records=3
                Map output records=2
                Map output bytes=38
                Map output materialized bytes=48
                Input split bytes=102
                Combine input records=0
                Combine output records=0
                Reduce input groups=2
                Reduce shuffle bytes=48
                Reduce input records=2
                Reduce output records=4
                Spilled Records=4
                Shuffled Maps =1
                Failed Shuffles=0
                Merged Map outputs=1
                GC time elapsed (ms)=157
                CPU time spent (ms)=1710
                Physical memory (bytes) snapshot=477585408
                Virtual memory (bytes) snapshot=5564370944
                Total committed heap usage (bytes)=374865920
                Peak Map Physical memory (bytes)=265957376
                Peak Map Virtual memory (bytes)=2778443776
                Peak Reduce Physical memory (bytes)=211628032
                Peak Reduce Virtual memory (bytes)=2785927168
        Shuffle Errors
                BAD_ID=0
                CONNECTION=0
                IO_ERROR=0
                WRONG_LENGTH=0
                WRONG_MAP=0
                WRONG_REDUCE=0
        File Input Format Counters 
                Bytes Read=75
        File Output Format Counters 
                Bytes Written=228

然后我们查看我们的输出目录:

hdfs dfs -ls /output

在这里插入图片描述

红框所示就是我们需要的结果,我们将其下载下来进行查看:

hdfs dfs -get /output/part-r-00000 /root
vim part-r-00000

在这里插入图片描述

可以看见运行出我们想要的结果了。

如果你在hadoop jar SalesAnalysis.jar SalesDriver /input/sales.csv /output 这一步的时候运行出来的结果是空白然后查看打印信息发现出现Container [pid=32862,containerID=container_1684223917947_0013_01_000004] is running 506522112B beyond the 'VIRTUAL' memory limit. Current usage: 109.5 MB of 1 GB physical memory used; 2.6 GB of 2.1 GB virtual memory used. Killing container.这是因为容器使用的虚拟内存超出了限制而导致的。我们需要尝试通过命令行方式来增加虚拟内存限制。

我们需要修改yarn-site.xml文件信息,在文件中添加以下配置来增加虚拟内存限制:

<property>
    <name>yarn.nodemanager.vmem-pmem-ratio</name>
    <value>4</value> <!-- 增加虚拟内存限制的比例 -->
</property>

将上述代码添加到你的yarn-site.xml文件的configuration标签内,然后保存修改。这样,虚拟内存限制将会被调整为物理内存的四倍。请确保在添加新配置时保留文件中的其他配置项不变。

yarn-site.xml文件通常在hadoop安装目录的/etc/hadoop/目录下面,修改保存之后我们不需要重启HDFS,只需重启YARN服务即可让修改生效。

yarn --daemon stop resourcemanager
yarn --daemon start resourcemanager

这将停止和启动YARN的ResourceManager服务。在服务重启之后,新的yarn-site.xml配置将生效。

请注意,如果你使用了集群管理工具(如Ambari或Cloudera Manager),你可能需要使用工具提供的界面或命令来重启YARN服务。具体的重启方法可能因你的环境而有所不同,请根据你的情况进行相应的操作。

需要注意的是,对于某些修改可能需要重启整个Hadoop集群,包括HDFS和YARN服务。但在这种情况下,你通常会收到明确的提示和建议。

重启之后我们再次执行上述命令就能顺利执行成功了。

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

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

相关文章

MySQL高级_第05章_存储引擎

MySQL高级_第05章_存储引擎 1. 查看存储引擎 查看mysql提供什么存储引擎&#xff1a; show engines ; show engines \G ; 显式如下&#xff1a; *************************** 1. row *************************** Engine : InnoDB Support: DEFAULT Comment : Su…

企业管理OA系统在企业数字化转型中带来的变化,简直难以想象

目前企业管理面临到哪些痛点 1.信息孤岛&#xff1a;企业内部信息流动不畅&#xff0c;各部门数据独立&#xff0c;互相之间信息难以共享和沟通。 2.流程繁琐&#xff1a;企业业务流程较为繁琐&#xff0c;审批流程漫长&#xff0c;给业务员和经理带来不必要的工作压力。 3.…

Hbase入门篇03---Java API使用,HBase高可用配置和架构设计

Hbase入门篇03---Java API使用&#xff0c;HBase高可用配置和架构设计 需求环境搭建表的CRUD坑命令执行卡住不动 &#xff1f;RegionServer只在本地127.0.0.1监听16020端口导致外网连接被拒RegionServer所在主机的/etc/hosts文件存在额外的回环地址映射信息,导致客户端拿到无法…

亚马逊云科技使用Inf2实例运行GPT-J-6B模型

在2019年的亚马逊云科技re:Invent上&#xff0c;亚马逊云科技发布了Inferentia芯片和Inf1实例这两个基础设施。Inferentia是一种高性能机器学习推理芯片&#xff0c;由亚马逊云科技定制设计&#xff0c;其目的是提供具有成本效益的大规模低延迟预测。时隔四年&#xff0c;2023年…

生成bean的注解@Component极其衍生和@ComponentScan@Configuration

Component Spring 2.5 以后&#xff0c;除了提供基本的 Component 注解之外&#xff0c;还提供了 Service Controller Repository 三个注解。在 Spring 源码中&#xff0c;后面三个注解都在开始部分引入了 Component 注解&#xff0c;除此以外这四个注解的源码内容没有任何区别…

Json介绍

文章目录 1. 什么是 JSON&#xff1f;2. JSON语法格式3. JSON在Java中的用途3.1 FastJSON1. FastJSON概述与下载2. FastJSON常用方法 3.2. Jackson1. Jackson下载与使用2. Jackson常用类与方法3. ObjectMapper类常用方法 1. 什么是 JSON&#xff1f; JSON:JavaScript Object N…

C语言函数大全-- _w 开头的函数(2)

C语言函数大全 本篇介绍C语言函数大全-- _w 开头的函数 1. _wexecl 1.1 函数说明 函数声明函数功能int _wexecl(const wchar_t *path, const wchar_t *arg0, ... /* , const wchar_t *arg1, ..., NULL */);它是一个 Windows 平台下的 C 标准库函数&#xff0c;用于在新进程…

〖大学生·技术人必学的职业规划白宝书 - 职业规划篇②〗- 进入职场前必须要考虑的问题

历时18个月&#xff0c;采访 850 得到的需求。 不管你是在校大学生、研究生、还是在职的小伙伴&#xff0c;该专栏有你想要的职业规划、简历、面试的答案。说明&#xff1a;该文属于 大学生技术人职业规划白宝书 专栏&#xff0c;购买任意白宝书体系化专栏可加入TFS-CLUB 私域社…

leecode106——使用中序遍历和后序遍历构造一棵二叉树

leecode106 中序遍历和后序遍历构造一棵二叉树 &#x1f50e;中序遍历和后续遍历的性质 在后序遍历中&#xff0c;最后一个元素二叉树的根节点 在中序遍历序列中&#xff0c;根节点的左边为左子树&#xff0c;右边为右子树 &#x1f50e;1.二叉树的还原过程描述 1.首先&am…

HTTP协议基本格式

HTTP协议基本格式 TCP/IP的分层管理HTTP的基本格式 TCP/IP的分层管理 TCP/IP协议族里重要的一点就是分层。TCP/IP协议族按层次分别分为5层&#xff1a; 应用层、传输层、网络层、数据链路层、物理层。 TCP/IP层次化的好处。 如果互联网只由一个协议统筹&#xff0c;某个地方需…

不动点定理的及其有趣应用

最近读高观点下的数学这本书&#xff0c;对书中介绍的布劳威尔不动点定理的有趣性质印象很深&#xff0c;原因是这个定理的某些性质能够解释我们生活中的一些常见现象&#xff0c;这里结合一个例题&#xff0c;聊以记录。 从一个数学题讲起&#xff1a; f(x)是定义在[0,1]上的…

IPB60R099CP-ASEMI代理英飞凌高压MOS管IPB60R099CP

编辑&#xff1a;ll IPB60R099CP-ASEMI代理英飞凌高压MOS管IPB60R099CP 型号&#xff1a;IPB60R099CP 品牌&#xff1a;英飞凌 封装&#xff1a;TO-263 最大漏源电流&#xff1a;31A 漏源击穿电压&#xff1a;600V RDS&#xff08;ON&#xff09;Max&#xff1a;99mΩ …

【MySQL】MySQL百万数据深度分页优化思路分析

文章目录 一、业务背景二、瓶颈再现三、问题分析回表覆盖索引IOLIMTI 2000,10 &#xff1f; 四、问题总结五、解决方案优化前后性能对比 一、业务背景 一般在项目开发中会有很多的统计数据需要进行上报分析&#xff0c;一般在分析过后会在后台展示出来给运营和产品进行分页查看…

软考A计划-真题-分类精讲汇总-第十五章(数据库设计)

点击跳转专栏>Unity3D特效百例点击跳转专栏>案例项目实战源码点击跳转专栏>游戏脚本-辅助自动化点击跳转专栏>Android控件全解手册点击跳转专栏>Scratch编程案例 &#x1f449;关于作者 专注于Android/Unity和各种游戏开发技巧&#xff0c;以及各种资源分享&am…

如何做到乡村振兴?主要包括以下几点

乡村振兴是现代化发展的常记口号&#xff0c;也是中国整体经济发展的必备条件&#xff0c;乡村振兴是一个多元化的问题&#xff0c;其中包含人文、经济、文化、生态、人才等&#xff0c;那么如何做到乡村振兴呢&#xff1f; 主要包括以下几点&#xff1a; 1.合理利用土地资源…

SpringBoot配置文件敏感信息加密(四十六)

新的生活会开始&#xff0c;直到完成自己的目标. 一. 配置文件敏感信息加密 我们以前在编写 application.yml 文件时&#xff0c;服务器的ip, 数据库的配置&#xff0c;Redis的密码配置等都是明文&#xff0c;这是很不安全的。 我们可以通过 jasypt-spring-boot-starter 插件进…

Python学习26:个人所得税计算器

描述‪‬‪‬‪‬‪‬‪‬‮‬‪‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‮‬‪‬‪‬‪‬‪‬‪‬‮‬‭‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‭‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‪‬ 2018年10月1日以前&#xff…

Java 性能调优全攻略:步骤、工具、技巧一网打尽

Java性能调优是一项非常重要的工作&#xff0c;它可以提高应用程序的性能和可伸缩性&#xff0c;并确保应用程序在高负载情况下仍然能够快速、稳定地运行。 1、Java性能调优步骤 Java性能调优的主要步骤包括&#xff1a; 确定目标&#xff1a;首先需要明确性能调优的目标&…

提高数据的安全性和可控性,数栈基于 Ranger 实现的 Spark SQL 权限控制实践之路

在企业级应用中&#xff0c;数据的安全性和隐私保护是极其重要的。Spark 作为数栈底层计算引擎之一&#xff0c;必须确保数据只能被授权的人员访问&#xff0c;避免出现数据泄露和滥用的情况。为了实现Spark SQL 对数据的精细化管理及提高数据的安全性和可控性&#xff0c;数栈…

多维时序 | MATLAB实现CNN-BiGRU卷积神经网络结合双向门控循环单元多变量时间序列预测

多维时序 | MATLAB实现CNN-BiGRU卷积神经网络结合双向门控循环单元多变量时间序列预测 目录 多维时序 | MATLAB实现CNN-BiGRU卷积神经网络结合双向门控循环单元多变量时间序列预测预测结果基本介绍模型特点程序设计学习总结参考资料 预测结果 基本介绍 多维时序 | MATLAB实现CN…