深入MapReduce——计算模型设计
引入
通过引入篇,我们可以总结,MapReduce针对海量数据计算核心痛点的解法如下:
- 统一编程模型,降低用户使用门槛
- 分而治之,利用了并行处理提高计算效率
- 移动计算,减少硬件瓶颈的限制
优秀的设计,总会借鉴使用到前人总结的精华。
在MapReduce设计中,就有很多经典的设计模式的影子:
- 责任链模式,让每个组件发挥自己的作用,串联起来完成一个完整的分布式应用程序的执行。
- 模板方法模式,在责任链的基础上,又用了模板的形式来定义数据处理的基本流程架构。
- 策略模式,在模板方法的基础上,提供灵活的具体业务实现方式。
下面我们就深入了解一下,MapReduce这个所谓的通用计算模型,到底是如何设计落地的。
MapReduce计算模型设计
首先,我们要知道,任何通用的计算模型,本质都可以划分为输入->计算->输出三个模块。既然说MapReduce是一个通用的计算模型,那我们就来看看它是怎么设计实现的。
核心设计思路
我们先从核心设计思路方面入手,MapReduce的编程模型中的核心计算模块设计很简单,正如其名,分为Map和Reduce两个部分:
- Map负责“分”,即把复杂的任务分解为若干个“简单的任务”来并行处理。可以进行拆分的前提是这些小任务可以并行计算,彼此间几乎没有依赖关系。
- Reduce负责“合”,即对map阶段的结果进行全局汇总。
可以看到,这个计算模块的设计非常简单,下面我们看下在代码层面,它是如何基于这个核心思路,去提供输入,计算,输出的能力给用户的。
编程组件设计
在代码层面,MapReduce结合了分布式场景的特殊性,针对这三个模块对外提供了5个可编程组件,分别是InputFormat、Mapper、Partitioner、Reducer和OutputFormat。
下面我们分别介绍一下:
InputFormat
- 数据读取与分片:因为MapReduce是构建在HDFS上的,那要计算的数据肯定是以一个个Block块的形式,分散存储在不同的DataNode里。InputFormat 组件负责从各种数据源读取数据,并将数据切分成合适的分片(split),从而实现在多个计算节点上并行处理。例如,在处理大规模的文本数据时,InputFormat 可以按行或按固定大小对数据进行分片,使得每个 Mapper 任务可以独立处理一个数据分片,实现数据的并行读取和处理。
- 数据格式适配:不同的数据源可能有不同的数据格式,如文本格式、二进制格式、数据库记录格式等。InputFormat 能够将各种不同格式的数据转换为 MapReduce 可以处理的键值对形式,为后续的处理提供统一的输入格式。
InputFormat主要用于描述输入数据的格式,核心就是以下两件事:
- 数据切分:按照某个策略将输入数据切分成若干个split,以便确定Map Task个数以及对应的split。
- 为Mapper提供输入数据:给定某个split,通过创建读取数据的工具(RecordReader)来将其解析成一个个 key-value 对。
这种设计有点类似工厂方法,主要有以下好处:
- 解耦数据划分和读取过程:
通过这种设计,将输入数据的划分(InputFormat的职责)和具体的数据读取(RecordReader的职责)两个过程分开。这样可以让开发者独立地修改和扩展这两个部分。
例如,如果要支持一种新的数据格式,只需要创建一个新的InputFormat子类和对应的RecordReader,而不会影响到其他部分的代码。- 提高可维护性和可扩展性:
这种设计使得MapReduce框架能够方便地支持多种输入数据格式。对于不同的数据来源和格式,只需要实现相应的InputFormat和RecordReader组合。
比如,对于数据库数据、日志文件、二进制文件等不同类型的数据,都可以通过自定义的InputFormat和RecordReader来实现数据的有效处理。- 支持数据局部性优化:
InputFormat在划分数据分片时,可以考虑数据的存储位置等因素,使得RecordReader读取数据时能够更好地利用数据局部性。
例如,将在同一物理存储位置的数据划分到一个分片,这样可以减少数据传输开销,提高MapReduce的整体性能。其中文件切分算法在v1和v2版本有所区别:
- v1:splitSize = max{minSize, min{goalSize, blockSize}}
- v2:splitSize = max{minSize, min{maxSize, blockSize}}
新版本用 maxSize 替换了 goalSize ,可以更直接地对 splitSize 的上限进行严格控制。
例如,在处理一些对单个Map任务处理数据量上限有严格要求的场景(如资源有限的小型集群或者对任务响应时间敏感的场景),能够明确设置 maxSize ,避免出现因 goalSize 计算复杂而导致输入分片过大的情况。
在InputSplit切分方案确定后,会确定每个InputSplit的元数据信息。这通常由四部分组成:<file, start, length, hosts>,分别表示InputSplit所在的文件、起始位置、长度以及所在的host(节点)列表。
其中,前三项很容易确定,难点在于host列表的选择方法。
FileInputFormat设计了一个简单有效的启发式算法,核心就是尽量选择本地节点。
其实现主要考虑以下几点:
- 性能提升。通过尽量选择本地和机架本地的节点,可以尽可能减少网络带宽带来的瓶颈,如果能走本地,更是可以完全利用本地磁盘IO,避免网络传输带来的延迟。
- 资源优化利用。考虑节点的资源状况进行host选择,可以尽可能平衡各个节点的负载,并有效提升集群的吞吐能力。
- 增强容错。尽可能的选择本地,避免网络传输,能很好的降低数据丢失风险,并提高故障恢复效率。
Mapper
- 并行数据处理:Mapper 是 MapReduce 中实现并行计算的核心组件。对于大规模的数据处理任务,将数据分片后,每个 Mapper 任务在不同的计算节点上独立地对数据分片进行处理,实现了数据的并行处理,大大提高了处理效率。例如,在进行文本数据的词频统计时,每个 Mapper 可以对自己负责的数据分片中的文本进行单词拆分和初步计数。
- 数据转换与过滤:Mapper 可以对输入数据进行各种转换和过滤操作,将原始数据转换为更适合后续处理的中间表示形式。比如,可以在 Mapper 中对数据进行清洗、格式转换、提取关键信息等操作,为后续的聚合和分析做准备。
Partitioner
- 数据分区与分发:在分布式计算中,Mapper 任务的输出需要按照一定的规则分配到不同的 Reducer 任务中进行处理。Partitioner 组件负责根据键的特征将 Mapper 的输出数据划分到不同的分区,确保具有相同或相关键的数据能够被发送到同一个 Reducer 任务中,以便进行有效的聚合和处理。例如,在对大规模用户数据按用户 ID 进行统计分析时,Partitioner 可以根据用户 ID 的哈希值将数据分配到不同的 Reducer,使得同一用户的数据能够在同一个 Reducer 中进行处理。
- 负载均衡:通过合理的分区策略,Partitioner 可以实现数据在 Reducer 任务之间的均衡分配,避免某些 Reducer 任务处理的数据量过大,而其他 Reducer 任务闲置的情况,从而充分利用集群资源,提高整个系统的性能和效率。
Partitioner的作用是对Mapper产生的中间结果进行分区,以便将同一分组的数据交给同一个Reducer处理,它直接影响Reduce阶段的负载均衡。
MapReduce提供了两个Partitioner实现:HashPartitioner和TotalOrderPartitioner。
- HashPartitioner是默认实现,它是基于哈希值的分片方法实现的。
- TotalOrderPartitioner提供了一种基于区间的分片方法,通常用在数据全排序中。
关于全排序,通常容易想到的是归并排序,主要是利用二分去提升效率,其与一些简单的排序算法如插入,冒泡,选择相比,核心就在于没有浪费比较行为。
但由于作业只能有一个ReduceTask,因而Reduce阶段会成为作业的瓶颈。为了提高全局排序的性能和扩展性, MapReduce提供了TotalOrderPartitioner。它能够按照大小将数据分成若干个区间(分片),并保证后一个区间的所有数据均大于前一个区间数据。
TotalOrderPartitioner的全排序的步骤如下:
- 数据采样。
在Client端通过采样获取分片的分割点。(Hadoop自带了几个采样算法,IntercalSampler、RandomSampler、SplitSampler等。)- Map阶段。
本阶段涉及两个组件,分别是Mapper和Partitioner。其中,Mapper可选用不同的Mapper实现类,如IdentityMapper,直接将输入数据输出,但Partitioner必须选TotalOrderPartitioner,它将步骤1中获取的分割点保存到trie树(前缀树,字典树)中以便快速定位任意一个记录所在的区间,这样,每个MapTask产生R(Reduce Task个数)个区间,且区间之间有序。- Reduce阶段。
每个Reducer对分配到的区间数据进行局部排序,最终得到全排序数据。从以上步骤可以看出,基于TotalOrderPartitioner全排序的效率跟key分布规律和采样算法有直接关系;key值分布越均匀且采样越具有代表性,则Reduce Task负载越均衡,全排序效率越高。
TotalOrderPartitioner有两个典型的应用实例:TeraSort和HBase批量数据导入。
- TeraSort是Hadoop自带的一个应用程序实例。它曾在TB级数据排序基准评估中赢得第一名,而TotalOrderPartitioner正是从该实例中提炼出来的。
- HBase是一个构建在Hadoop之上的NoSQL数据仓库。它以Region为单位划分数据,Region内部数据有序(按key排序),Region之间也有序。一个MapReduce全排序作业的R个输出文件正好可对应HBase的R个Region。
Reducer
- 数据聚合与合并:Reducer 主要用于对 Mapper 输出的经过分区和排序的数据进行聚合和合并操作。在许多分布式计算场景中,需要对数据进行汇总、统计、合并等操作,Reducer 能够将具有相同键的值进行合并和计算,得到最终的结果。如在词频统计中,Reducer 将各个 Mapper 输出的相同单词的计数进行累加,得到最终的单词出现频率。
- 复杂数据分析:对于一些需要全局视角或多轮处理的复杂数据分析任务,Reducer 可以在收到所有相关数据后进行综合处理。例如,在计算数据的平均值、中位数,或者进行数据的关联和整合等操作时,Reducer 可以根据具体的业务逻辑对数据进行进一步的分析和处理,得到最终的分析结果。
OutputFormat
- 数据存储与持久化:在 MapReduce 任务完成后,需要将最终的计算结果存储到合适的位置,以便后续的查询和使用。OutputFormat 组件负责将 Reducer 的输出数据按照指定的格式和存储方式进行存储,如将结果存储为文本文件、二进制文件、数据库表等。
- 结果格式定制:不同的应用场景可能对结果的输出格式有不同的要求,OutputFormat 允许用户根据实际需求定制输出结果的格式和内容,或者按照特定的文件结构和数据组织方式进行存储,方便与其他系统或工具进行集成和交互。
任务架构设计
用户通过借助前面MapReduce提供的编程组件,实现了业务逻辑以后,会将程序打包提交到Hadoop集群中,这里就涉及如何去调度执行任务。
如下图所示,是MRv1的架构设计(MRv2,也就是Yarn,可以看后面深入Yarn篇的内容)
我们来介绍一下里面的涉及的核心模块:
Client
用户编写的MapReduce程序通过Client提交到JobTracker端;同时,用户可通过Client提供的一些接口查看作业运行状态。
在Hadoop内部用Job(任务)表示MapReduce程序。一个MapReduce程序可对应若干个Job,而每个作业会被分解成若干个 Map/Reduce Task。
JobTracker
JobTracker主要负责资源监控和作业调度。
JobTracker监控所有TaskTracker与作业的健康状况,一旦发现失败情况后,其会将相应的任务转移到其他节点;同时,JobTracker会跟踪任务的执行进度、资源使用量等信息,并将这些信息告诉任务调度器,而调度器会在资源出现空闲时,选择合适的任务使用这些资源。
TaskTracker
TaskTracker会周期性地通过Heartbeat(心跳),将本节点上资源的使用情况和任务的运行进度汇报给JobTracker,同时接收JobTracker发送过来的命令并执行相应的操作(如启动新任务、杀死任务等)。
TaskTracker使用slot来等量划分本节点上的资源量。
slot是MapReduce针对CPU、内存等计算资源的一个抽象,它代表集群中计算节点上的一个基本资源分配单位。
其设计的核心目的,是为了控制同时运行的任务数量,并有效地管理和分配集群的计算资源,避免资源过度使用或闲置。
一个Task获取到一个slot后才有机会运行,而Hadoop调度器的作用就是将各个TaskTracker上的空闲slot分配给Task使用。slot分为Map slot和Reduce slot两种,分别供Map Task和Reduce Task使用。TaskTracker通过slot数目(可配置参数)限定Task的并发度。
Task
Task分为Map Task和Reduce Task两种,均由TaskTracker启动。
从深入HDFS篇章,我们知道HDFS会以固定大小的block为基本单位存储数据,而对于MapReduce而言,其处理单位是Split。这是一个逻辑概念,它只包含一些元数据信息,比如数据起始位置、数据长度、数据所在节点等。它的划分方法完全由用户自己决定。但需要注意的是,split的多少决定了Map Task的数目,因为每个split会交由一个Map Task处理。
任务调度流程
MapReduce任务的调度流程如下:
Job提交
- 客户端配置与提交:用户编写实现了
Mapper
和Reducer
接口的 Java 程序,设置作业的各项参数,如输入输出路径、Mapper 和 Reducer 类等。接着,客户端调用JobClient
类将作业提交给 JobTracker。 - 作业检查:在提交作业前,客户端会检查作业的输入输出路径是否合法等,同时计算输入数据的分片信息。
Job初始化
- JobTracker 接收作业:JobTracker 接收到客户端提交的作业后,为作业分配一个唯一的作业 ID,创建一个
JobInProgress
对象来跟踪该作业的执行进度。 - 资源和任务初始化:JobTracker 会将作业相关信息(如作业配置、输入分片信息等)存储在 HDFS 上,同时为作业的 Map 和 Reduce 任务分配资源。
Job分配
- Map 任务分配:JobTracker 根据输入数据的分片情况,将 Map 任务分配给 TaskTracker。一般会尽量将 Map 任务分配到存储有对应输入分片数据的节点上,以实现数据的本地化处理,减少数据传输开销。
- Reduce 任务分配:JobTracker 会根据作业配置中指定的 Reduce 任务数量,将 Reduce 任务分配给合适的 TaskTracker。Reduce 任务的分配没有数据本地化的要求。
Map 阶段
- TaskTracker 接收任务:TaskTracker 从 JobTracker 接收分配的 Map 任务后,为该任务启动一个新的 Java 进程。
- 数据读取:该 Java 进程从 HDFS 读取对应的输入分片数据,将其解析成键值对形式,作为
Mapper
的输入。 - Map 函数执行:
Mapper
对输入的键值对执行用户自定义的map
方法,生成一系列中间键值对。这些中间键值对会先被写入到内存缓冲区。 - 溢写磁盘:当内存缓冲区达到一定阈值(默认 80%)时,会触发溢写操作。在溢写过程中,数据会按照键进行分区和排序(默认使用哈希分区),并将排序后的结果写入本地磁盘。如果配置了 Combiner,还会在溢写前对相同键的值进行局部合并。
- 多次溢写合并:如果在 Map 处理过程中发生了多次溢写,最终会将这些溢写文件合并成一个大的分区且排序好的文件。
Shuffle 阶段
- 数据复制:Reduce 任务启动后,会从各个 Map 任务所在的 TaskTracker 上复制属于自己分区的数据。
- 归并排序:Reduce 任务将复制过来的数据进行归并排序,确保相同键的值相邻排列。这个过程会将来自不同 Map 任务的相同分区的数据合并在一起。
Reduce 阶段
- TaskTracker 接收并执行:TaskTracker 从 JobTracker 接收分配的 Reduce 任务后,为其启动一个新的 Java 进程。
- Reduce 函数执行:
Reducer
对排序好的数据执行用户自定义的reduce
方法,对相同键的值进行聚合处理,生成最终的输出结果。 - 结果输出:
Reducer
将处理后的结果写入到 HDFS 等指定的输出存储系统中。
Job完成清理
- 状态更新:当所有的 Map 任务和 Reduce 任务都成功完成后,JobTracker 将作业的状态标记为成功完成。
- 资源清理:JobTracker 会清理作业运行过程中产生的临时文件和其他相关资源。同时,TaskTracker 也会清理本地磁盘上的中间数据文件。
总结
今天梳理了MapReduce这个通用计算模型的总体设计落地思路,后面我们基于源码去进一步深入它是如何实现的。
相关文章:

