DataWhale 大数据处理技术组队学习task4
五、分布式并行编程模型MapReduce
1. 概述
1.1 分布式并行编程
- 背景:摩尔定律已经开始逐渐失效,提升数据处理计算能力刻不容缓。
- 传统的程序开发与分布式并行编程
- 传统的程序开发:以单指令、单数据流的方式顺序执行,虽然这种方式比较符合人类的思维习惯,但是,这种程序的性能受到单台机器性能的限制,可扩展性较差。
- 分布式并行编程:分布式程序运行在大规模计算机集群上,集群中包括大量廉价服务器,可以并行执行大规模数据处理任务,从而获得海量的计算能力。
1.2 MapReduce模型简介
MapReduce将复杂的、运行于大规模集群上的并行计算过程高度抽象到了两个函数:Map和Reduce,这两个函数及其核心思想都源自函数式编程语言。
- 设计理念:“计算向数据靠拢”,而不是“数据向计算靠拢"
- 原因:数据需要大量的网络传输开销,尤其是在大规模数据环境下,这种开销尤为惊人,所以,移动计算要比移动数据更加经济
- 措施:只要有可能,一个集群中的MapReduce框架就会将Map程序就近地在HDFS数据所在的节点运行,即将计算节点和存储节点放在一起运行,从而减少了节点间的数据移动开销。
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hKEWra9S-1677247366243)(null)]](https://img-blog.csdnimg.cn/3833bfe3c4494be7942535cc7fa872d0.png)
-
架构: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任务会对中间结果进行汇总计算得到最后结果,并输出到分布式文件系统中。
- **首先会被拆分成许多个Map任务在多台机器上并行执行,**每个
- 即把一个大的数据集拆分成多个小数据块在多台机器上并行处理
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kpWtGvmz-1677247112542)(null)]](https://img-blog.csdnimg.cn/c8440d34564645cf979eef0a75bd076a.png)
- 注意:
- 不同的Map任务之间不会进行通信,不同的Reduce任务之间也不会发生任何信息交换;用户不能显式地从一台机器向另一台继机器发送消息,所有的数据交换都是通过MapReduce框架自身去实现的。(通信只会在相同的map、reduce任务之间进行)
- 在MapReduce的整个执行过程中,Map任务的输入文件、Reduce任务的处理结果都是保存在分布式文件系统中的,而Map任务处理得到的中间结果则保存在本地存储(如磁盘)中。
2.2 MapReduce的各个执行阶段
- MapReduce框架使用
InputFormat模块做Map前的预处理,比如,验证输入的格式是否符合输入定义;然后,将输入文件切分为逻辑上的多个InputSplit,InputSplit是MapReduce对文件进行处理和运算的输入单位,只是一个逻辑概念,每个InputSplit并没有对文件进行实际切割,只是记录了要处理的数据的位置和长度。 - 因为
InputSplit是逻辑切分而非物理切分,所以,还需要通过RecordReader(RR)并根据InputSplit中的信息来处理InputSplit中的具体记录,加载数据并转换为适合Map任务读取的键值对,输入给Map任务。 Map任务会根据用户自定义的映射规则,输出一系列的<key,value>作为中间结果。- 为了让
Reduce可以并行处理Map的结果,需要对Map的输出进行一定的分区、排序(Sort)、合并(Combine)和归并(Merge)等操作,得到<key,value-list>形式的中间结果,再交给对应的Reduce程序进行处理,这个过程称为Shuffle。 Reduce以一系列<key,value-list>中间结果作为输入,执行用户定义的逻辑,输出结果给OutputFormat模块。OutputFormat模块会验证输出目录是否已经存在,以及输出结果类型是否符合配置文件中的配置类型,如果都满足,就输出Reduce的结果到分布式文件系统。
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Rpny3a5b-1677247111535)(null)]](https://img-blog.csdnimg.cn/c93a49d82f4a4a0e99c514a27c2e12b7.png)
2.3 Shuffle过程详解
2.3.1 Shuffle过程简介
- 所谓
Shuffle,是指针对Map输出结果进行分区、排序和合并等处理,并交给Reduce的过程。因此,Shuffle过程分为Map端的操作和Reduce端的操作。
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-NH3Jox2B-1677247115541)(null)]](https://img-blog.csdnimg.cn/a1d6b83d46674e7f94e47d9aeaed5224.png)
-
在
Map端的Shuffle过程。Map的输出结果首先被写入缓存,当缓存满时,就启动溢写操作,把缓存中的数据写入磁盘文件,并清空缓存。当启动溢写操作时,首先需要把缓存中的数据进行分区,然后对每个分区的数据进行排序(Sort)和合并(Combine),之后再写入磁盘文件。每次溢写操作会生成一个新的磁盘文件,随着Map任务的执行,磁盘中就会生成多个溢写文件。在Map任务全部结束之前,这些溢写文件会被归并(Merge)成一个大的磁盘文件,然后,通知相应的Reduce任务来领取属于自己需要处理的数据。![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nb9nxXWO-1677247115477)(null)]](https://img-blog.csdnimg.cn/4d5597dd452f4cceb84f441d29abfe91.png)
-
在
Reduce端的Shuffle过程。Reduce任务从Map端的不同Map机器领回属于自己需要处理的那部分数据,然后,对数据进行归并(Merge)后交给Reduce处理。
2.3.2 Map端得Shuffle过程
- 输入数据和执行
Map任务
Map任务的输入数据一般保存在分布式文件系统(如GFS或HDFS)的文件块中,这些文件块的格式是任意的,可以是文档,也可以是二进制格式的。Map任务接受<key,value>作为输入后,按一定的映射规则转换成一批<key,value>进行输出。 - 写入缓存
每个Map任务都会被分配一个缓存,Map的输出结果不是立即写入磁盘,而是首先写入缓存。在缓存中积累一定数量的Map输出结果以后,再一次性批量写入磁盘,这样可以大大减少对磁盘I/O的影响。因为,磁盘包含机械部件,它是通过磁头移动和盘片的转动来寻址定位数据的,每次寻址的开销很大,如果每个Map输出结果都直接写入磁盘,会引入很多次寻址开销,而一次性批量写入,就只需要一次寻址,连续写入,大大降低了开销。需要注意的是,在写入缓存之前,key与value值都会被序列化成字节数组。 - 溢写(分区、排序和合并)
提供给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输出结果均匀地分配给这R个Reduce任务去并行处理了。当然,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任务最终的计算结果,一般而言,累加、最大值等场景可以使用合并操作。
经过分区、排序以及可能发生的合并操作之后,这些缓存中的键值对就可以被写入磁盘,并清空缓存。每次溢写操作都会在磁盘中生成一个新的溢写文件,写入溢写文件中的所有键值对,都是经过分区和排序**的。 - 文件归并
每次溢写操作都会在磁盘中生成一个新的溢写文件,随着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)]](https://img-blog.csdnimg.cn/da153f85cb8f4b5ab2d4197989fe3d1f.png)
- “领取”数据
Map端的Shuffle过程结束后,所有Map输出结果都保存在Map机器的本地磁盘上,Reduce任务需要把这些数据“领取”(Fetch)回来,存放到自己所在机器的本地磁盘上。因此,在每个Reduce任务真正开始之前,它大部分时间都在从Map端把属于自己处理那些分区的数据“领取”过来。
每个Reduce任务会不断地通过RPC(Remote Procedure Call)向JobTracker询问Map任务是否已经完成;JobTracker监测到一个Map任务完成后,就会通知相关的Reduce任务来“领取”数据;一旦一个Reduce任务收到JobTracker通知,它就会到该Map任务所在机器上把属于自己处理的分区数据领取到本地磁盘中。一般系统中会存在多个Map机器,因此,Reduce任务会使用多个线程同时从多个Map机器领回数据。 - 归并数据
从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个归并后的大文件。 - 把数据输入
Reduce任务
磁盘中经过多轮归并后得到的若干个大文件,不会继续归并成一个新的大文件,而是直接输入给Reduce任务,这样可以减少磁盘读写开销。由此,整个Shuffle过程顺利结束。接下来,Reduce任务会执行Reduce函数中定义的各种映射,输出最终结果,并保存到分布式文件系统中。
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-GXOK1cb5-1677247114510)(null)]](https://img-blog.csdnimg.cn/69008ea90f954fadb1712d8c82d2b2a2.png)
3. 以WordCount为例理解MapReduce过程
-
判断WordCount任务是否可以采用MapReduce实现。(满足前提条件:待处理的数据集可以分解成许多小的数据集,而且每一个小数据集都可以完全并行地进行处理,核心是并行处理)本例中,不同单词之间的频数不存在相关性,彼此独立,可以把不同的单词分发给不同的机器进行并行处理,因此,可以采用MapReduce来实现词频统计任务。
-
确定MapReduce程序的设计思路。本例中,把文件内容解析成许多个单词,然后把所有相同的单词聚集到一起。最后,计算出每个单词出现的次数进行输出
-
确定MapReduce程序的执行过程。把一个大文件切分成许多个分片,每个分片输入给不同机器上的Map任务,并行执行完成“从文件中解析出所有单词”的任务。
Map的输入采用Hadoop默认的<key, value>输入方式,即文件的行号作为key,文件的一行作为valueMap的输出以单词作为key,1作为value,即<单词,1>,表示单词出现了1次。 -
Map阶段完成后,会输出一系列<单词,1>这种形式的中间结果,然后,Shuffle阶段会对这些中间结果进行排序、分区,得到<key, value-list>的形式(比如<hadoop,<1,1,1,1,1>>),分发给不同的Reduce任务。Reduce任务接收到所有分配给自己的中间结果(一系列键值对)以后,就开始执行汇总计算工作,计算得到每个单词的频数并把结果输出到分布式文件系统。
3.1 WordCount实现过程
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6tMVGoqG-1677247113508)(null)]](https://img-blog.csdnimg.cn/07c35874b6fb40a98922fbebc6944fd2.png)
3.2 简易版MapReduce工作流程
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-GeqCbSSQ-1677247114491)(null)]](https://img-blog.csdnimg.cn/36bff3c415af45149193b3e738e9d9e4.png)
3.3 数据分片
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-OUaPHK98-1677247116527)(null)]](https://img-blog.csdnimg.cn/4306c5fb43f440908da925a6b915666c.png)
MapReduce的工作流程:
Inputformat的作用:加载、读取HDFS中的文件,对输入进行格式验证;将大文件切分成许多分片split,但此切分仅是逻辑上的切分,即逻辑定义每个split的起点和长度,并非真正意义的物理切分。record reader:记录阅读器,根据split的位置和长度,从HDFS中的各个块读取相关分片,读取成<k,v>的形式。
3.4 WordCount详细讲解
-
数据分片
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-oTNdfyHo-1677247109441)(null)]](https://img-blog.csdnimg.cn/77810f93cf87494e9892c96678125297.png)
-
split的map过程
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vk4PV0dY-1677247113493)(null)]](https://img-blog.csdnimg.cn/ca41de15ea8b491e96858878230eb57d.png)
-
Reduce过程
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-sWmZEYj3-1677247112488)(null)]](https://img-blog.csdnimg.cn/324265d53c1143bda22c534042cfd0e2.png)
-
WordCount的Map过程
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-NQ448ovL-1677247114457)(null)]](https://img-blog.csdnimg.cn/77c8dcd69f6345c8920be25bd980e3f5.png)
-
WordCount的Reduce过程
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-WURqNOf6-1677247115497)(null)]](https://img-blog.csdnimg.cn/df68848804c047f1a1d965328d5bac60.png)
-
Shuffle过程
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-q4PfQDwE-1677247113472)(null)]](https://img-blog.csdnimg.cn/e9766ee3b8a740ac8cf69f9aaf92f825.png)
3.5 详细版MapReduce工作流程
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2qgiFUvC-1677247117518)(null)]](https://img-blog.csdnimg.cn/9529e777e5e64753b302a0875904c62e.png)
3.6 MapReduce的体系结构
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-PmMf8Nw8-1677247114535)(null)]](https://img-blog.csdnimg.cn/21160d32896944ac8f0b99f06a8b9193.png)
-
Client(客户端)
-
主要功能:负责提交作业,查看作业状态
-
提交作业:用户编写的MapReduce程序通过
Client提交到JobTracker端。 -
查看作业状态:用户可通过
Client提供的一些接口查看作业运行状态。
-
-
JobTracker(作业跟踪器)
-
主要功能:负责资源监控、作业调度
-
资源监控:
JobTracker监控所有TaskTracker与Job的健康状况,一旦发现节点失效(通信失败或节点故障),就将相应的任务转移到其他节点。 -
作业调度:
JobTracker会跟踪任务的执行进度、资源使用量等信息,并将这些信息告诉任务调度器(TaskScheduler),而任务调度器会选择合适的(比较空闲)节点资源来执行任务。
-
-
TaskScheduler(任务调度器)
-
执行具体的相关任务,一般接收
JobTracker发送过来的命令。 -
把一些自己的资源使用情况,以及任务的运行进度通过心跳的方式,也就是
heartbeat发送给JobTracker。
-
-
TaskTracker(任务跟踪器)
-
TaskTracker会周期性地通过“心跳”,将本节点上资源的使用情况和任务的运行进度汇报给JobTracker,同时接收JobTracker发送过来的命令,并执行相应的操作(如启动新任务、杀死任务等)。 -
TaskTracker使用slot等量划分本节点上的资源量(CPU、内存等)。一个Task获取到一个slot后才有机会运行,而Hadoop调度器(TaskScheduler)的作用就是将各个TaskTracker上的空闲slot分配给Task使用。slot分为Map slot和Reduce slot两种,分别供MapTask和Reduce Task使用。
-
4. 实验(之后统一完成)
参考自DataWhale学习资料
相关文章:
DataWhale 大数据处理技术组队学习task4
五、分布式并行编程模型MapReduce 1. 概述 1.1 分布式并行编程 背景:摩尔定律已经开始逐渐失效,提升数据处理计算能力刻不容缓。传统的程序开发与分布式并行编程 传统的程序开发:以单指令、单数据流的方式顺序执行,虽然这种方式…...
Oracle 12C以上统计信息收集CDB、PDB执行时间不一致问题
文章目录前言一、统计信息窗口期调查二、时区调查三、查询alert记录四、why Database Statistic Collection Job is running two times inside a Maintenance Window?五、Default Scheduler Timezone Value In PDB$SEED Different Than CDB六、总结前言 在实际工作中发现一个…...
用Python获取弹幕的两种方式(一种简单但量少,另一量大管饱)
前言 弹幕可以给观众一种“实时互动”的错觉,虽然不同弹幕的发送时间有所区别,但是其只会在视频中特定的一个时间点出现,因此在相同时刻发送的弹幕基本上也具有相同的主题,在参与评论时就会有与其他观众同时评论的错觉。 在国内…...
算法训练营 day55 动态规划 买卖股票问题系列3
算法训练营 day55 动态规划 买卖股票问题系列3 最佳买卖股票时机含冷冻期 309. 最佳买卖股票时机含冷冻期 - 力扣(LeetCode) 给定一个整数数组prices,其中第 prices[i] 表示第 i 天的股票价格 。 设计一个算法计算出最大利润。在满足以下…...
电商共享购模式,消费增值返利,app开发
在当今以市场需求为主导的数字经济时代,消费者需求呈现出精细化管理和多元化的特性,目标市场日渐完善,另外在大数据技术迅速进步和运用的驱动下,总体行业的发展节奏感也在不断加速。因而,企业需要建立一套灵活多变的经…...
机房信息牌系统
产品特色: 无线低功耗安装简单,快速布置易于维护墨水屏显示,清晰,更环保信息后台推送,远程管理多模版样式随意制作多尺寸:4.2寸,7.5寸,10.2寸4.2寸7.5寸10.2寸标签特性:…...
金测评 手感更细腻的游戏手柄,双模加持兼容更出色,雷柏V600S上手
很多朋友周末都喜欢玩玩游戏放松一下,在家玩游戏的时候,PC是大家常用的平台,当然了,玩游戏的时候用键鼠的话,手感难免差点意思,还是要手柄才能获得更好的体验。我现在用的是雷柏V600S,这是一款支…...
Windows10 下测试 Intel SGX 功能
文章目录参考文献系统要求一、安装Open Enclave SDK 环境(一)什么是Open Enclave SDK(二)启动SGX功能方法一: BIOS启动方法二:软件方式启动(三)安装必要环境(1࿰…...
Tina_Linux_功耗管理_开发指南
Tina Linux 功耗管理开发指南 1 概述 1.1 编写目的 简要介绍tina 平台功耗管理机制,为关注功耗的开发者,维护者和测试者提供使用和配置参考。 1.2 适用范围 表1-1: 适用产品列表产品名称内核版本休眠类型参与功耗管理的协处理器R328Linux-4.9NormalS…...
golang编译dll失败问题解决
执行go build -buildmodec-shared -o exportgo.dll exportgo.go报类似如下错误/usr/lib/gcc/x86_64-pc-msys/9.1.0/../../../../x86_64-pc-msys/bin/ld: 找不到 -lmingwex/usr/lib/gcc/x86_64-pc-msys/9.1.0/../../../../x86_64-pc-msys/bin/ld: 找不到 -lmingw32安装tdm gcc m…...
Convolutional Neural Networks for Sentence Classification
摘要 We report on a series of experiments with convolutional neural networks (CNN) trained on top of pre-trained word vectors for sentence-level classification tasks. We show that a simple CNN with little hyperparameter tuning and static vectors achieves e…...
基于SpringBoot的共享汽车管理系统
文末获取源码 开发语言:Java 框架:springboot JDK版本:JDK1.8 服务器:tomcat7 数据库:mysql 5.7/8.0 数据库工具:Navicat11 开发软件:eclipse/myeclipse/idea Maven包:Maven3.3.9 浏…...
TCP三次握手
参考:4.1 TCP 三次握手与四次挥手面试题 | 小林coding TCP 头格式 我们先来看看 TCP 头的格式,标注颜色的表示与本文关联比较大的字段,其他字段不做详细阐述。 序列号:在建立连接时由计算机生成的随机数作为其初始值,…...
未来土地利用模拟FLUS模型
未来土地利用模拟(FutureLand-Use Simulation, FLUS)模型1 模型简介1.1 基于ANN 的适宜性概率计算1.2 基于自适应惯性机制的元胞自动机1.3 模拟精度评价参考流域 径流变化是 自然因素和 人为因素共同作用的结果,其中人为因素最为直接的方式就…...
压力传感器MPX5700D/MPX5700GP/MPX5700AP产品概述、特征
MPX5700系列压阻式换能器是最先进的单片硅压力传感器,可广泛用于各种应用,特别是采用A/D输入微控制器或微处理器的应用。这一获得专利的单元件传感器集合了高级微加工技术、薄膜金属化、双极工艺,能够提供精确的、与所施加压力成正比的高电平…...
taobao.trades.sold.query( 根据收件人信息查询交易单号 )
¥开放平台免费API必须用户授权聚石塔内调用 根据收件人信息查询交易单号。 公共参数 请求地址: HTTP地址 公共请求参数: 公共响应参数: 请求参数 请求示例 TaobaoClient client new DefaultTaobaoClient(url, appkey, secret); TradesSoldQueryRequest req new…...
【JavaWeb】JSON、AJAX(305-317)
305.JSON-什么是JSON JSON (JavaScript Object Notation) 是一种轻量级的数据交换格式。易于人阅读和编写。同时也易于机器解析和生成。JSON 采用完全独立于语言的文本格式,而且很多语言都提供了对 json 的支持(包括 C, C, C#, Java, JavaScript, Perl,…...
AI入场,搜索这个“营销枢纽”有新故事吗?
哪里有内容,哪里就有搜索。 以前,互联网离我们生活很远,传统搜索与用户的距离分割,只有当用户想要了解什么,才会去使用。 如今,互联网与真实世界密不可分,加之新技术、新平台的不断涌现…...
字节在职5年,一个测试工程师的坎坷之路
几年前进入到IT行业,现在发现学习软件测试的人越来越多,今天我想根据自己的行业经验给大家提一些建议。 跟其他行业相比,做软件测试的岗位确实算是高薪职业,我们那个时候起步的工资并不高,而看现在很多毕业的学生薪资都…...
什么是web框架?
什么是web框架? 我们解释一个概念的时候,通常会用到其他更多的概念去解释它,如果听的人不理解解释它的概念,那么这个解释是失败的,因此首先要回答一下解释web框架中所用到的概念。 回答这个问题前,首先需…...
手游刚开服就被攻击怎么办?如何防御DDoS?
开服初期是手游最脆弱的阶段,极易成为DDoS攻击的目标。一旦遭遇攻击,可能导致服务器瘫痪、玩家流失,甚至造成巨大经济损失。本文为开发者提供一套简洁有效的应急与防御方案,帮助快速应对并构建长期防护体系。 一、遭遇攻击的紧急应…...
智慧医疗能源事业线深度画像分析(上)
引言 医疗行业作为现代社会的关键基础设施,其能源消耗与环境影响正日益受到关注。随着全球"双碳"目标的推进和可持续发展理念的深入,智慧医疗能源事业线应运而生,致力于通过创新技术与管理方案,重构医疗领域的能源使用模式。这一事业线融合了能源管理、可持续发…...
Objective-C常用命名规范总结
【OC】常用命名规范总结 文章目录 【OC】常用命名规范总结1.类名(Class Name)2.协议名(Protocol Name)3.方法名(Method Name)4.属性名(Property Name)5.局部变量/实例变量(Local / Instance Variables&…...
基于Uniapp开发HarmonyOS 5.0旅游应用技术实践
一、技术选型背景 1.跨平台优势 Uniapp采用Vue.js框架,支持"一次开发,多端部署",可同步生成HarmonyOS、iOS、Android等多平台应用。 2.鸿蒙特性融合 HarmonyOS 5.0的分布式能力与原子化服务,为旅游应用带来…...
【SQL学习笔记1】增删改查+多表连接全解析(内附SQL免费在线练习工具)
可以使用Sqliteviz这个网站免费编写sql语句,它能够让用户直接在浏览器内练习SQL的语法,不需要安装任何软件。 链接如下: sqliteviz 注意: 在转写SQL语法时,关键字之间有一个特定的顺序,这个顺序会影响到…...
C++八股 —— 单例模式
文章目录 1. 基本概念2. 设计要点3. 实现方式4. 详解懒汉模式 1. 基本概念 线程安全(Thread Safety) 线程安全是指在多线程环境下,某个函数、类或代码片段能够被多个线程同时调用时,仍能保证数据的一致性和逻辑的正确性…...
Spring数据访问模块设计
前面我们已经完成了IoC和web模块的设计,聪明的码友立马就知道了,该到数据访问模块了,要不就这俩玩个6啊,查库势在必行,至此,它来了。 一、核心设计理念 1、痛点在哪 应用离不开数据(数据库、No…...
学习STC51单片机32(芯片为STC89C52RCRC)OLED显示屏2
每日一言 今天的每一份坚持,都是在为未来积攒底气。 案例:OLED显示一个A 这边观察到一个点,怎么雪花了就是都是乱七八糟的占满了屏幕。。 解释 : 如果代码里信号切换太快(比如 SDA 刚变,SCL 立刻变&#…...
DeepSeek 技术赋能无人农场协同作业:用 AI 重构农田管理 “神经网”
目录 一、引言二、DeepSeek 技术大揭秘2.1 核心架构解析2.2 关键技术剖析 三、智能农业无人农场协同作业现状3.1 发展现状概述3.2 协同作业模式介绍 四、DeepSeek 的 “农场奇妙游”4.1 数据处理与分析4.2 作物生长监测与预测4.3 病虫害防治4.4 农机协同作业调度 五、实际案例大…...
在QWebEngineView上实现鼠标、触摸等事件捕获的解决方案
这个问题我看其他博主也写了,要么要会员、要么写的乱七八糟。这里我整理一下,把问题说清楚并且给出代码,拿去用就行,照着葫芦画瓢。 问题 在继承QWebEngineView后,重写mousePressEvent或event函数无法捕获鼠标按下事…...
