DataWhale 大数据处理技术组队学习task4

news2025/7/19 4:47:41

五、分布式并行编程模型MapReduce

1. 概述

1.1 分布式并行编程

  • 背景:摩尔定律已经开始逐渐失效,提升数据处理计算能力刻不容缓。
  • 传统的程序开发与分布式并行编程
    • 传统的程序开发:以单指令、单数据流的方式顺序执行,虽然这种方式比较符合人类的思维习惯,但是,这种程序的性能受到单台机器性能的限制,可扩展性较差。
    • 分布式并行编程:分布式程序运行在大规模计算机集群上,集群中包括大量廉价服务器,可以并行执行大规模数据处理任务,从而获得海量的计算能力。

1.2 MapReduce模型简介

MapReduce将复杂的、运行于大规模集群上的并行计算过程高度抽象到了两个函数:MapReduce,这两个函数及其核心思想都源自函数式编程语言。

  • 设计理念:“计算向数据靠拢”,而不是“数据向计算靠拢"
    • 原因:数据需要大量的网络传输开销,尤其是在大规模数据环境下,这种开销尤为惊人,所以,移动计算要比移动数据更加经济
    • 措施:只要有可能,一个集群中的MapReduce框架就会将Map程序就近地在HDFS数据所在的节点运行,即将计算节点和存储节点放在一起运行,从而减少了节点间的数据移动开销。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hKEWra9S-1677247366243)(null)]

  • 架构:Master/Slave架构(一个Master和若干个Slave)

    • Master上运行JobTracker(JobTracker负责作业和任务的调度,监控它们的执行,并重新调度已经失败的任务)
    • Slave上运行 TaskTracker(TaskTracker负责执行由JobTracker指派的任务)
  • 在一个MapReduce的作业中必定会涉及到如下一些组件:

    • 客户端:提交MapReduce作业
    • yarn资源管理器:负责集群上计算资源的协调
    • yarn节点管理器:负责启动和监控集群中机器上的计算容器(container)
    • MapReduce的application master:负责协调运行MapReduce的作业
    • HDFS:分布式文件系统,负责与其他实体共享作业文件

1.3 Map和Reduce函数

  • 都是以<key, value>作为输入,按一定的映射规则转换成另一个或一批<key, value>进行输出。
函数输入输出说明
Map<k1,v1> 如:<行号,”a b c”>List(<k2,v2>) 如:<“a”,1>1、将小数据集进一步解析成一批<key,value>对,输入Map函数中进行处理 2、每一个输入的<k1,v1>会输出一批<k2,v2>。<k2,v2>是计算的中间结果
Reduce<k2,List(v2)> 如:<“a”,<1,1,1>><k3,v3> 如:<“a”,3>输入的中间结果<k2,List(v2)>中的List(v2)表示是一批属于同一个k2的value
  • map:一个map函数本质上是将一种操作进行进行映射,针对不同的对象进行同一种操作
  • reduce:将所得的中间结果进行混合

2. MapReduce的工作流程

2.1 工作流程概述

  • 大规模数据集的处理包括分布式存储分布式计算两个核心环节。
  • 谷歌公司用分布式文件系统GFS实现分布式数据存储,用MapReduce实现分布式计算,而Hadoop则使用分布式文件系统HDFS实现分布式数据存储,用Hadoop MapReduce实现分布式计算。
  • MapReduce核心思想:分而治之(与递归的思想不谋而合)
    • 即把一个大的数据集拆分成多个小数据块在多台机器上并行处理
      • **首先会被拆分成许多个Map任务在多台机器上并行执行,**每个Map任务通常运行在数据存储的节点上,这样,计算和数据就可以放在一起运行,不需要额外的数据传输开销。当Map任务结束后,会生成以<key,value>形式表示的许多中间结果。
      • 然后,这些中间结果会被分发到多个Reduce任务在多台机器上并行执行具有相同key<key,value>会被发送到同一个Reduce任务那里,Reduce任务会对中间结果进行汇总计算得到最后结果,并输出到分布式文件系统中。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kpWtGvmz-1677247112542)(null)]

  • 注意
    • 不同的Map任务之间不会进行通信,不同的Reduce任务之间也不会发生任何信息交换;用户不能显式地从一台机器向另一台继机器发送消息,所有的数据交换都是通过MapReduce框架自身去实现的。(通信只会在相同的map、reduce任务之间进行)
    • 在MapReduce的整个执行过程中,Map任务的输入文件、Reduce任务的处理结果都是保存在分布式文件系统中的,而Map任务处理得到的中间结果则保存在本地存储(如磁盘)中。

