巧用MapReduce+HDFS,海量数据去重的五大策略

本文介绍了几种使用Hadoop生态系统中的工具和技术实现数据去重的方法,包括仅使用HDFS和MapReduce、结合Hbase、利用存储控制器等不同场景下的策略。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


摘要:随着收集到数据体积的激增,去重无疑成为众多大数据玩家面对的问题之一。重复数据删除在减少存储、降低网络带宽方面有着显著的优势,并对扩展性有所帮助。在存储架构中,删除重复数据的常用方法包括哈希、二进制比较和增量差分;而本文专注的是使用MapReduce和HDFS对数据进行去重。

随着存储数据信息量的飞速增长,越来越多的人开始关注存储数据的缩减方法。数据压缩、单实例存储和重复数据删除等都是经常使用的存储数据缩减技术。

重复数据删除往往是指消除冗余子文件。不同于压缩,重复数据删除对于数据本身并没有改变,只是消除了相同的数据占用的存储容量。重复数据删除在减少存储、降低网络带宽方面有着显著的优势,并对扩展性有所帮助。

举个简单的例子:在专门为电信运营商定制的呼叫详单去重应用程序中,我们就可以看到删除重复数据的影子。同样的,对于包含相同数据包的通信网络,我们可以使用这种技术来进行优化。

在存储架构中,删除重复数据的一些常用的方法包括:哈希、二进制比较和增量差分。在HadoopSphere这篇文章中,将专注于如何利用MapReduce和HDFS来消除重复的数据。(下面列出的方法中包括一些学者的实验方法,因此把术语定义为策略比较合适)。

策略1:只使用HDFS和MapReduce

Owen O’Malley在一个论坛的帖子中建议使用以下方法:

让你的历史数据按照MD5值进行排序。运行一个MapReduce的作业,将你的新数据按照MD5进行排序。需要注意的是:你要做所有数据的整体排序,但因为MD5是在整个密钥空间中是均匀分布的,排序就变得很容易。
基本上,你挑选一个reduce作业的数量(如256),然后取MD5值的前N位数据来进行你的reduce作业。由于这项作业只处理你的新数据,这是非常快的。接下来你需要进行一个map-side join,每一个合并的输入分块都包含一个MD5值的范围。RecordReader读取历史的和新的数据集,并将它们按照一定方式合并。(你可以使用map-side join库)。你的map将新数据和旧数据合并。这里仅仅是一个map作业,所以这也非常快。 
 当然,如果新的数据足够小,你可以在每一个map作业中将其读入,并且保持新记录(在RAM中做了排序)在合适的数量范围内,这样就可以在RAM中执行合并。这可以让你避免为新数据进行排序的步骤。类似于这种合并的优化,正是Pig和Hive中对开发人员隐藏的大量细节部分。

策略2:使用HDFS和Hbase

在一篇名为“工程云系统中一种新颖的删除重复数据技术”的论文中,Zhe Sun, Jun Shen, Jianming Young共同提出了一种使用HDFS和Hbase的方法,内容如下:

  • 使用MD5和SHA-1哈希函数计算文件的哈希值,然后将值传递给Hbase
  • 将新的哈希值与现有的值域比较,如果新值已经存在于Hbase去重复表中,HDFS会检查链接的数量,如果数量不为零时,哈希值对应的计数器将增加1。如果数量是零或哈希值在之前的去重复表中不存在,HDFS会要求客户端上传文件并更新文件的逻辑路径。
  • HDFS将存储由用户上传的源文件,以及相应的链接文件,这些链接文件是自动生成的。链接文件中记录了源文件的哈希值和源文件的逻辑路径。

要注意使用这种方法中的一些关键点

  • 文件级的重复数据删除需要保持索引数量尽可能小,这样可以有高效的查找效率。
  • MD5和SHA-1需要结合使用从而避免偶发性的碰撞。

策略3:使用HDFS,MapReduce和存储控制器


由Netapp的工程师AshishKathpal、GauravMakkar以及Mathew John三人联合,在一篇名为“在后期处理重复数据删除的分布式重复检测方式”的文章中,提出通过使用HadoopMapReduce的重复检测机制来替代Netapp原有的重复检测环节,文中提到的基于重复检测的Hadoop工作流包含如下几个环节:

  • 将数据指纹(Fingerprint)由存储控制器迁移到HDFS
  • 生成数据指纹数据库,并在HDFS上永久存储该数据库
  • 使用MapReduce从数据指纹记录集中筛选出重复记录,并将去重复后的数据指纹表保存回存储控制器。
数据指纹是指存储系统中文件块经过计算后的哈希索引,通常来说数据指纹要比它代表的数据块体积小的多,这样就可以减少分布式检测时网络中的数据传输量。

