hadoop细节——shuffle和combiner

本文详细介绍了MapReduce中Shuffle的工作原理,包括map输出的内存缓冲、溢写磁盘、分区与排序、combiner的作用及其意义等关键环节。解释了reduce如何定位map输出,并阐述了combiner对提高效率的重要性。

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

1.将map输出传给reduce过程中需要排序(按键排序)的过程——shuffle。
2.每个map任务都有一个环形内存缓冲区(默认为100MB,可以通过改变io.sort.mb属性来调整),用于存储任务的输出,当缓冲区到达阀值时(io.sort.spill.percent,默认为0.8),新建一个溢出写文件,把内容写到磁盘,写磁盘将按照轮询方式写到mapred.local.dir所指定的目录。写磁盘时可以压缩map输出,使得写磁盘的速度更快,节约磁盘空间,减少传给reducer的数据量。
3.在map输出写磁盘之前,线程会根据最终传送到reduce把数据划分为相应的分区,在每个分区中,按键排序,如有一个combiner函数,它会在排序后的输出上运行。
4.map输出文件位于运行map任务的tasktracker的本地磁盘,reduce任务会复制map输出,如果map输出很小,就复制到reduce tasktracker的内存中,否则复制到磁盘。复制完map输出后,reduce任务进入排序阶段,合并map输出,在reduce阶段,对已排序的每个键都要使用reduce函数。
5.一个小问题:reducer如何知道从哪个tasktracker取得map输出?
答:map任务完成后会通知tasktracker,tasktracker会通知jobtracker,jobtracker知道map输出和tasktracker之间的映射关系,reduce定期询问jobtracker获取map输出的位置。
6.map任务的输出可以指定一个combiner函数,无论调用多少次此函数,reduce结果都一样。
7.合并函数是通过reducer接口来定义的,有时它与reduce函数一样。 conf.setCombinerClass(**.class)
8.combiner的意义是使得map输出更加紧凑,使得写到本地磁盘和传给reducer的数据更小。
### Hadoop 面试问题及答案 #### 什么是HadoopHadoop 是一个开源软件框架,专为存储大量数据并支持在由多台商用硬件组成的集群上并发处理这些数据而设计[^2]。 #### Hadoop 的主要组成部分有哪些? Hadoop 主要由三个部分构成: - **分布式存储 (HDFS)**:允许以分布式的、冗余的方式存储大量的数据。例如,1 GB大小的文本文件可被分割成多个较小的部分,并分布在不同的节点上保存,同时提供高可用性容错能力。 - **分布式计算框架 (MapReduce)**:负责执行大规模数据分析任务,通过映射(map)化简(reduce)两个阶段来处理输入的数据集。 - **资源调度框架 (YARN)**:管理整个系统的计算资源分配给各个应用程序使用[^1]。 #### 如何验证Hadoop安装成功与否? 可以通过一系列命令来进行基本的服务状态检查: - 使用 `jps` 命令查看Java进程; - 进入日志目录 `/opt/software/hadoop-3.1.3/logs/` 查看NameNode的日志文件; - 利用 `netstat -anutp | grep 9870` 来确认Web UI端口是否开启正常; - 执行 `hdfs dfsadmin -safemode get` 查询当前的安全模式状况[^3]。 #### MapReduceCombiner与Reducer有何区别? 两者的主要差异体现在它们的工作位置上——Combiner会在每个MapTask所在节点本地运行,作为预聚合操作的一部分;相比之下,Reducer则会收集来自所有Mapper产生的中间键值对输出,在全局范围内完成最终的结果汇总工作[^4]。 #### Shuffle过程包含哪些步骤以及其影响因素是什么? Shuffle是指从map阶段到reduce阶段之间的数据传输流程,它通常涉及以下几个环节: - 对map输出进行分区(partitioning),按照key分组(group by key); - 排序(sorting),确保相同key下的value有序排列; - 合并(combine),减少网络传输负担; - 数据压缩(compression),提高I/O效率。 Shuffle过程中传递的数据总量取决于原始输入规模、mapper的数量及其产出率等因素共同作用下形成的中间结果集合大小。 ```bash # 示例:启动namenode服务 $ hdfs --daemon start namenode ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值