热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

7.1MapReduce简介

任务目的理解MapReduce的概念掌握MapReduce程序运行的步骤掌握MapReduce编程规范任务清单任务1:MapReduce概述任务2:

任务目的
  • 理解 MapReduce 的概念
  • 掌握 MapReduce 程序运行的步骤
  • 掌握 MapReduce 编程规范

任务清单


  • 任务1:MapReduce概述
  • 任务2:MapReduce 程序运行演示
  • 任务3:MapReduce 示例编写规范

详细任务步骤


任务1:MapReduce概述

  1. 什么是MapReduce?

  重温 Hadoop 四大组件:

  • HDFS:分布式文件系统
  • MapReduce:分布式运算编程框架
  • YARN: Hadoop 的资源调度系统
  • Common: 以上三大组件的底层支撑组件,主要提供基础工具包和 RPC 框架等

  MapReduce 是一个分布式运算程序的编程框架,是用户开发“基于 Hadoop 的数据分析应用”的核心框架。

  MapReduce 核心功能是将用户编写的业务逻辑代码自带默认组件整合成一个完整的分布式运算程序,并发运行在一个 Hadoop 集群上。

  2. 为什么需要 MapReduce?

  (1)海量数据在单机上处理因为硬件资源限制,无法胜任;

  (2)而一旦将单机版程序扩展到集群来分布式运行,将极大增加程序的复杂度和开发难度;

  (3)引入 MapReduce 框架后,开发人员可以将绝大部分工作集中在业务逻辑的开发上,而将分布式计算中的复杂性交由框架来处理。

  程序由单机版扩成分布式版时,会引入大量的复杂工作。为了提高开发效率,可以将分布式程序中的公共功能封装成框架,让开发人员可以将精力集中于业务逻辑。

  Hadoop 当中的 MapReduce 就是这样的一个分布式程序运算框架,它把大量分布式程序都会涉及到的内容都封装起来,让用户只用专注自己的业务逻辑代码的开发。

任务2:MapReduce 程序运行演示

  Hadoop 的发布包中内置了一个 hadoop-mapreduce-examples-2.7.7.jar, 这个 jar 包中有各种 MapReduce 示 例程序,其中非常有名的就是 PI 程序 和 wordcount。此 jar 包存放在 $HADOOP_HOME/share/hadoop/mapreduce/目录里。

  我们可以通过以下步骤运行:

  • 启动 HDFS 和 YARN 集群
  • 然后在集群的任意一台节点上启动执行程序

2.1 PI 程序

  进入 $HADOOP_HOME/share/hadoop/mapreduce/目录下,执行如下命令:

hadoop jar hadoop-mapreduce-examples-2.7.7.jar pi 10 10

  如下图所示:

Vditor

图1

  运行结果:

Vditor

图2

2.2 wordcount 程序

  将$HADOOP_HOME/README.txt文件上传到 HDFS 作为数据源:

hadoop fs -put README.txt /

  运行结果:

Vditor

图3

  执行 wordcount 程序:

hadoop jar hadoop-mapreduce-examples-2.7.7.jar wordcount /README.txt /wordcount

  如下图所示:

Vditor

图4

  执行完成,使用cat命令查看运行结果:

Vditor

图5

2.3 源码解析

  打开“/root/software/hadoop-2.7.7-src/hadoop-mapreduce-project/hadoop-mapreduce-examples”,如下图所示:

Vditor

图6

  使用vi编辑器打开“pom.xml”,找到第 127 行,它告诉了我们例子程序的主程序入口:

Vditor

图7

  进入该目录“src/main/java/org/apache/hadoop/examples”,如下图所示:

Vditor

图8

  打开主入口程序“ExampleDriver.java”,告诉我们pi和wordcount对应的实际程序分别是QuasiMonteCarlo.class和WordCount.class:

Vditor

图9

  之后打开pi和wordcount对应的实际程序,查看MapReduce示例的源码编写规范,这里我们着重看一下wordcount的源码编写:

