发布时间:2026/7/28 15:40:30
底层、推理、联想思维之应用(使用map reduce实现大规模kmeans聚类) 之前小组的同事说了一道题目怎么高效的使用map-reduce完成kmeans聚类。我想了一些时间想出了最高效最简洁的完成方法。本篇文章我想把我的思路阐述清楚更为关键的是我想说清楚我是怎么运用底层思维、推理思维及联想思维想到最终方案的。第一步因为涉及到kmeans聚类我首先要做的是复习熟悉kmeans聚类算法。在这个过程中我了解到kmeans算法的迭代过程是这样的。a.先随机选取(或者更有策略地选取因为不是本篇文章的重点所以我们就采用随机选取吧)K个质心。b.对每条数据分别计算其距离K个质心的距离然后把距离最近的那个质心当做它的类别。c.因为b使得每条数据产出了它的类别在这里将每个类别的数据聚合在一起计算新的质心。d.不断迭代b和c直到终止条件。在这里我们使用的终止条件是所有数据距离他们所属质心的距离加和改变幅度在一个比较小的数值。第二步了解map reduce的各个细节。比如map task内部的细节、reduce task的细节shuffle阶段干了什么combiner阶段干了什么多路输出是什么。第三步了解了kmeans聚类算法和map reduce的各个细节。我们现在构思怎么使用我们手里拿到的砖块实现一栋楼房。首先对于第一步中的a和b我们可以想到在map task中加载质心文件然后对map task中的每个数据计算其距离K个质心的距离输出其类别是可以做到的。其次我们考虑如何实现c(注意为了不让大脑思考的东西一下子过于复杂我对算法的实现进行了细分也就是说在思考方案的时候我们每次只在大脑里考虑实现方案的一部分而不是想着一下子把整个算法完美无缺的实现出来一开始太过追求完美会让你的大脑沉迷于各种琐碎的细节中而失去了宏观的把控和思考你应该先从宏观进行把控然后再完善细节。我管这个过程叫做宏观思考任务拆解和细分、不完美后续迭代优化)。在首先中我们需要输出每个数据所对应的类别那么一下子可以想到的是把类别做为key然后同类别的数据会进入到同一个reduce里面然后在reduce里面计算每个key(类别)的新质心。这个思路是最直观也是最容易想到的。但是其有一个很坏的缺点。就是当你的k很小的时候比如3这个时候大量的数据会shuffle到3个reduce里面。你的reduce很可能会爆炸(k很小导致实际被使用的reduce也很少即便你的reduce num设置得很大)。那么还有没有更好的解决方案可以避免大量的数据shuffle到reduce中去呢注意这些数据的格式是数据类别_数据这样的格式的。这就涉及到对map reduce各个模块和细节的熟悉程度了。然后我们就赶快想啊我们把上述格式的数据shuffle到reduce中是为了计算新的质心而我们还不想让这些数据进行shuffle那么在map端可否进行新质心的计算呢或者是完成一部分的新质心计算工作呢我们联想到combiner正是在map端的reduce我们想到在map端combiner出现在两个地方一个地方是sortcombiner以让内存缓冲区中的数据先排序然后combiner以减小写入磁盘数据的大小。另外一个地方是merge过程在这个过程中多个spill文件会归并成一个大文件combiner会缩小数据规模以减小shuffle数据的大小。而在combiner过程中我们可以计算同类别数据他们的加和(这里我们把每条数据的形式当做一个向量这里的加和指的是向量求和)只要我们把有多少同类别数据进行加和也保留下来我们就能得到每个map task同类别数据他们的加和以及有多少同类别数据进行加和那么我们的方案就来了。在map端对同类别数据进行combine输出 类别 \t 同类别数据加和 \t 同类别数据的数目。然后这部分数据是很小的完全可以shuffle到reduce中去而每个数据所属类别这样的信息我们也要输出。对于我们来说要计算新质心前面的信息已经足够了后面的信息完全没有必要shuffle到reduce中去。所以我们的技术方案是每个数据及其类别信息就地输出(map端输出)而类别 \t 同类别数据加和 \t 同类别数据的数目这样的信息shuffle到reduce中以计算新的质心。然而然而map reduce框架并不支持这样的玩法(map的输出有一部分输出在map端就地输出有一部分shuffle到reduce)。那么退而求其次考虑到我们在这里需要reduce处理的数据已经很小了那么reduce完成的功能我们完全可以使用hadoop fs -get 把质心信息弄到本地再在本地进行计算。所以最终的方案是不使用reduce只使用map。在map端使用多路输出一路输出是每个map task输出的质心信息一路输出是每条数据所属的类别信息。第四步现在我们考虑终止条件怎么计算。实际上当完成第三步以后这个计算的构思就变得简单了。我们可以在第二步的时候计算每条数据距离它所属质心的距离然后在第三步的combiner中合并同类别数据距离质心之和。在map端同样输出到另外一路在之后我们只需要使用hadoop fs -get然后离线就可以计算得到终止条件所要求的那个数值。

相关新闻

