MapReduce

1. Mapper --> StringTokenizer 字符串分割(类似split)

2. MapReduce 框架原理

1. Mapreduce 执行流程(4个阶段)

1. split 阶段 --> 计算分片,把大任务划分为小任务

2. map 阶段 --> 调用map 方法,数据整理过程

3. shuffle 阶段 --> 主要负责将map端的数据传输给reduce端,分区排序溢写过程

4. reduce 阶段 --> 对shffule阶段传来的数据进行最后的整理合并

2. MapReducer 工作流程的具体步骤

1. MapReduce 通过 inputformat 根据文件 block 进行 split [=block]

2. map task接收split并调用map()方法整理数据然后输出kv数据

3. maptask把kv数据存入环形缓冲区(100M)

4. 环形缓冲区当达到阈值(80%)时进行溢写磁盘,在此写盘之前会进行分区(partiton)和 排序(sort) 5. 多个溢写小文件合并成一个大文件

6. reducetask把shuffle生成的文件拉取后进行归并排序

7. reducetask从文件中取出数据按key分组存入不同的集合中

8. reducetask调用reduce()方法处理每个集合中的数据并把结果提交给mr

9. mr通过outputformat将结果写入目标文件

3. InputSpilt 输入分片

1. 在map之前,根据输入文件创建inputSplit

1. 每个InputSplit对应一个Mapper任务

2. 输入分片存储的是分片长度和记录数据位置的数组 java

2. block和split的区别

1. block是数据的物理表示(理论的)--> block 的值是可以进行指定的

1. Math.max(minSize, Math.min(maxSize, blockSize))

1. 其中minSize的默认值=1,maxSize的默认值=Long.MAX_VALUE

2. 默认情况下,split的大小=block的大小

1. 如果maxSize < blockSize,则每split变小,那么split数变多;

2. 如果minSize > blockSize,则每split变大,那么split数变少

2. split是块中数据的逻辑表示(实际的)

3. split划分是在记录的边界处(保证数据的完整性,与block划分的位置可能不同

4. split的数量应不大于block的数量(一般相等)

1. 当多出的块大小/block值 <= 1.1,则可以合并分片

2. 当多出的块大小/block值 > 1.1,则可以必须再分片

5. 默认情况下,map的数量取决于split的数量,而split的数量取决于block的数量

4. Shuffle 阶段 --> 数据从 map 输出到 reduce 输入的过程

3. MapReduce 常用特殊类

1. Combiner 类(在Mapper中使用)

1. Combiner相当于本地化的Reduce操作

1. 在shuffle之前进行本地聚合,用于性能优化,可选项,输入输出类型一致

2. Reducer可以被用作Combiner的条件 --> 符合交换律和结合律

1. 相对提升了效率,减少了Shuffle阶段

2. 并不适用所有情况,只适合加法或乘法,没有其他操作的时候

3. 实现Combiner --> job.setCombinerClass(WCReducer.class)

2. Partitioner 类(分区器,无需写reducer,直接创建Partitioner 类,继承接口)

1. 用于在Map端对key进行分区

1. 在不指定分区时默认使用一个 0 号分区

2. reduce 个数 ≥ 分区个数

3. 在指定 Reduce 数量时默认使用 HashPartitioner

1. 获取key的哈希值(hashcode值)

2. 使用key的哈希值对Reduce任务数求模(余数表示对应的文件编号)

4. 决定每条记录应该送到哪个Reducer处理

2. 自定义Partitioner

1. 继承抽象类Partitioner,重写getPartition方法

2. 通过 job.setPartitionerClass( ) 设置

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值