Map/Reduce概述

Map/Reduce是Google提出的一个软件架构,用于大规模数据集(大于1TB)的并行运算。概念"Map(映射)"和"Reduce(化简)",和他们的主要思想,都是从函数式编程语言借来的,还有从矢量编程语言借来的特性。当前的软件实现是指定一个Map(映射)函数,用来把一组键值对映射成一组新的键值对,指定并发的Reduce(化简)函数,用来保证所有映射的键值对中的每一个共享相同的键组。

Hadoop Map/Reduce是一个使用简易的软件框架,基于它写出来的应用程序能够运行在由上千个商用机器组成的大型集群上,并以一种可靠容错的方式并行处理上T级别的数据集。

一个Map/Reduce 作业(job) 通常会把输入的数据集切分为若干独立的数据块,由 map任务(task)以完全并行的方式处理它们。框架会对map的输出先进行排序, 然后把结果输入给reduce任务。通常作业的输入和输出都会被存储在文件系统中。 整个框架负责任务的调度和监控,以及重新执行已经失败的任务。

通常,Map/Reduce框架和分布式文件系统是运行在一组相同的节点上的,也就是说,计算节点和存储节点通常在一起。这种配置允许框架在那些已经存好数据的节点上高效地调度任务,这可以使整个集群的网络带宽被非常高效地利用。

Map/Reduce框架由一个单独的master JobTracker 和每个集群节点一个slave TaskTracker共同组成。master负责调度构成一个作业的所有任务,这些任务分布在不同的slave上,master监控它们的执行,重新执行已经失败的任务。而slave仅负责执行由master指派的任务。

应用程序至少应该指明输入/输出的位置(路径),并通过实现合适的接口或抽象类提供map和reduce函数。再加上其他作业的参数,就构成了作业配置(job configuration)。然后,Hadoop的 job client提交作业(jar包/可执行程序等)和配置信息给JobTracker,后者负责分发这些软件和配置信息给slave、调度任务并监控它们的执行,同时提供状态和诊断信息给job-client。

虽然Hadoop框架是用JavaTM实现的,但Map/Reduce应用程序则不一定要用 Java来写 。

Hadoop Streaming是一种运行作业的实用工具,它允许用户创建和运行任何可执行程序(例如:Shell工具)来做为mapper和reducer。 Hadoop Pipes是一个与SWIG兼容的C++ API (没有基于JNITM技术),它也可用于实现Map/Reduce应用程序。

### Hadoop中Map/Reduce选项的配置与启用 #### 启用Combiner函数 为了减少mapreduce任务之间不必要的数据传输,可以通过指定一个combiner函数来优化性能。此函数的作用是对map阶段产生的中间结果进行局部聚合处理,从而降低网络带宽消耗[^1]。 在实际操作中,用户可以在编写程序时定义自己的`combine()`逻辑,并将其注册到Job对象上: ```java job.setCombinerClass(MyCustomCombiner.class); ``` 需要注意的是,由于Hadoop框架不会保证调用次数的一致性(可能零次也可能多次),因此设计该类时应遵循幂等原则。 #### 设置Map输出压缩 对于大规模的数据集来说,开启map输出压缩能够有效节省磁盘空间以及提升I/O效率。具体做法如下所示,在客户端提交作业前添加相应属性设定语句即可完成此项调整[^2]: ```bash set mapreduce.map.output.compress=true; set mapreduce.map.output.compression.codec=org.apache.hadoop.io.compress.GzipCodec; ``` 这里不仅启用了压缩开关还指定了具体的编解码器类型为Gzip形式。 #### 调整MapperReducer实例数目 合理规划mappers与reducers的数量有助于平衡工作负载并防止因资源争抢引发的任务崩溃现象发生[^3]。通常情况下,默认参数已经满足大多数场景需求;然而当面对特殊业务模型或者超大数据规模时,则需手动干预这些数值。 以下是几种常见的调节方式及其适用条件概述: - **基于输入文件大小自动分配**:让系统自行决定split划分粒度进而影响最终生成的mapper总数。 ```xml <property> <name>mapred.max.split.size</name> <value>...</value> </property> ``` - **固定值硬编码**:直接给定确切数字作为目标数列长度。 ```java int desiredNumberOfReducers = ... ; Configuration conf = new Configuration(); conf.setInt("num reducers",desiredNumberOfReducers ); ``` 另外值得注意的一个问题是关于重复执行的现象描述[^4]。这种情况可能是由多种因素共作用造成的,比如shuffle phase期间出现了错误重试机制触发等情况所致。解决办法可以从以下几个方面入手排查原因所在: - 检查是否有异常日志提示; - 验证源表结构是否存在冗余字段干扰正常解析流程; - 尝试修改分桶策略看能否缓解症状表现等等。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值