文章目录
- 什么是MapReduce?
- MapReduce的设计思想
- MapReduce特点
- MapReduce实现WordCount
- MapReduce执行过程
- Hadoop V1 MR引擎
- Hadoop V2 YARN
- Hadoop及YARN架构
- Hadoop2 MR在Yarn上运行流程
- InputSplit(输入分片)
- Shuffle阶段
- Key&Value类型
- MapReduce编程模型
- InputFormat接口
- Mapper类
- Combiner类
- Partitioner类
- Reducer类
- OutputFormat接口
- 编写M/R Job
- 使用MapReduce实现WordCount
- 使用MapReduce实现join操作
- 传递参数
- 分布式缓存机制(Distributed Cache)
什么是MapReduce?
- MapReduce是一个分布式计算框架
-
- 它将大型数据操作作业分解为可以跨服务器集群并行执行的单个任务。
- 起源于Google
- 适用于大规模数据处理场景
-
- 每个节点处理存储在该节点的数据
- 每个job包含Map和Reduce两部分
MapReduce的设计思想
- 分而治之
- 简化并行计算的编程模型
- 构建抽象模型:Map和Reduce
- 开发人员专注于实现Mapper和Reducer函数
- 隐藏系统层细节
- 开发人员专注于业务逻辑实现
MapReduce特点
- 优点
- 易于编程
- 可扩展性
- 高容错性
- 高吞吐量
- 不适用领域
- 难以实时计算
- 不适合流式计算
MapReduce实现WordCount
MapReduce执行过程
- 数据定义格式
- map: (K1,V1) → list (K2,V2)
- reduce: (K2,list(V2)) → list (K3,V3)
- MapReduce执行过程
- Mapper
- Combiner
- Partitioner
- Shuffle and Sort
- Reducer
Hadoop V1 MR引擎
- Job Tracker
- 运行在Namenode
- 接受客户端Job请求
- 提交给Task Tracker
- Task Tracker
- 从Job Tracker接受任务请求
- 执行map、reduce等操作
- 返回心跳给Job Tracker
Hadoop V2 YARN
Hadoop及YARN架构
Hadoop2 MR在Yarn上运行流程
InputSplit(输入分片)
Shuffle阶段
数据从Map输出到Reduce输入的过程
Key&Value类型
- 必须可序列化(serializable)
- 作用:网络传输以及持久化存储
- IntWritable、LongWriteable、FloatWritable、Text、DoubleWritable, BooleanWritable、NullWritable等
- 都继承了Writable接口
- 并实现write()和readFields()方法
- Keys必须实现WritableComparable接口
- Reduce阶段需要sort
- keys需要可比较
MapReduce编程模型
InputFormat接口
Mapper类
- Mapper主要方法
- void setup(Context context)
- org.apache.hadoop.mapreduce.Mapper.Context
- void map(KEY key, VALUE value, Context context)
- 为输入分片中的每个键/值对调用一次
- void cleanup(Context context)
- void run(Context context)
- 可通过重写该方法对Mapper进行更完整控制
- void setup(Context context)
Combiner类
- Combiner相当于本地化的Reduce操作
- 在shuffle之前进行本地聚合
- 用于性能优化,可选项
- 输入和输出类型一致
- Reducer可以被用作Combiner的条件
- 符合交换律和结合律
- 实现Combiner
- job.setCombinerClass(WCReducer.class)
Partitioner类
- 用于在Map端对key进行分区
- 默认使用的是HashPartitioner
- 获取key的哈希值
- 使用key的哈希值对Reduce任务数求模
- 决定每条记录应该送到哪个Reducer处理
- 默认使用的是HashPartitioner
- 自定义Partitioner
- 继承抽象类Partitioner,重写getPartition方法
- job.setPartitionerClass(MyPartitioner.class)
Reducer类
Reducer主要方法
- void setup(Context context)
- org.apache.hadoop.mapreduce.Reducer.Context
- void reduce(KEY key, Iterable values, Context context)
- 为每个key调用一次
- void cleanup(Context context)
- void run(Context context)
- 可通过重写该方法来控制reduce任务的工作方式
OutputFormat接口
编写M/R Job
//InputFormat
Job job = Job.getInstance(getConf(), "WordCountMR" );
job.setJarByClass( getClass() );
FileInputFormat.addInputPath(job, new Path(args[0]) );
job.setInputFormatClass( TextInputFormat.class );
//OutputFormat
FileOutputFormat.setOutputPath( job, new Path(args[1]) );
job.setOutputFormatClass( TextOutputFormat.class );
//Mapper
job.setMapperClass( WCMapper.class );
job.setMapOutputKeyClass( Text.class );
job.setMapOutputValueClass( IntWritable.class );
//Reducer
job.setReducerClass( WCReducer.class );
job.setOutputKeyClass( Text.class );
job.setOutputValueClass( IntWritable.class );
使用MapReduce实现WordCount
- 编写Java代码
- Mapper
- Reducer
- Job
- 执行M/R Job
hadoop jar WCMR.jar cn.kgc.WCDriver /user/data /user/out
- 设置M/R参数
使用MapReduce实现join操作
- map端join
- 大文件+小文件
- reduce端join
传递参数
通过Configuration来传递参数
//during start-up
Configuration cfg = new Configuration();
cfg.set("test", "123");
Job job = new Job(cfg);
//inside mapper and/or reducer
Configuration cfg = context.getConfiguration();
String value = cfg.get("test");
分布式缓存机制(Distributed Cache)
- 在执行MR时向集群中的任务节点发送只读文件
- 分发第三方库(jar等)
- 共享一些可以装载进内存的文件
- 进行类似join连接时,小表的分发
- 符号连接(#)
Job job = new Job();
job.addCacheFile(new Path(filename).toUri());
job.addCacheFile(new URI("/user/data/customer_types.json#customer_type"));
URI[] files = context.getCacheFiles();
Path filename = new Path(files[0])
File customerType = new File("./customer_type");