2.2 MapReduce的各个执行阶段

  1. MapReduce框架使用InputFormat模块做Map前的预处理,比如,验证输入的格式是否符合输入定义;然后,将输入文件切分为逻辑上的多个InputSplitInputSplit是MapReduce对文件进行处理和运算的输入单位,只是一个逻辑概念,每个InputSplit并没有对文件进行实际切割,只是记录了要处理的数据的位置和长度。
  2. 因为InputSplit是逻辑切分而非物理切分,所以,还需要通过RecordReader(RR)并根据InputSplit中的信息来处理InputSplit中的具体记录,加载数据并转换为适合Map任务读取的键值对,输入给Map任务。
  3. Map任务会根据用户自定义的映射规则,输出一系列的<key,value>作为中间结果。
  4. 为了让Reduce可以并行处理Map的结果,需要对Map的输出进行一定的分区、排序(Sort)、合并(Combine)和归并(Merge)等操作,得到<key,value-list>形式的中间结果,再交给对应的Reduce程序进行处理,这个过程称为Shuffle
  5. Reduce以一系列<key,value-list>中间结果作为输入,执行用户定义的逻辑,输出结果给OutputFormat模块。
  6. OutputFormat模块会验证输出目录是否已经存在,以及输出结果类型是否符合配置文件中的配置类型,如果都满足,就输出Reduce的结果到分布式文件系统。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Rpny3a5b-1677247111535)(null)]

2.3 Shuffle过程详解

2.3.1 Shuffle过程简介

  • 所谓Shuffle,是指针对Map输出结果进行分区、排序和合并等处理,并交给Reduce的过程。因此,Shuffle过程分为Map端的操作Reduce端的操作

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-NH3Jox2B-1677247115541)(null)]

  1. Map端的Shuffle过程。Map的输出结果首先被写入缓存,当缓存满时,就启动溢写操作,把缓存中的数据写入磁盘文件,并清空缓存。当启动溢写操作时,首先需要把缓存中的数据进行分区,然后对每个分区的数据进行排序(Sort)和合并(Combine),之后再写入磁盘文件。每次溢写操作会生成一个新的磁盘文件,随着Map任务的执行,磁盘中就会生成多个溢写文件。在Map任务全部结束之前,这些溢写文件会被归并(Merge)成一个大的磁盘文件,然后,通知相应的Reduce任务来领取属于自己需要处理的数据。

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nb9nxXWO-1677247115477)(null)]

  2. Reduce端的Shuffle过程。Reduce任务从Map端的不同Map机器领回属于自己需要处理的那部分数据,然后,对数据进行归并(Merge)后交给Reduce处理。

