MapReduce JAVA框架开发流程
总体流程
- 用户提交任务给集群
- 集群首先对输入数据源进行切片
- master 调度 worker 执行 map 任务
- worker 读取输入源片段
- worker 执行 map 任务,将任务输出保存在本地
- master 调度 worker 执行 reduce 任务,reduce worker 读取 map 任务的输出文件
- 执行 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须指定分区规则吗