public class WordCount {public static class TokenizerMapperextends Mapper<Object, Text, Text, IntWritable>{private final static IntWritable one &#61; new IntWritable(1);private Text word &#61; new Text();public void map(Object key, Text value, Context context) throws IOException, InterruptedException {StringTokenizer itr &#61; new StringTokenizer(value.toString());while (itr.hasMoreTokens()) {word.set(itr.nextToken());context.write(word, one);}}}public static class IntSumReducerextends Reducer<Text,IntWritable,Text,IntWritable> {private IntWritable result &#61; new IntWritable();public void reduce(Text key, Iterable values,Context context) throws IOException, InterruptedException {int sum &#61; 0;for (IntWritable val : values) {sum &#43;&#61; val.get();}result.set(sum);context.write(key, result);}}public static void main(String[] args) throws Exception {Configuration conf &#61; new Configuration();String[] otherArgs &#61; new GenericOptionsParser(conf, args).getRemainingArgs();if (otherArgs.length <2) {System.err.println("Usage: wordcount [...] ");System.exit(2);}Job job &#61; Job.getInstance(conf, "word count");job.setJarByClass(WordCount.class);job.setMapperClass(TokenizerMapper.class);job.setCombinerClass(IntSumReducer.class);job.setReducerClass(IntSumReducer.class);job.setOutputKeyClass(Text.class);job.setOutputValueClass(IntWritable.class);for (int i &#61; 0; i new Path(otherArgs[i]));}FileOutputFormat.setOutputPath(job,new Path(otherArgs[otherArgs.length - 1]));System.exit(job.waitForCompletion(true) ? 0 : 1);}
}

  通过查看 WordCount 程序 MapReduce 源码编写&#xff0c;得出以下几点结论&#xff1a;

  该程序有一个 main 方法&#xff0c;来启动任务的运行&#xff0c;其中 job 对象存储了该程序运行的必要信息&#xff0c;比如指定 Mapper 类和 Reducer 类&#xff1a;

  • job.setMapperClass(TokenizerMapper.class);  继承 Mapper 类
  • job.setReducerClass(IntSumReducer.class);  继承 Redcuer 类

  总结&#xff1a;

  MapReduce 程序的业务编码分为两个大部分&#xff0c;一部分配置程序的运行信息&#xff0c;一部分编写该 MapReduce 程序的业务逻辑&#xff0c;并且业务逻辑的 map 阶段和 reduce 阶段的代码分别继承 Mapper 类和 Reducer 类。

任务3&#xff1a;MapReduce 示例编写规范