2.3.2 Map端得Shuffle过程

  1. 输入数据和执行Map任务
      Map任务的输入数据一般保存在分布式文件系统(如GFS或HDFS)的文件块中,这些文件块的格式是任意的,可以是文档,也可以是二进制格式的。Map任务接受<key,value>作为输入后,按一定的映射规则转换成一批<key,value>进行输出。
  2. 写入缓存
      每个Map任务都会被分配一个缓存,Map的输出结果不是立即写入磁盘,而是首先写入缓存。在缓存中积累一定数量的Map输出结果以后,再一次性批量写入磁盘,这样可以大大减少对磁盘I/O的影响。因为,磁盘包含机械部件,它是通过磁头移动和盘片的转动来寻址定位数据的,每次寻址的开销很大,如果每个Map输出结果都直接写入磁盘,会引入很多次寻址开销,而一次性批量写入,就只需要一次寻址,连续写入,大大降低了开销。需要注意的是,在写入缓存之前,keyvalue值都会被序列化成字节数组。
  3. 溢写(分区、排序和合并)
      提供给MapReduce的缓存的容量是有限的,默认大小是100MB。随着Map任务的执行,缓存中Map结果的数量会不断增加,很快就会占满整个缓存,这时,就必须启动溢写(Spill)操作,把缓存中的内容一次性写入磁盘,并清空缓存。溢写的过程通常是由另外一个单独的后台线程来完成的,不会影响Map结果往缓存写入。但是,为了保证Map结果能够不停地持续写入缓存,不受溢写过程的影响,就必须让缓存中一直有可用的空间,不能等到全部占满才启动溢写过程,所以,一般会设置一个溢写比例,如0.8,也就是说,当100MB大小的缓存被填满80MB数据时,就启动溢写过程,把已经写入的80MB数据写入磁盘,剩余20MB空间供Map结果继续写入。
      但是,在溢写到磁盘之前,缓存中的数据首先会被分区(Partition)。缓存中的数据是<key,value>形式的键值对,这些键值对最终需要交给不同的Reduce任务进行并行处理。MapReduce通过Partitioner接口对这些键值对进行分区,默认采用的分区方式是采用Hash函数对key进行哈希后,再用Reduce任务的数量进行取模,可以表示成hash(key) mod R。其中,R表示Reduce任务的数量,这样,就可以把Map输出结果均匀地分配给这RReduce任务去并行处理了。当然,MapReduce也允许用户通过重载Partitioner接口来自定义分区方式。
      对于每个分区内的所有键值对,后台线程会根据key对它们进行内存排序(Sort),排序是MapReduce的默认操作。排序结束后,还包含一个可选的合并(Combine)操作。如果用户事先没有定义Combiner函数,就不用进行合并操作。如果用户事先定义了Combiner函数,则这个时候会执行合并操作,从而减少需要溢写到磁盘的数据量。
      所谓**“合并”,是指将那些具有相同key<key,value>value加起来,比如,有两个键值对<"xmu",1><"xmu",1>,经过合并操作以后就可以得到一个键值对<"xmu",2>减少了键值对的数量。这里需要注意,Map端的这种合并操作,其实和Reduce的功能相似,但是,由于这个操作发生在Map端,所以,我们只能称之为“合并”,从而有别于Reduce。不过,并非所有场合都可以使用Combiner,因为,Combiner的输出是Reduce任务的输入,Combiner绝不能改变Reduce任务最终的计算结果,一般而言,累加、最大值等场景可以使用合并操作。
      经过
    分区、排序以及可能发生的合并操作之后,这些缓存中的键值对就可以被写入磁盘,并清空缓存。每次溢写操作都会在磁盘中生成一个新的溢写文件,写入溢写文件中的所有键值对,都是经过分区和排序**的。
  4. 文件归并
      每次溢写操作都会在磁盘中生成一个新的溢写文件,随着MapReduce任务的进行,磁盘中的溢写文件数量会越来越多。当然,如果Map输出结果很少,磁盘上只会存在一个溢写文件,但是,通常都会存在多个溢写文件。最终,在Map任务全部结束之前,系统会对所有溢写文件中的数据进行归并(Merge),生成一个大的溢写文件,这个大的溢写文件中的所有键值对,也是经过分区和排序的。
      所谓归并(Merge),是指对于具有相同key的键值对,会被归并成一个新的键值对。具体而言,对于若干个具有相同key的键值对<k1,v1><k1,v2>…,会被归并成一个新的键值对<k1,<V1,V2,...vn>>
      另外,进行文件归并时,如果磁盘中已经生成的溢写文件的数量超过参数min.num.spills.for.combine的值时(默认值是3,用户可以修改这个值)。那么,就可以再次运行Combiner,对数据进行合并操作,从而减少写入磁盘的数据量。但是,如果磁盘中只有一两个溢写文件时,执行合并操作就会“得不偿失”,因为执行合并操作本身也需要代价,因此,不会运行Combiner