深入MapReduce——计算模型设计
引入 通过引入篇,我们可以总结,MapReduce针对海量数据计算核心痛点的解法如下: 统一编程模型,降低用户使用门槛分而治之,利用了并行处理提高计算效率移动计算,减少硬件瓶颈的限制 优秀的设计,…...

小黑日常积累:学习了CROSS APPLY字段,将sqlserver中字段通过分隔符拆分并统计
问题 字段中的元素是通过分隔符进行拼接的,我需要统计元素的个数,例如: 代码 样例表创建 -- 创建样例表 create table #Tmp_Table (ID int IDENTITY (1,1) not null,Strs nvarchar(50),primary key (ID) ); insert into #Tmp_Table (Strs) VALUES…...

WebSocket知识点笔记(一)
WebSocket WebSocket是一种在单个TCP连接上进行全双工通信的协议。它使得客户端和服务端之间的消息传递更加高效,允许服务器主动向客户端推送数据。 一.WebSocket全双工通信 WebSocket提供了真正的双向通信,客户端和服务端可以同时发送和接收消息 …...

安宝特方案 | AR在供应链管理中的应用:提升效率与透明度
随着全球化的不断深入和市场需求的快速变化,企业对供应链管理的要求也日益提高。如何在复杂的供应链环境中提升效率、降低成本,并确保信息的透明度,成为了各大行业亟待解决的问题。而增强现实(AR)技术,特别…...