策略4:使用Streaming,HDFS,MapReduce

对于Hadoop和Streaming的应用集成,基本上包含两种可能的场景。以IBM Infosphere Streams和BigInsights集成为例,场景应该是:

1. Streams到Hadoop的流程:通过控制流程,将Hadoop MapReduce模块作为数据流分析的一部分,对于Streams的操作需要对更新的数据进行检查并去重,并可以验证MapReduce模型的正确性。    

众所周知,在数据摄入的时候对数据进行去重复是最有效的,因此在Infosphere Streams中对于某个特定时间段或者数量的记录会进行去重复,或者识别出记录的增量部分。接着,经过去重的数据将会发送给Hadoop BigInsights用于新模型的建立。


2. Hadoop到Streams的流程:在这种方式中,Hadoop MapReduce用于移除历史数据中的重复数据,之后MapReduce模型将会更新。MapReduce模型作为Streams中的一部分被集成,针对mid-stream配置一个操作符(operator),从而对传入的数据进行处理。

策略5:结合块技术使用MapReduce

在莱比锡大学开发的一个原型工具Dedoop(Deduplication with Hadoop)中,MapReduce应用于大数据中的实体解析处理,到目前为止,这个工具囊括了MapReduce在重复数据删除技术中最为成熟的应用方式。


基于实体匹配的分块是指将输入数据按照类似的数据进行语义分块,并且对于相同块的实体进行限定。

实体解析处理分成两个MapReduce作业:分析作业主要用于统计记录出现频率,匹配作业用于处理负载均衡以及近似度计算。另外,匹配作业采用“贪婪模式”的负载均衡调控,也就是说匹配任务按照任务处理数据大小的降序排列,并做出最小负载的Reduce作业分配。

Dedoop还采用了有效的技术来避免多余的配对比较。它要求MR程序必须明确定义出哪个Reduce任务在处理哪个配对比较,这样就无需在多个节点上进行相同的配对比较。

原文链接: Data deduplication tactics with HDFS and MapReduce (编译/兴宝 审校/仲浩)

