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编程
-
启动全分布式的hadoop集群,实战HDFS里面说过了(实战HDFS是本专栏另一篇文章)
-
安装eclipse,答案同1
-
查看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] #查看和修改