基于Springboot + vue实现的美发门店管理系统
💖学习知识需费心, 📕整理归纳更费神。 🎉源码免费人人喜, 🔥码农福利等你领! 💖常来我家多看看, 📕网址:扣棣编程, 🎉感谢支持常陪伴, 🔥点赞关注别忘记! 💖山高路远坑又深, 📕大军纵横任驰奔, 🎉谁敢横刀立马行? 🔥唯有点赞+关注成! �…...

springboot中配置logback-spring.xml
一、在src/main/resources目录下,也就是在classpath路径下创建logback-spring.xml 注:springboot框架自动配置,如果更换名称,可在配置文件指定该文件即可 <?xml version"1.0" encoding"UTF-8"?> <…...

从63 秒到 0.482 秒:深入剖析 MySQL 分页查询优化
在日常开发中,数据库查询性能问题就像潜伏的“地雷”,总在高并发或数据量庞大的场景下引爆。尤其是当你运行一条简单的分页查询时,结果却让用户苦苦等待,甚至拖垮了系统。这种情况你是否遇到过? 你可能会想࿱…...

细说机器学习算法之过拟合与欠拟合
系列文章目录 第一章:Pyhton机器学习算法之KNN 第二章:Pyhton机器学习算法之K—Means 第三章:Pyhton机器学习算法之随机森林 第四章:Pyhton机器学习算法之线性回归 第五章:Pyhton机器学习算法之有监督学习与无监督…...