2.3.3 Reduce端得Shuffle过程

Reduce端的Shuffle过程非常简单,只需要从Map端读取结果,然后执行归并操作,最后输送给Reduce任务进行处理,具体执行流程如下:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-26xF6RjG-1677247112446)(null)]

  1. “领取”数据
      Map端的Shuffle过程结束后,所有Map输出结果都保存在Map机器的本地磁盘上,Reduce任务需要把这些数据“领取”(Fetch)回来,存放到自己所在机器的本地磁盘上。因此,在每个Reduce任务真正开始之前,它大部分时间都在从Map端把属于自己处理那些分区的数据“领取”过来。
      每个Reduce任务会不断地通过RPC(Remote Procedure Call)向JobTracker询问Map任务是否已经完成;JobTracker监测到一个Map任务完成后,就会通知相关的Reduce任务来“领取”数据;一旦一个Reduce任务收到JobTracker通知,它就会到该Map任务所在机器上把属于自己处理的分区数据领取到本地磁盘中。一般系统中会存在多个Map机器,因此,Reduce任务会使用多个线程同时从多个Map机器领回数据。
  2. 归并数据
      从Map端领回的数据,会首先被存放在Reduce任务所在机器的缓存中,如果缓存被占满,就会像Map端一样被溢写到磁盘中。由于在Shuffle阶段,Reduce任务还没有真正开始执行,因此,这时可以把内存的大部分空间分配给Shuffle过程作为缓存。需要注意的是,系统中一般存在多个Map机器,所以,Reduce任务会从多个Map机器领回属于自己处理的那些分区的数据,因此,缓存中的数据是来自不同的Map机器的,一般会存在很多可以合并(Combine)的键值对。
      当溢写过程启动时,具有相同key的键值对会被归并(Merge),如果用户定义了Combiner,则归并后的数据还可以执行合并操作,减少写入磁盘的数据量。每个溢写过程结束后,都会在磁盘中生成一个溢写文件,因此,磁盘上会存在多个溢写文件。最终,当所有的Map端数据都已经被领回时,和Map端类似,多个溢写文件会被归并成一个大文件,归并的时候还会对键值对进行排序,从而使得最终大文件中的键值对都是有序的。当然,在数据很少的情形下,缓存就可以存储所有数据,就不需要把数据溢写到磁盘,而是直接在内存中执行归并操作,然后直接输出给Reduce任务。
      需要说明的是,把磁盘上的多个溢写文件归并成一个大文件,可能需要执行多轮归并操作。每轮归并操作可以归并的文件数量是由参数io.sort.factor的值来控制的(默认值是10,可以修改)。
      假设磁盘中生成了50个溢写文件,每轮可以归并10个溢写文件,则需要经过5轮归并,得到5个归并后的大文件。
  3. 把数据输入Reduce任务
      磁盘中经过多轮归并后得到的若干个大文件,不会继续归并成一个新的大文件,而是直接输入给Reduce任务,这样可以减少磁盘读写开销。由此,整个Shuffle过程顺利结束。接下来,Reduce任务会执行Reduce函数中定义的各种映射,输出最终结果,并保存到分布式文件系统中。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-GXOK1cb5-1677247114510)(null)]

3. 以WordCount为例理解MapReduce过程

  1. 判断WordCount任务是否可以采用MapReduce实现。(满足前提条件:待处理的数据集可以分解成许多小的数据集,而且每一个小数据集都可以完全并行地进行处理,核心是并行处理)本例中,不同单词之间的频数不存在相关性,彼此独立,可以把不同的单词分发给不同的机器进行并行处理,因此,可以采用MapReduce来实现词频统计任务。

  2. 确定MapReduce程序的设计思路。本例中,把文件内容解析成许多个单词,然后把所有相同的单词聚集到一起最后,计算出每个单词出现的次数进行输出

  3. 确定MapReduce程序的执行过程。把一个大文件切分成许多个分片,每个分片输入给不同机器上的Map任务,并行执行完成“从文件中解析出所有单词”的任务。Map的输入采用Hadoop默认的<key, value>输入方式,即文件的行号作为key,文件的一行作为valueMap的输出以单词作为key,1作为value,即<单词,1>,表示单词出现了1次。

  4. Map阶段完成后,会输出一系列<单词,1>这种形式的中间结果,然后,Shuffle阶段会对这些中间结果进行排序、分区,得到<key, value-list>的形式(比如<hadoop,<1,1,1,1,1>>),分发给不同的Reduce任务。Reduce任务接收到所有分配给自己的中间结果(一系列键值对)以后,就开始执行汇总计算工作,计算得到每个单词的频数并把结果输出到分布式文件系统。