<think>好的,用户现在要详细了解MapReduce,之前他们问过Hadoop的存储流程,所以我需要先回顾一下之前的回答,看看有没有可以衔接的地方。用户可能对Hadoop生态系统有一定了解,现在想深入计算框架的部分。 首先,用户的需求是“详细说明”MapReduce,所以我需要覆盖它的定义、工作原理、各个阶段、优缺点以及应用场景。可能需要用类比来帮助理解,比如之前用物流来类比HDFS存储,这次或许可以用分工作业的例子。 要确定用户是谁,可能是学生、开发人员或者刚接触大数据的人。他们可能在学习Hadoop,需要理解MapReduce的基本概念和处理流程。深层需求可能包括实际应用例子或者如何优化MapReduce作业。 接下来需要结构化回答。先介绍MapReduce是什么,核心思想,然后分阶段说明Map和Reduce,以及Shuffle和Sort。用步骤拆解的方式,加上示例代码或流程图,可能更容易理解。再讲优缺点,帮助用户全面了解适用场景,最后给出应用案例,比如词频统计,这样用户能联想到实际用途。 要注意避免太技术化的术语,但又要足够详细。可能需要检查是否有必要提及YARN资源管理,或者保持专注在MapReduce本身。之前的回答用了表格和代码块,这次也可以沿用类似的结构,保持一致性。 另外,用户可能想知道MapReduceHDFS的关系,但问题集中在MapReduce,所以需要明确说明它是计算框架,而HDFS是存储,两者结合使用。同时,是否需要比较其他框架如Spark?可能不需要,除非用户问,但这里应该专注于详细说明MapReduce本身。 最后,总结部分要强调MapReduce的适用场景,比如批量处理、海量数据,以及它的局限性,比如不适合实时处理。这样用户能清楚何时使用MapReduce,何时选择其他工具。 需要验证是否有遗漏的关键点,比如容错机制、任务调度等,这些在详细说明中应该提到,比如任务失败试、推测执行等。确保技术细节准确,比如分片大小、默认排序方式等。 现在组织内容,确保逻辑清晰,从概述到流程,再到优缺点和应用,最后示例。保持语言简洁,使用用户容易理解的例子,比如词频统计,这样即使非技术人员也能大致明白过程。</think>以下是MapReduce的**全景解析**,通过工厂流水线类比揭示分布式计算的奥秘: --- ### 一、核心概念定位(自动化工厂模型) | 概念 | 作用 | 工厂类比 | 技术特征 | |-----------------|------------------------------|---------------------|---------------------| | **Job** | 完整计算任务 | 产品生产订单 | 包含多个MapReduce阶段 | | **Task** | 单个计算单元 | 车间流水线工位 | 分为MapTask/ReduceTask | | **InputSplit** | 输入数据分片 | 原料分配单元 | 默认128MB(HDFS块大小) | | **Partitioner** | 数据路由分配器 | 物流分拣系统 | 默认Hash分区 | --- ### 二、五阶处理流程(从原料到成品) #### 阶段1:数据分片 (原料切割) - 将10GB日志文件切分为 **80个分片**(10*1024/128=80) - 每个分片启动一个Map任务 - *类似:将整块钢板切割成标准尺寸的毛坯* #### 阶段2:Map阶段 (零件加工) ```java // Mapper处理逻辑示例(词频统计) public void map(LongWritable key, Text value, Context context) { String[] words = value.toString().split(" "); for (String word : words) { context.write(new Text(word), new IntWritable(1)); // 输出<单词,1> } } ``` - **并行处理**:80个MapTask同时处理不同分片 - **内存缓冲区**:默认100MB环形缓冲区(spill阈值80%) #### 阶段3:Shuffle阶段 (部件运输) | 操作步骤 | 技术细节 | 性能影响 | |------------------|------------------------------|--------------------| | 分区排序 | 根据Key的Hash值分配到Reduce | 影响负载均衡 | | 溢写(Spill) | 缓冲区数据写入磁盘临时文件 | 触发频率与内存相关 | | 合并(Merge) | 多个溢写文件归并为有序大文件 | 减少磁盘IO | #### 阶段4:Reduce阶段 (总装车间) ```java // Reducer聚合逻辑示例 public void reduce(Text key, Iterable<IntWritable> values, Context context) { int sum = 0; for (IntWritable val : values) { sum += val.get(); } context.write(key, new IntWritable(sum)); // 输出<单词,总次数> } ``` - **数据拉取**:每个ReduceTask从所有MapTask获取对应分区的数据 - **二次排序**:相同Key的数据保证送到同一个Reducer #### 阶段5:结果输出 (成品入库) - 写入HDFS时默认生成**_SUCCESS**标记文件 - 输出目录自动分区(part-r-00000等) - *类似:将成品分类存入不同仓库货架* --- ### 三、容错机制设计(工厂应急系统) **故障类型1:Task失败** - 自动试(默认4次试) - 超过试次数标记Job失败 **故障类型2:NodeManager宕机** - ResourceManager在5分钟内未收到心跳则新调度任务 **故障类型3:数据倾斜** - 启用**Combiner**提前局部聚合(类似车间预装配) ```java // Combiner实现(与Reducer逻辑相同) job.setCombinerClass(IntSumReducer.class); ``` --- ### 四、性能优化策略(提升产能方案) 1. **推测执行(Speculative Execution)** - 对落后任务启动备份执行(默认开启) - 防止木桶效应(单个慢任务拖累整体) 2. **JVM复用** - 每个TaskTracker最多同时运行8个Task - 相同Job的任务共享JVM(减少启动开销) 3. **压缩优化** | 压缩位置 | 推荐算法 | CPU/带宽权衡 | |-------------|-------------|-------------| | Map输出 | LZO/Snappy | 高压缩速度 | | Reduce输出 | BZip2 | 高压缩率 | 4. **数据本地化** - 优先调度Task到存有输入数据的节点(Data Locality) - 本地化率提升10%可减少30%网络传输 --- ### 五、经典应用场景 1. **倒排索引构建** - Map阶段生成<单词,文档ID> - Reduce阶段合并文档列表 2. **网页爬虫** - 通过Map输出Key的自动特性 - 实现URL全局判 3. **用户行为分析** ```python # 伪代码示例:统计用户停留时长 def map(user_log): yield (user_id, duration) def reduce(user_id, durations): total = sum(durations) avg = total / len(durations) yield (user_id, avg) ``` --- ### 六、现代演进方向 1. **Tez引擎优化** - 将多个MapReduce Job合并为DAG执行 - 减少中间数据落盘次数 2. **Spark替代方案** | 对比维度 | MapReduce | Spark | |--------------|--------------------|--------------------| | 执行速度 | 分钟级 | 秒级 | | 数据缓存 | 无 | RDD内存缓存 | | 适用场景 | 批处理 | 流计算+机器学习 | --- **架构局限与突破**: 虽然MapReduce的批处理范式奠定了大数据计算的基础,但其**磁盘密集型**的特点导致时效性受限。新一代计算框架通过内存计算、DAG优化等方式,正在突破MapReduce的性能天花板,但其**分而治之**的核心思想仍是分布式计算的基石。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值