MapReduce原理及编程

什么是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

image-20200910185133790

Hadoop V1 MR引擎

  • Job Tracker
    • 运行在Namenode
    • 接受客户端Job请求
    • 提交给Task Tracker
  • Task Tracker
    • 从Job Tracker接受任务请求
    • 执行map、reduce等操作
    • 返回心跳给Job Tracker

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jFaQmxRz-1599736906643)(https://i.loli.net/2020/09/10/9MesCdLm47YxhgP.png)]

Hadoop V2 YARN

在这里插入图片描述

Hadoop及YARN架构

在这里插入图片描述

Hadoop2 MR在Yarn上运行流程

在这里插入图片描述

InputSplit(输入分片)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-oaGkGPJZ-1599736906652)(https://i.loli.net/2020/09/10/wFiBszXNkGAmTVa.png)]

Shuffle阶段

数据从Map输出到Reduce输入的过程

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xeztFqQq-1599736906653)(https://i.loli.net/2020/09/10/MXPRp6hyD5nqo9S.png)]

Key&Value类型

  • 必须可序列化(serializable)
    • 作用:网络传输以及持久化存储
    • IntWritable、LongWriteable、FloatWritable、Text、DoubleWritable, BooleanWritable、NullWritable等
  • 都继承了Writable接口
    • 并实现write()和readFields()方法
  • Keys必须实现WritableComparable接口
    • Reduce阶段需要sort
    • keys需要可比较

MapReduce编程模型

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-lUj8L6B8-1599736906654)(https://i.loli.net/2020/09/10/kM7bdlEWcAhIPxt.png)]

InputFormat接口

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-AabcY3uv-1599736906656)(https://i.loli.net/2020/09/10/1N89nL7zA6CQVva.png)]

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进行更完整控制

Combiner类

  • Combiner相当于本地化的Reduce操作
    • 在shuffle之前进行本地聚合
    • 用于性能优化,可选项
    • 输入和输出类型一致
  • Reducer可以被用作Combiner的条件
    • 符合交换律和结合律
  • 实现Combiner
    • job.setCombinerClass(WCReducer.class)

Partitioner类

  • 用于在Map端对key进行分区
    • 默认使用的是HashPartitioner
      • 获取key的哈希值
      • 使用key的哈希值对Reduce任务数求模
    • 决定每条记录应该送到哪个Reducer处理
  • 自定义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接口

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nxcLWJ9M-1599736906657)(https://i.loli.net/2020/09/10/ZqYGF2r3W6EXcIu.png)]

编写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");

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值