C/C++ 虚函数
虚函数的定义 虚函数是指在基类内部声明的成员函数前面添加关键字 virtual 指明的函数虚函数存在的意义是为了实现多态,让派生类能够重写(override)其基类的成员函数派生类重写基类的虚函数时,可以添加 virtual 关键字,但不是必须这么做虚函…...

【3GPP】【5G】注销流程(Deregistration procedures)
1. 欢迎大家订阅和关注,精讲3GPP通信协议(2G/3G/4G/5G/IMS)知识点,专栏会持续更新中.....敬请期待! 目录 3.1.2 Deregistration procedures 3.1.2.1 UE-initiated Deregistration 3.1.2.2 Network-initiated Deregistration 3.1.2 Deregistration procedures 注销流程…...

【小游戏篇】三子棋游戏
硬控我一上午,小编还是太菜了,大家可以自行升级电脑难度,也可以升级游戏到五子棋 1.game.h #pragma once #include<stdio.h> #include<stdlib.h> #include<time.h> #define ROW 3 #define COL 3//初始化棋盘 void InitBoa…...

7-Zip Mark-of-the-Web绕过漏洞复现(CVE-2025-0411)
免责申明: 本文所描述的漏洞及其复现步骤仅供网络安全研究与教育目的使用。任何人不得将本文提供的信息用于非法目的或未经授权的系统测试。作者不对任何由于使用本文信息而导致的直接或间接损害承担责任。如涉及侵权,请及时与我们联系,我们将尽快处理并删除相关内容。 0x0…...

