MapReduce JAVA框架开发流程,后附代码实现

MapReduce JAVA框架开发流程

总体流程

  1. 用户提交任务给集群
  2. 集群首先对输入数据源进行切片
  3. master 调度 worker 执行 map 任务
  4. worker 读取输入源片段
  5. worker 执行 map 任务,将任务输出保存在本地
  6. master 调度 worker 执行 reduce 任务,reduce worker 读取 map 任务的输出文件
  7. 执行 reduce 任务,将任务输出保存到 HDFS

细节大致如下

                                                               用户提交任务job 给集群

切片                                                        集群查找源数据 对源数据做基本处理

分词(每行执行一次map函数)                 集群(yarn的appliction)分配map任务节点worker

映射                                                        其中间数据(存在本地)

分区(partition)                                         .......

排序 (或二次排序)                                         ......

聚合(combine有无key聚合后key无序)    分组(group) 发生在排序后混洗前个人理解

混洗(shuffle后key有序) 混洗横跨mapper和reducer,其发生在mapper的输出和reducer的输入阶段

规约(reduce)                                    集群(yarn的appliction)分配reduce任务节点worker

数据格式

Shell命令指定输出格式

yarn jar jar_path main_class_path -Dmapred.output.compress=true -Dmapred.output.compression.codec=org.apache.hadoop.io.compress.GzipCodec <in> <out>

GenericOptionsParser op = new GenericOptionsParser(conf, args)    参数解析器

op.getRemainingArgs()             剩余参数

 

分区

Map数量的确定:由输入数据文件格式,文件的大小,块大小综合确定

一般不可切分计算的只有一个mapper

一般可切分计算的除以128M (Hadoop的默认块大小)分为多少块则有多少mapper

Reduce数量确定:系统根据输入数据量的大小自动推测、和手动指定

     自动推测:一般是Reducer的输入处于ruducer的默认处理文件大小64M

     手动指定:通过设定分区的数量来控制reducer数量,再在运行前设置reducer的数量

实际分区数量小于等于reducer数量,分区是局部概念,ruducer是全局概念

1)分区默认规则:(key.hashCode() & Integer.MAX_VALUE) % reduceNums  (显然却决于reduce的数量 ,一旦reduce数量大于1须指定分区规则吗

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值