MapReduce编程

MapReduce编程

mapreduce是什么

​ 要了解mapreduce需要先知道什么是map;什么是reduce

​ map是一个拆解的过程,比如你有两间小平房,你当然可以把它拆解了,分成各种材料。

​ reduce则是一个组合的过程,你可以使用拆来的材料来盖一栋二层的小楼。这当然是可以的。

​ 知道了map,reduce分别代表什么,不如就来看看mapreduce。

​ mapreduce就是你种了一片森林,里面有各式各样的树木(input),有很多木匠,木匠自己想做什么擅长做什么东西,自己去砍相应的树木(split),然后把树不同的部分进行切割(map),切割好存储起来(shuffle),把这些东西放好以后,可以根据不同的顾客需求做成最后的物品(reduce),然后等待顾客付钱(ticket),这个过程是Finalize

mapreduce 和 hadoop 有什么关系

我们把hadoop框架比作电脑,mapreduce就是软件,hdfs就是硬件。MapReduce 是一个框架,Hadoop 使用它来处理驻留在 HDFS 中的数据。HDFS 将数据存储在每个大小为 64MB 或 128MB 的块中。 而且 MapReduce 可以与 HDFS 和操作HDFS中的数据。

mapreduce有什么优缺点

优点:
  • MapReduce 易于编程。通过简单接口完成分布式程序的编写,可运行在众多服务器组成的集群上。即编写一个分布式程序与编写一个简单的串行程序是一模一样的。
  • 良好的扩展性。出现资源不足的情况,可以直接增加机器数量来扩展集群的计算能力这与HDFS通过增加机器扩展集群存储能力的道理是一样的。
  • 高容错性。高容错性提现在MapReduce能使程序能够部署在廉价商用服务器上。如果其中一台机器故障,自动切换到其他节点,而且这个过程不需要人工参与,完全在 Hadoop 内部完成。
  • MapReduce 适合PB级以上海量数据的离线处理。
缺点:
  • 不适合实时计算。MapReduce 无法毫秒级内返回结果。MapReduce 并不适合数据的在线处理。
  • 不适合进行流式计算。MapReduce设计之初 输入数据集是静态的,不适合输入动态数据,不适合即流式计算。
  • 不适合 DAG(有向无环图)计算。程序之间的依赖性,MapReduce的处理方法是将使用后每个 MapReduce 作业的输出结果写入磁盘,这样会造成大量的磁盘 IO,导致性能非常低下。

mapreduce怎么实现

在这里插入图片描述

MapReduce 架构的组件:

  • 客户端(client):MapReduce 客户端是将 Job 带到 MapReduce 进行处理的人。可以有多个可用的客户端持续向 Hadoop MapReduce 管理器发送要处理的作业。

  • 作业(job):MapReduce 作业是客户想要做的实际工作,它由客户想要处理或执行的许多较小的任务组成。

  • Hadoop MapReduce Master:它将特定作业划分为后续作业部分。

  • Job-Parts:将主作业分割后得到的任务或子作业。所有工作部分组合产生最终输出的结果。

  • 输入数据(input data):馈送到 MapReduce 进行处理的数据集。

  • 输出数据(output data):处理后得到最终结果。

算法流程

在 MapReduce 中,我们有一个client。client将特定大小的job提交给 Hadoop MapReduce Master。现在,MapReduce master 将把这个作业分成几个小份。然后这些小份作业可用于 Map 和 Reduce 任务。这个 Map and Reduce 任务要根据具体任务而编写具体的代码。然后将我们将的input data送到 Map Task,Map 将生成中间键值对作为其输出。 Map 的输出,即这些键值对然后被馈送到 Reducer,最终输出存储在 HDFS 上。根据要求,可以有 n 个 Map 和 Reduce 任务用于处理数据。 Map 和 Reduce 的算法以非常优化的方式制作,使得时间复杂度或空间复杂度最小。

Job tracker 和 task tracker 如何处理 MapReduce:

Job Tracker:Job Tracker 的工作是管理整个集群中的所有资源和所有作业,并且由于集群中可能有数百个数据节点可用,因此还调度 Task Tracker 上运行在同一数据节点上的每个映射。