2025年国产化推进.NET跨平台应用框架推荐
2025年国产化推进.NET跨平台应用框架推荐 1. .NET MAUI NET MAUI是一个开源、免费(MIT License)的跨平台框架(支持Android、iOS、macOS 和 Windows多平台运行),是 Xamarin.Forms 的进化版,从移动场景扩展到…...

关于ARM和汇编语言
一图流 ARM 计算机组成 输入设备 输出设备 存储设备 运算器 控制器 处理器读取内存程序执行的过程 取指阶段:控制器器通过地址总线向存储器发送想要获取的指令的地址编号,存储器将指定的指令发送给处理器 译码阶段:控制器对指令进行分…...

2024人工智能AI+制造业应用落地研究报告汇总PDF洞察(附原数据表)
原文链接: https://tecdat.cn/?p39068 本报告合集洞察深入剖析当前技术应用的现状,关键技术 创新方向,以及行业应用的具体情况,通过制造业具体场景的典型 案例揭示人工智能如何助力制造业研发设计、生产制造、运营管理 和产品服…...

QTableView和QTableWidget的关系与区别
QTableView 和 QTableWidget 都是 Qt 框架中用于显示表格数据的控件,但它们在设计和使用上有一些重要的区别。 QTableView 模型-视图架构:QTableView 是 Qt 模型-视图架构的一部分,它与模型(如 QStandardItemModel 或自定义的 QA…...

Java导出通过Word模板导出docx文件并通过QQ邮箱发送
一、创建Word模板 {{company}}{{Date}}服务器运行情况报告一、服务器:总告警次数:{{ServerTotal}} 服务器IP:{{IPA}},总共告警次数:{{ServerATotal}} 服务器IP:{{IPB}},总共告警次数:{{ServerBTotal}} 服务器IP:{{IPC}}&#x…...

ESP8266 MQTT服务器+阿里云
MQTT私有平台搭建(EMQX 阿里云) 阿里云服务器 EMQX 搭建私有MQTT平台 1、搜索EMQX开源版本 2、查看各版本EMQX支持的UBUNTU版本 3、查看服务器Ubuntu版本 4、使用APT安装模式 5、按照官网指示安装并启动 6、下载安装MQTTX测试工具 7、设置云服务…...

css动画水球图
由于echarts水球图动画会导致ios卡顿,所以纯css模拟 展示效果 组件 <template><div class"water-box"><div class"water"><div class"progress" :style"{ --newProgress: newProgress % }"><…...

【设计模式-行为型】状态模式
一、什么是状态模式 什么是状态模式呢,这里我举一个例子来说明,在自动挡汽车中,挡位的切换是根据驾驶条件(如车速、油门踏板位置、刹车状态等)自动完成的。这种自动切换挡位的过程可以很好地用状态模式来描述。状态模式…...

2024.1.22 安全周报
政策/标准/指南最新动态 01 工信部印发《关于加强互联网数据中心客户数据安全保护的通知》 原文: https://www.secrss.com/articles/74673 互联网数据中心作为新一代信息基础设施,承载着千行百业的海量客户数据,是关系国民经济命脉的重要战略资源。…...

idea修改模块名导致程序编译出错
本文简单描述分别用Idea菜单、pom.xml文件管理项目模块module 踩过的坑: 通过idea菜单创建模块,并用idea菜单修改模块名,结构程序编译报错,出错的代码莫名奇妙。双击maven弹窗clean时,还是报错。因为模块是新建的&am…...

root用户Linux银河麒麟服务器安装vnc服务
安装必要桌面环境组件 yum install mate-session-manager -y mate-session #确定是否安装成功安装vnc服务器 yum install tigervnc-server -y切换到root为root得vnc设置密码 su root vncpasswd给root用户设置vnc服务器文件 vi /etc/systemd/system/vncserver:1.service [Un…...

CentOS 7使用RPM安装MySQL
MySQL是一个开源的关系型数据库管理系统(RDBMS),允许用户高效地存储、管理和检索数据。它被广泛用于各种应用,从小型的web应用到大型企业解决方案。 MySQL提供了丰富的功能,包括支持多个存储引擎、事务能力、数据完整…...

OpenCV imread函数读取图像__实例详解
OpenCV imread函数读取图像__实例详解 本文目录: 零、时光宝盒 一、imread函数定义 二、imread函数支持的文件格式 三、imread函数flags参数详解 (3.1)、Flags-1时,样返回加载的图像(使用alpha通道,否…...

激光线扫相机无2D图像的标定方案
方案一:基于运动控制平台的标定 适用场景:若激光线扫相机安装在可控运动平台(如机械臂、平移台、旋转台)上,且平台的运动精度已知(例如通过编码器或高精度步进电机控制)。 步骤: 标…...

【安当产品应用案例100集】034-安当KSP支持密评中存储数据的机密性和完整性
安当KSP是一套获得国密证书的专业的密钥管理系统。KSP的系统功能扩展图示如下: 我们知道商用密码应用安全性评估中,需要确保存储的数据不被篡改、删除或者破坏,必须采用合适的安全方案来确保存储数据的机密性和完整性。KSP能否满足这个需求呢…...

08.七种排序算法实现(C语言)
目录 一.排序的基本概念 1.1 排序的概念 1.2 常见的排序算法 二.常见排序算法的实现 2.1 插入排序(直接) 1.基本思想 2.直接插入排序的特性 3.代码实现 2.2 希尔排序 1.基本思想 2.希尔插入排序的特性 3.代码实现 2.3 选择排序 1.基本思想 2…...

Alibaba Spring Cloud 一 核心组件、特性
Alibaba Spring Cloud 是 Alibaba 基于 Spring Cloud 的分布式微服务解决方案,提供了一套高性能、高可靠的微服务开发和运维工具。它扩展了 Spring Cloud 的功能,并优化了许多在生产环境中的实践场景,例如服务发现、配置管理、熔断限流等。 …...

kafka学习笔记7 性能测试 —— 筑梦之路
kafka 不同的参数配置对 kafka 性能都会造成影响,通常情况下集群性能受分区、磁盘和线程等影响因素,因此需要进行性能测试,找出集群性能瓶颈和最佳参数。 # 生产者和消费者的性能测试工具 kafka-producer-perf-test.sh kafka-consumer-perf-t…...