  1. 用户编写的程序分成三个部分&#xff1a; Mapper&#xff0c; Reducer&#xff0c; Driver
  2. Mapper 的输入数据是 KV 对的形式&#xff08;KV 的类型可自定义&#xff09;
  3. Mapper 的输出数据是 KV 对的形式&#xff08;KV 的类型可自定义&#xff09;
  4. Mapper 中的业务逻辑写在 map() 方法
  5. MapTask 进程对每一个调用一次map()方法
  6. Reducer 的输入数据类型对应 Mapper 的输出数据类型&#xff0c;也是 KV
  7. Reducer 的输出数据是 KV 对的形式&#xff08;KV 的类型可自定义&#xff09;
  8. Reducer 的业务逻辑写在 reduce() 方法
  9. ReduceTask 进程对每一组相同 k 的组调用一次 reduce() 方法
  10. 用户自定义的 Mapper 和 Reducer 都要继承各自的父类
  11. 整个程序需要一个 Drvier 来进行提交&#xff0c;提交的是一个描述了各种必要信息的 job 对象


推荐阅读
  • 【转】腾讯分析系统架构解析
    TA(TencentAnalytics,腾讯分析)是一款面向第三方站长的免费网站分析系统,在数据稳定性、及时性方面广受站长好评,其秒级的实时数据更新频率也获得业界的认可。本文将从实 ... [详细]
  • Hadoop2.6.0 + 云centos +伪分布式只谈部署
    3.0.3玩不好,现将2.6.0tar.gz上传到usr,chmod-Rhadoop:hadophadoop-2.6.0,rm掉3.0.32.在etcp ... [详细]
  • 一、Hadoop来历Hadoop的思想来源于Google在做搜索引擎的时候出现一个很大的问题就是这么多网页我如何才能以最快的速度来搜索到,由于这个问题Google发明 ... [详细]
  • 如何在mysqlshell命令中执行sql命令行本文介绍MySQL8.0shell子模块Util的两个导入特性importTableimport_table(JS和python版本 ... [详细]
  • MR程序的几种提交运行模式本地模型运行1在windows的eclipse里面直接运行main方法,就会将job提交给本地执行器localjobrunner执行-- ... [详细]
  • 数据对比分析图PPT(127.0.0.1表示什么)的使用方法和意义
    本文介绍了数据对比分析图PPT的使用方法和意义,解释了127.0.0.1的含义,并提供了相关资源下载。同时还讨论了目标管理的概念和MBO的实施方法。 ... [详细]
  • 本文讨论了在手机移动端如何使用HTML5和JavaScript实现视频上传并压缩视频质量,或者降低手机摄像头拍摄质量的问题。作者指出HTML5和JavaScript无法直接压缩视频,只能通过将视频传送到服务器端由后端进行压缩。对于控制相机拍摄质量,只有使用JAVA编写Android客户端才能实现压缩。此外,作者还解释了在交作业时使用zip格式压缩包导致CSS文件和图片音乐丢失的原因,并提供了解决方法。最后,作者还介绍了一个用于处理图片的类,可以实现图片剪裁处理和生成缩略图的功能。 ... [详细]
  • 阿里云虚拟主机安装多个织梦系统的方法
    本文介绍了在阿里云虚拟主机上安装多个织梦系统的方法。通过创建不同名称的文件夹并将不同的域名解析到对应的目录,可以实现多个系统的安装。在安装过程中需要注意修改数据库前缀,并在系统设置中还原数据库。同时还介绍了阿里云虚拟主机二级域名绑定二级目录和域名重定向的用法。 ... [详细]
  • 如何实现JDK版本的切换功能,解决开发环境冲突问题
    本文介绍了在开发过程中遇到JDK版本冲突的情况,以及如何通过修改环境变量实现JDK版本的切换功能,解决开发环境冲突的问题。通过合理的切换环境,可以更好地进行项目开发。同时,提醒读者注意不仅限于1.7和1.8版本的转换,还要适应不同项目和个人开发习惯的需求。 ... [详细]
  • 开发笔记:spring boot项目打成war包部署到服务器的步骤与注意事项
    本文介绍了将spring boot项目打成war包并部署到服务器的步骤与注意事项。通过本文的学习,读者可以了解到如何将spring boot项目打包成war包,并成功地部署到服务器上。 ... [详细]
  • 大数据Hadoop生态(20)MapReduce框架原理OutputFormat的开发笔记
    本文介绍了大数据Hadoop生态(20)MapReduce框架原理OutputFormat的开发笔记,包括outputFormat接口实现类、自定义outputFormat步骤和案例。案例中将包含nty的日志输出到nty.log文件,其他日志输出到other.log文件。同时提供了一些相关网址供参考。 ... [详细]
  • linux进阶50——无锁CAS
    1.概念比较并交换(compareandswap,CAS),是原⼦操作的⼀种,可⽤于在多线程编程中实现不被打断的数据交换操作࿰ ... [详细]
  • Maven构建Hadoop,
    Maven构建Hadoop工程阅读目录序Maven安装构建示例下载系列索引 序  上一篇,我们编写了第一个MapReduce,并且成功的运行了Job,Hadoop1.x是通过ant ... [详细]
  • Hadoop源码解析1Hadoop工程包架构解析
    1 Hadoop中各工程包依赖简述   Google的核心竞争技术是它的计算平台。Google的大牛们用了下面5篇文章,介绍了它们的计算设施。   GoogleCluster:ht ... [详细]
  • mapreduce源码分析总结
    这篇文章总结的非常到位,故而转之一MapReduce概述MapReduce是一个用于大规模数据处理的分布式计算模型,它最初是由Google工程师设计并实现的ÿ ... [详细]
author-avatar
Aaron阿龙_1947_446
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有