MapReduce相关优化以及解决数据倾斜问题

MapReduce相关优化以及解决数据倾斜问题

1. DistributedCache 分布式缓存

Mapreduce中会将map输出的kv对,按照相同key分区(调用getPartition),
然后分发给不同的 reducetask 来进行处理。Map 阶段的时候调用了 Partitioner
组件(返回分区号),由它决定将数据放到哪个区中,默认的分区规则为:根据 key
的 hashcode%reducetask 数来分发。
当然我们也可以自定义分区组件,改写默认的分区规则。

1.1. 存在的问题

如若 Mapper 输出的一些 Key 特别多,另一些 Key 特别少就会产生数据倾斜,
造成一些 Reducer 特别忙,一些则比较闲,我们说 Mapper 端相同 key 的输出数
据会发到同一个 Redurce 端,需要把 key 相同的放在一起才能进行拼接,所以才
需要 Reducer。如果我们不需要 Reducer 就能做拼接,就不存在数据倾斜了。

1.2. 解决方案

Map 端 Join 解决数据倾斜,我们为每一个 MapTask 准备一个表的全表数据
文件。这种机制叫做 Map Side Join。当然这个表的全表不能很大。

1.3. 原理阐述

适用于关联表中有小表的情形;
可以将小表分发到所有的 map 节点,这样,map 节点就可以在本地。对自己
所读到的大表数据进行 join 并输出最终结果,可以大大提高 join 操作的并发
度,加快处理速度;
Hadoop 提供了一个 Distributed Cache 机制,能把文件在合适的时候发给
MapTask,MapTask 就可以从本地进行加载小表数据;

2. CombineTextInputFormat 小文件处理场景

2.1. 存在的问题

HDFS 设计是用来存储海量数据的,特别适合存储 TB、PB 量级别的数据。但
是随着时间的推移,HDFS 上可能会存在大量的小文件,这里说的小文件指的是
文件大小远远小于一个 HDFS 块(128MB)的大小;HDFS 上存在大量的小文件至
少会产生以下影响:
消耗 NameNode 大量的内存
延长 MapReduce 作业的总运行时间
因为 MapReduce 框架默认的 TextInputFormat 切片机制是对任务按文件规
划切片,如果有大量小文件,就会产生大量的 MapTask,处理小文件效率非常低。

2.2. 解决方案

Hadoop 内置提供了一个 CombineTextInputFormat 类来专门处理小文件,
其核心思想是:根据一定的规则,将 HDFS 上多个小文件合并到一个 InputSplit
中,然后会启用一个 Map 来处理这里面的文件,以此减少 MR 整体作业的运行时
间。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值