Task Tracker:Task Tracker 可以看作是按照 Job Tracker 给出的指令工作的实际从站。此 Task Tracker 部署在集群中的每个可用节点上,这些节点按照 Job Tracker 的指示执行 Map 和 Reduce 任务。

MapReduce 架构还有一个重要的组件,称为 Job History Server。 Job History Server 是一个守护进程,它保存和存储有关任务或应用程序的历史信息,例如在作业执行期间或之后生成的日志存储在 Job History Server 上。

mapreduce被淘汰了吗?

​ MapReduce是一种编程范式,更是一种思维方式,某个软件没有人用了,你可以说这个软件被淘汰了,但是你不能说实现这个软件的思想被淘汰了。

例子:mapreduce编程

  1. 启动全分布式的hadoop集群,实战HDFS里面说过了(实战HDFS是本专栏另一篇文章)

  2. 安装eclipse,答案同1

  3. 查看hadoop自带的Wordcount.java,自带的路径一般在adoop安装路径+/share/hadoop/mapreduce/hadoop-mapreduce-examples-3.2.0.jar,也可以自己新建,

    如果是你的hadoop在服务器上,在本地编写程序,导出为jar包,在服务器上跑也可,或者直接连上服务器也可,实战HDFS里面有说,这里给出wordcount的代码

    package com.hadooptest;
    
    import java.io.IOException;
    import org.apache.hadoop.conf.Configuration;
    import org.apache.hadoop.fs.Path;
    import org.apache.hadoop.io.IntWritable;
    import org.apache.hadoop.io.LongWritable;
    import org.apache.hadoop.io.Text;
    import org.apache.hadoop.mapreduce.Job;
    import org.apache.hadoop.mapreduce.Mapper;
    import org.apache.hadoop.mapreduce.Reducer;
    import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
    import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
    
    public class word{
    	public static class MyMapper extends Mapper<LongWritable,Text,Text,IntWritable>{
    		protected void map(LongWritable key,Text value,Context context) throws IOException,InterruptedException{
    			String l = value.toString();
    			context.write(new Text(l),new IntWritable(1));
    			
    		}
    	}
    	
    	public static class MyReduce extends Reducer<Text,IntWritable,Text,IntWritable>{
    		protected void reduce(Text key,Iterable<IntWritable> values,Context context) throws IOException,InterruptedException{
    			int sum=0;
    			for(IntWritable i : values){
    				sum+=i.get();
    			}
    			context.write(key,new IntWritable(sum));
    		}
    	}
    	
    	public static void main(String[] args) throws InterruptedException,IOException,ClassNotFoundException{
    		Configuration conf=new Configuration();
    		Job job=Job.getInstance(conf,"top");
    		job.setJobName("top");
    		job.setJarByClass(word.class);
    		job.setMapperClass(MyMapper.class);
    		job.setMapOutputKeyClass(Text.class);
    		job.setMapOutputValueClass(IntWritable.class);
    		job.setReducerClass(MyReduce.class);
    		job.setOutputKeyClass(Text.class);
    		job.setOutputValueClass(IntWritable.class);
    		FileInputFormat.addInputPath(job, new Path("hdfs://IP:9000/input"));
    		FileOutputFormat.setOutputPath(job,new Path("hdfs://IP:9000/output4"));
    		job.waitForCompletion(true);
    	}
    
    
    }
    
    /*
    /input下有三个文件
    file1.txt文件内容:MapReduce is simple
    file2.txt文件内容:MapReduce is powerful is simple
    file3.txt文件内容:Hello MapReduce bye MapReduce
    /*
    
    

4:打开对应的19888端口即可查看mapreduce的web ui

5:练习常用的mapreduce shell 命令

mapred job -help #可以查看帮助信息
mapred job -list #查看正在执行的job
mapred job -kill job-id   #kill指定job-id

yarn jar <jar> [mainClass] args... #提交任务
yarn application [options] Usage: yarn app [options] #查看和修改
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值