3.1 WordCount实现过程

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6tMVGoqG-1677247113508)(null)]

3.2 简易版MapReduce工作流程

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-GeqCbSSQ-1677247114491)(null)]

3.3 数据分片

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-OUaPHK98-1677247116527)(null)]

MapReduce的工作流程:

  • Inputformat的作用:加载、读取HDFS中的文件,对输入进行格式验证;将大文件切分成许多分片split,但此切分仅是逻辑上的切分,即逻辑定义每个split的起点和长度,并非真正意义的物理切分。
  • record reader:记录阅读器,根据split的位置和长度,从HDFS中的各个块读取相关分片,读取成<k,v>的形式。

3.4 WordCount详细讲解

  1. 数据分片

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-oTNdfyHo-1677247109441)(null)]

  2. split的map过程

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vk4PV0dY-1677247113493)(null)]

  3. Reduce过程

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-sWmZEYj3-1677247112488)(null)]

  4. WordCount的Map过程

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-NQ448ovL-1677247114457)(null)]

  5. WordCount的Reduce过程

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-WURqNOf6-1677247115497)(null)]

  6. Shuffle过程

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-q4PfQDwE-1677247113472)(null)]

3.5 详细版MapReduce工作流程

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2qgiFUvC-1677247117518)(null)]

3.6 MapReduce的体系结构

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-PmMf8Nw8-1677247114535)(null)]

  • Client(客户端)

    • 主要功能:负责提交作业,查看作业状态

    • 提交作业:用户编写的MapReduce程序通过Client提交到JobTracker端。

    • 查看作业状态:用户可通过Client提供的一些接口查看作业运行状态。

  • JobTracker(作业跟踪器)

    • 主要功能:负责资源监控、作业调度

    • 资源监控JobTracker监控所有TaskTrackerJob的健康状况,一旦发现节点失效(通信失败或节点故障),就将相应的任务转移到其他节点。

    • 作业调度JobTracker会跟踪任务的执行进度、资源使用量等信息,并将这些信息告诉任务调度器(TaskScheduler),而任务调度器会选择合适的(比较空闲)节点资源来执行任务。

  • TaskScheduler(任务调度器)

    • 执行具体的相关任务,一般接收JobTracker发送过来的命令。

    • 把一些自己的资源使用情况,以及任务的运行进度通过心跳的方式,也就是heartbeat发送给JobTracker

  • TaskTracker(任务跟踪器)

    • TaskTracker会周期性地通过“心跳”,将本节点上资源的使用情况和任务的运行进度汇报给JobTracker,同时接收JobTracker发送过来的命令,并执行相应的操作(如启动新任务、杀死任务等)。

    • TaskTracker使用slot等量划分本节点上的资源量(CPU、内存等)。一个Task获取到一个slot后才有机会运行,而Hadoop调度器(TaskScheduler)的作用就是将各个TaskTracker上的空闲slot分配给Task使用。slot分为Map slotReduce slot两种,分别供MapTaskReduce Task使用。

4. 实验(之后统一完成)

参考自DataWhale学习资料

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

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

相关文章

重走前端路JS进阶篇:This 指向与箭头函数

JavaScript 高级 This 指向规则 案例 function foo() {console.log(this)}// 1 调用方式1foo();// 2 调用方式2 放入对象中调用var obj {name: "why",foo: foo}obj.foo()// 调用方式三 通过 call/apply 调用foo.call("abc")指向定义 this 是js 给函数的…