2026/7/28 15:40:30

Linux中iptables设置详细

无论如何,iptables是一个需要特别谨慎设置的东西,万一服务器不在你身边,而你贸然设置导致无法SSH,那就等着被老板骂吧,呵呵。。。1.首先介绍一下指令和相关配置文件 启动指令:service iptables start 重启指令:serv…

2026/7/28 15:40:30

高等数学笔记 C8-9

八、线性代数 - 向量向量:n个独立的对象,线性。向量a-> xiyjzk有方向,有长度,叫做矢量。区别于标量。维数相同的才能加减法,平行四边形法则。向量的数量积(内积、点积),变成了一…

2026/7/28 16:41:06

基于掌控板与超声波传感器的智能避障小车项目实践

1. 项目概述:当一只瓢虫被困在“数字牢笼”里最近在Labplus3和掌控板的社区里,看到一个挺有意思的项目,叫“一只瓢虫的困惑——画地为牢”。光看标题,你可能会觉得这像是个哲学寓言或者艺术装置。但对我们这些搞硬件编程和互动设计…

2026/7/28 16:41:06

Serverless安全实战:从TAR依赖漏洞到10步纵深防御体系构建

1. 项目概述:一次真实的Serverless安全危机复盘 上周三凌晨,我被一阵急促的告警电话惊醒。监控显示,我们一个核心的Serverless函数突然出现大量异常调用,CPU使用率飙升至100%,日志里充斥着奇怪的路径遍历错误。经过紧急…

2026/7/28 16:41:06

使用Spring实现权限控制动态为注解赋值

首先这不是一个介绍或者使用SpringSecurity的博客。他是使用自定义注解和拦截器实现的权限管理(只供学习不可用于生产环境) 技术栈: SpringBoot 2.1.6 MySQL5.7 大体思路: 使用拦截器拦截请求,在拦截器中使用 HandlerMethod 类获取当前请求方法上的自定义权限注解。…

2026/7/28 16:41:06

SpringBoot+Vue构建问卷调查系统的技术实践

1. 项目概述这个基于SpringBootVueMySQL的问卷调查系统是一个典型的毕业设计项目,它完整实现了问卷创建、发布、填写和统计分析的闭环流程。作为前后端分离架构的实践案例,它既包含了基础CRUD功能,又涉及了数据可视化、权限控制等进阶特性&am…

2026/7/28 16:41:06

PAT甲级 1060 Are They Equal 判断两个小数是否相等

Solution: 题目要求:给出两个非负的小数,且都不超过10的100次方。再给出一个有效位数,将这两个小数都转化为科学计数法的形式,即0.d[1]…d[N]*10^k (d[1]>0 除非这个数是0),若转化后的两数相等&#xff…

2026/7/28 16:36:06

环境变量的概念及设置的意义

首先,需要了解什么是环境变量? 环境变量(environment variables)一般是指在操作系统中用来指定操作系统运行环境的一些参数。在Windows和DOS操作系统中的path环境变量,当要求系统运行一个程序而没有告诉它程序所在的完…

2026/7/28 13:41:25

PDF合并与动态水印的工程化方案:2026国内免费工具实测对比

一、背景与测试方案 在实际项目交付中,PDF文件合并与版权保护水印的叠加是一个高频但容易被低估的技术需求。典型的处理链路涉及:多源PDF的文件流合并、页面级水印渲染(含透明度混合与图层叠加)、输出文件体积控制。看似简单的操作…

2026/7/28 0:03:34

学术论文研究创新点梳理与核心价值提炼指南

本科毕业论文是大学四年最大的坎。开题报告憋一周写不出三页,找文献翻遍十几个网站还是缺关键资料,写正文卡壳半天憋不出一句话,降重改到凌晨三点结果逻辑全乱,答辩前一天PPT还没做完。别慌,亲测这四个工具能让你少熬半…

2026/7/28 0:03:34

开发商售楼处数字化升级怎么做?

房企的数字化转型投入正在快速增长,据行业数据显示,2025年房企数字化投入规模已突破800亿元,年复合增长率达35%。售楼处的数字化升级不是单一环节的改造,而是从“获客-展示-成交-服务”全链路的系统升级。数字化升级四步法第一步&…

2026/7/28 0:03:34

模型不再值钱之后,AI 编程工具在争什么

2026 年 7 月,AI 编程工具赛道发生了一个标志性转折:模型本身不再值钱了。当 Kimi K3 开源模型在编程基准上击败 GPT 和 Claude,当 GitHub Copilot 第一次把开源模型纳入选择器,当 OpenAI 把 Codex 并入 ChatGPT 做成三合一超级应…

2026/7/28 4:38:09

3个高效策略:快速掌握Axure中文界面配置

3个高效策略:快速掌握Axure中文界面配置 【免费下载链接】axure-cn Chinese language file for Axure RP. Axure RP 简体中文语言包。支持 Axure 11、10、9。不定期更新。 项目地址: https://gitcode.com/gh_mirrors/ax/axure-cn 还在为Axure RP的英文界面感…