MapReduce编程-程序员宅基地

技术标签: mapreduce  hdfs  hadoop  

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] #查看和修改
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/junsuyiji/article/details/127734551

智能推荐

通过大数据智能风控,金融机构减少了对抵押物的依赖_金融科技识别抵押物价值-程序员宅基地

文章浏览阅读499次。  金融业的数字化转型引发持续关注。数字金融、智能金融、区块链等关键词都得到了热烈讨论。数据,作为一种新型生产要素,早已成为推动国经济质量发展的重要动能。数据智能驱动金融业蝶变,“一切业务数据化,一切数据业务化”势不可挡。  我国金融数字化水平处于领先地位  随着大数据、云计算、区块链、AI、5G等基础技术迅速发展,我国的数字金融也打开了新的局面。  金融业的数字化转型过程大致分为三个阶段:最初,金融业从长尾用户切入,利用互联网优势,逐步打开市场。其后,更多新技术应用到更多金融场景之中,数据智能转型加_金融科技识别抵押物价值

重拾web开发-JavaScript复习-程序员宅基地

文章浏览阅读50次。以下内容都是本人之前学习的一些笔记很多是摘自网上并非完全原创,特此申明。最简单的一句js:<html><body><script type="text/javascript">document.write("Hello World!");</script></body></html>..._web javascript复习

rk3588/rk356x/rv1109/rv1126 live555移植+mpp编译 rtsp拉流_rk3588 与rv1109-程序员宅基地

文章浏览阅读7.3k次,点赞7次,收藏57次。rk3588 rk356x rv1126/1109 mpp编译 _rk3588 与rv1109

python爬虫之爬取百度图片(图文并排,炒鸡详细!!!)_爬虫+排版-程序员宅基地

文章浏览阅读2.1k次,点赞4次,收藏12次。第一步:登录百度图片官网,截图如下所示:注意点一:开头必须是https(如上图所示,出现锁的标志),不能是http,否则后期下载图片文件会出错第二步:输入关键字,页面加载出来之后,按F12进入开发者模式,由于百度图片ajax动态加载,点击network选项卡,重新刷新页面,查看XHR数据,截图如下所示:第三步:分析多个XHR,得出规律,每一个页面所请求的url所携带的参数只有pn,rn,..._爬虫+排版

Solr 基于java的复制(Master-Slave配置) _java 实现主从复制-程序员宅基地

文章浏览阅读3.1k次。 Solr支持两种复制,一是java实现的复制,通过RequestHandler实现,Slave定期调用Master的ReqeuestHandler,与Master上的索引同步。另外是利用Unix脚本实现的复制。本文以案例的形式详细说明第一种复制的配置过程,搭建一个Master-Slave环境的Solr服务。Solr基于JAVA的主从复制有下面几个优点: 无需依赖外部脚本 只需在solrconfig.xml中配置_java 实现主从复制

解决eNsp路由器AR一直出现###的问题_ensp路由器一直跳井号-程序员宅基地

文章浏览阅读2.2w次,点赞15次,收藏77次。在此之前先提醒你一下,ensp左侧最后一个不带型号的router是一直都可以用的,如果你的配置不涉及到ACL与NAT等配置带型号路由器的命令,那么可以不用这么麻烦,直接用第六个就好。一.试着点开你的virtualBox,如果点不开说明你的virtualBox版本与你的系统不兼容virtualBox版本与WIN10不兼容,可以下载链接:低版本更兼容的virtualBox提取码:d3d0,重安一个virtualBox版本就好二.安装好重启ensp如果还是一直出现#打开控制面板–系统与安全–防火墙,点击_ensp路由器一直跳井号

随便推点

解决 “MoveFile”: 类型库“XXX.dll”中的标识符已经是宏;使用“rename”限定符 类型库符号与系统符号冲突问题_类型库中的标识符已经是宏;使用“rename”限定符-程序员宅基地

文章浏览阅读667次。今天在VS工程当中引入一个组件,编译的时候出现警告, “MoveFile”: 类型库“XXX.dll”中的标识符已经是宏;使用“rename”限定符。虽然只是一个警告,但看着实在不爽,更重要的是,警告在某些情况下,可能正是bug的来源,并且这类bug往往非常难以定位。废话不多话,下面来解决问题。 看编译器给出的提示,是告诉我们,类型库当中的符号和系统符号有重名,同时也给出了解决方法,就是..._类型库中的标识符已经是宏;使用“rename”限定符

PCL教程-点云滤波之体素滤波器(下采样)_体素下采样-程序员宅基地

文章浏览阅读1.3w次,点赞14次,收藏99次。原文链接:Downsampling a PointCloud using a VoxelGrid filter点云文件下载:table_scene_lms400.pcd在本篇教程中,我们将使用体素化的方式对点云数据进行下采样。原理下采样:减少点云数据集中点云数量体素滤波器可以达到向下采样同时不破坏点云本身几何结构的功能,但是会移动点的位置。 此外体素滤波器可以去除一定程度的噪音点及离群点。主要功能是用来进行降采样。它的原理是根据输入的点云,首先计算一个能够刚好包裹住该点云的立.._体素下采样

微信小程序大赛介绍文档_竞赛作品介绍文档怎么写-程序员宅基地

文章浏览阅读1.2w次,点赞30次,收藏140次。参加的是2020年的微信小程序大赛,我们的作品介绍文档仅供参考。可以去我的资源下载—>>>微信小程序大赛作品介绍文档部分展示(一共23页):参加的是2020年的微信小程序大赛,我们的作品介绍文档仅供参考。可以去我的资源下载—>>>微信小程序作品介绍文档..._竞赛作品介绍文档怎么写

【Python】Excel数据转化为矩阵_python excel 将一行转换为一个三角矩阵-程序员宅基地

文章浏览阅读1.8w次,点赞2次,收藏30次。原文链接:https://blog.csdn.net/ling_cmd/article/details/81063706def excel2m(path): data = xlrd.open_workbook(path) table = data.sheets()[0] nrows = table.nrows # 行数 ncols = table.ncols ..._python excel 将一行转换为一个三角矩阵

Vue 教程(三十一)webpack-ES6 转 ES5 处理_vuees6转es5-程序员宅基地

文章浏览阅读2.9k次。Vue 教程(三十一)webpack-ES6 转 ES5 处理如果你仔细阅读 webpack 打包的 s 文件,发现写的 ES6 语法并没有转成 ES5,那么就意味着可能一些对 ES6 还不支持的浏览器没有办法很好的运行我们的代码。将 ES6 的语法转成 ES5,那么就需要使用 babel 的 loader在 webpack 中,我们直接使用 babe 对应的 Loader 就可以了。安装 babel 对应 loadernpm install --save-dev babel-loa_vuees6转es5

Android Touch事件分发过程-程序员宅基地

文章浏览阅读181次。尽管网络上已经有很多关于这个话题的优秀文章了,但还是写了这篇文章,主要还是为了加强自己的记忆吧,自己过一遍总比看别人的分析要深刻得多,那就走起吧。简单示例先看一个示例 :布局文件 :xmlns:tools=”http://schemas.android.com/tools”android:id=”@+id/container”android:

推荐文章

热门文章

相关标签