SQL零基础入门学习(十)

SQL零基础入门学习&#xff08;九&#xff09; SQL CREATE DATABASE 语句 CREATE DATABASE 语句用于创建数据库。 SQL CREATE DATABASE 语法 CREATE DATABASE dbname;SQL CREATE DATABASE 实例 下面的 SQL 语句创建一个名为 “my_db” 的数据库&#xff1a; CREATE DATAB…

内网solr全文搜索服务器,快解析一步映射让外网访问

Solr&#xff0c;指apache solr&#xff0c;其全称为Search On Lucene Replication。Solr&#xff0c;是一个高性能&#xff0c;采用java开发&#xff0c;基于Lucene的全文搜索服务器。同时对其进行了扩展&#xff0c;提供了比Lucene更为丰富的查询语言&#xff0c;同时实现了可…

算法练习-栈和队列(二)

算法练习-栈和队列(二) 文章目录算法练习-栈和队列(二)1.计算器1.1 题目1.2 题解2. 删除字符串中所有相邻重复项2.1 题目2.2 题解3 栈的压入、弹出序列3.1 题目3.2 题解4 每日温度4.1 题目4.2 题解4.2.1 暴力解法&#xff08;超出时间限制&#xff09;4.2.2单调栈5 接雨水&…

i2c子系统

i2c 硬件协议 Linux 应用层读写i2c 数据 在Linux系统上&#xff0c;不仅可以在内核中使用 i2c 总线发送、接收数据&#xff0c;同时也支持应用层使用i2c 总线发送、接收。 如果在内核中使能了drivers/i2c/i2c-dev.c 配置&#xff0c;内核就会为每一个i2c 控制器生成一个/dev/…

如何使评论具有可操作性?取悦客户的指南

永远不要低估承认的力量。 当品牌与客户互动时&#xff0c;认可会带来更好的关系和更好的沟通。与买家和客户建立更多的个人联系意味着品牌需要证明他们支持他们的产品和客户。评论是利用客户分享他们的故事的那些时刻的绝佳机会。 为什么评论在 SaaS 中至关重要 在 B2B 软件的…

robot framework + python实现http接口自动化测试框架

前言 下周即将展开一个http接口测试的需求&#xff0c;刚刚完成的java类接口测试工作中&#xff0c;由于之前犯懒&#xff0c;没有提前搭建好自动化回归测试框架&#xff0c;以至于后期rd每修改一个bug&#xff0c;经常导致之前没有问题的case又产生了bug&#xff0c;所以需要…

金仓数据库安装

一、麒麟操作系统安装金仓数据库 操作系统 DISTRIB_IDKylin DISTRIB_RELEASEV10 DISTRIB_CODENAMEjuniper 按照安装文档的步骤安装&#xff0c;记得记住设置的数据库的用户名、密码 二、window安装连接数据库的工具软件 三、jdbc连接数据库 &#xff08;1&#xff09;连接工…

分享10个非常不错的封面设计模板

封面设计很关键&#xff0c;这决定了用户是否愿意更进一步了解作品或者产品。从布局结构到文字排版和配色&#xff0c;好的封面设计一定是涉及多方面的综合加持。今天给大家整理很多优质的封面设计案例&#xff0c;可以免费商用&#xff0c;包括了&#xff1a;磨砂风格封面、玻…

nodejs+vue停车场停车位短租系统vscode

目 录前端技术&#xff1a;nodejsvueelementui 前端&#xff1a;HTML5,CSS3、JavaScript、VUE 1、 node_modules文件夹(有npn install产生) 这文件夹就是在创建完项目后&#xff0c;cd到项目目录执行npm install后生成的文件夹&#xff0c;下载了项目需要的依赖项。 2、…

LoRaWAN模块在智能停车中的应用

智能停车是指利用自动驾驶技术&#xff0c;帮助驾驶员迅速找到可使用的停车位&#xff0c;并为驾驶员提供准确的驾驶路径。智能停车系统的高级体系结构包括四大要素&#xff1a;(1)“车位锁”的驻车刹车。(2)与“车位锁”相连的一种网络关卡。(3)一个获取停车场状况并发布一个控…

设计模式—策略(Strategy)模式

一、概述策略模式的用意是针对一组算法&#xff0c;将每一个算法封装到具有共同接口的独立的类中&#xff0c;从而使得它们可以相互替换。策略模式使得算法可以在不影响到客户端的情况下发生变化使用策略模式可以把行为和环境分割开来。环境类负责维持和查询行为类&#xff0c;…

时序预测 | MATLAB实现LSTM-SVR(长短期记忆神经网络-支持向量机)时间序列预测

时序预测 | MATLAB实现LSTM-SVR(长短期记忆神经网络-支持向量机)时间序列预测 目录时序预测 | MATLAB实现LSTM-SVR(长短期记忆神经网络-支持向量机)时间序列预测效果一览基本介绍模型介绍LSTM模型SVR模型LSTM-SVR模型程序设计参考资料致谢效果一览 基本介绍 本次运行测试环境MA…

黑客入门(超级详细版)

据我了解&#xff0c;“黑客”大体上应该分为“正”、“邪”两类&#xff0c;正派黑客依靠自己掌握的知识帮助系统管理员找出系统中的漏洞并加以完善&#xff0c;而邪派黑客则是通过各种黑客技能对系统进行攻击、入侵或者做其他一些有害于网络的事情&#xff0c;因为邪派黑客所…

利用sim函数在m文件里运行Simulink模型

目录前言准备参考文章第一步第二步第三步前言 最近在使用Simulink做仿真的时候&#xff0c;需要在m文件里运行Simulink模型&#xff0c;用到了sim函数&#xff0c;记录一下 准备 MATLAB R2022a 参考文章 matlab函数sim,matlab sim函数究竟是怎么用的&#xff1f; Matlab中…

在SNAP中用sentinel-1数据制作DEM

在SNAP中用sentinel-1数据制作DEM0 SNAP 简介1 SNAP和snaphu的安装1.1 SNAP安装1.2 snaphu安装1.2.1 Windows系统安装snaphu1.2.2 Linux系统中安装snaphu2 基于InSAR技术制作DEM的基本原理3 数据下载&#xff0c;包括sentinel-1 SLC数据、参考DEM数据、精密轨道数据3.1 sentine…

LeetCode经典算法题:井字游戏+优势洗牌+Dota2参议院java解法

LeetCode经典算法题&#xff1a;井字游戏优势洗牌Dota2参议院java解法 井字游戏优势洗牌Dota2参议院1 井字游戏题目描述解题思路与代码2 优势洗牌题目描述解题思路与代码3 Dota2参议院题目描述解题思路与代码1 井字游戏 题目描述 用字符串数组作为井字游戏的游戏板 board&…

Linux 服务器CPU超高如何快速定位

前言 在生产环境中有时会遇见服务器CPU超高的问题&#xff0c;特别是重大版本发布后如果有内存泄露很容出现CPU超高&#xff0c;严重可能会达到100%。现在我们使用的服务器都是多核CPU&#xff0c;当出现CPU告警我们需要及时发现问题代码并处置&#xff0c;不然严重情况下会导致…

【阿旭机器学习实战】【36】糖尿病预测---决策树建模及其可视化

【阿旭机器学习实战】系列文章主要介绍机器学习的各种算法模型及其实战案例&#xff0c;欢迎点赞&#xff0c;关注共同学习交流。 【阿旭机器学习实战】【36】糖尿病预测—决策树建模及其可视化 目录【阿旭机器学习实战】【36】糖尿病预测---决策树建模及其可视化1. 导入数据并…

Datacom-HCIE考试经验分享

我是誉天Datacom秦同学。作为誉天众多通过Datacom-HCIE考试的学员之一&#xff0c;我感到很荣幸。 首先说说自学的感受吧&#xff1a; 我是从2020年开始接触网络行业的&#xff0c;听单位的前辈说华为的HCIE认证是行业含金量最高的证书&#xff0c;从那时起心里就种下了一个“I…