3 MapReduce计算模型

MapReduce被广泛应用于日志分析、海量数据排序、在海量数据中查找特定模式等场景中。


MapReduceJob

在Hadoop中,每个MapReduce任务都被初始化为一个Job。

每个Job又可以分为两个阶段:Map阶段和Reduce阶段。这两个阶段分别用Map函数和Reduce函数来表示。

Map函数接收一个<key,value>形式的输入,然后产生另一种<key,value>的中间输出,Hadoop负责将所有具有相同中间key值的value集合到一起传递给Reduce函数;Reduce函数接收一个如<key,(list of values)>形式的输入,然后对这个value集合进行处理并输出结果,Reduce的输出也是<key,value>形式的。


InputFormat()和InputSplit

InputSplit是Hadoop中用来把输入数据传送给每个单独的Map,InputSplit存储的并非数据本身,而是起始位置、分片长度和一个记录数据所在主机的数组。生成InputSplit的方法可以通过InputFormat()来设置。当数据传送给Map时,Map会将输入分片传送到InputFormat()上,InputFormat调用getRecordReader()方法生成RecordReader,RecordReader在通过creatKey()、createValue()方法将InputSplit创建成可供Map处理的<key,value>对。即,InputFormat()方法是用来生成可供Map处理的<key,value>对的。

InputFormat

    BaileyBorweinPlouffe.BbpInputFormat

    ComposableInputFormat

    CompositeInputFormat

    DBInputFormat

    DistSum.Machine.AbstractInputFormat

    FileInputFormat

        CombineFileInputFormat

        KeyValueTextInputFormat

        NLineInputFormat

        SequenceFileInputFormat

        TeraInputFormat

        TextInputFormat


TextInputFormat是Hadoop默认的输入方式。在TextInputFormat中,每个文件(或其一部分)都会单独作为Map的输入,而这是继承自FileInputFormat的。之后,每行数据都会生成一条记录,每条记录则表示成<key,value>形式。

key值是每个数据记录在数据分片中的字节偏移量,数据类型是LongWritable;

value值是每行的内容,数据类型是Text。

如:

file1:

0 hello world bye world

file2:

0 hello hadoop bye hadoop

两个文件都会被单独输入到一个Map中,因此它们的值都是0。


OutputFormat()

默认的输出格式是TextOutputFormat,每条记录以一行的形式存入文本文件,键和值是任意形式的,程序内部调用toString()方法将键和值转换为String类型再输出。


Map函数和Reduce函数:

public class WordCountMapper extends Mapper<LongWritable, Text, Text, IntWritable>{protected void map(LongWritable key, Text value,Context context)throws IOException, InterruptedException {String[] words = StringUtils.split(value.toString(), ' ');for(String w :words){context.write(new Text(w), new IntWritable(1));}}
}

public class WordCountReducer 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=sum+i.get();}arg2.write(key, new IntWritable(sum));}
}
public class RunJob {public static void main(String[] args) {Configuration config =new Configuration();
//      config.set("fs.defaultFS", "hdfs://node1:8020");
//      config.set("yarn.resourcemanager.hostname", "node1");config.set("mapred.jar", "C:\\Users\\Administrator\\Desktop\\wc.jar");try {FileSystem fs =FileSystem.get(config);Job job =Job.getInstance(config);job.setJarByClass(RunJob.class);job.setJobName("wc");job.setMapperClass(WordCountMapper.class);job.setReducerClass(WordCountReducer.class);job.setMapOutputKeyClass(Text.class);job.setMapOutputValueClass(IntWritable.class);FileInputFormat.addInputPath(job, new Path("/usr/input/"));Path outpath =new Path("/usr/output/wc");if(fs.exists(outpath)){fs.delete(outpath, true);}FileOutputFormat.setOutputPath(job, outpath);boolean f= job.waitForCompletion(true);if(f){System.out.println("job completion");}} catch (Exception e) {e.printStackTrace();}}
}


注意两种情况:

1、Reduce Task的数量可以由程序指定,当存在多个Reduce Task时,每个Reduce会搜集一个或多个key值。当存在多个Reduce Task时,每个Reduce Task都会生成一个输出文件;

2、没有Reduce任务的时候,系统会直接将Map的输出结果作为最终结果,有多少个Map就有多少个输出。


MapReduce任务的优化

如何完成这个任务,怎么能让程序运行的更快。

MapReduce计算模型的优化主要集中在两个方面:计算性能方面;IO操作方面。


1、任务调度;

计算方面:优先将任务分配给空闲机器;

IO方面:尽量将Map任务分配给InputSplit所在的机器。


2、数据预处理与InputSplit的大小

MapReduce擅长处理少量的大数据,在处理大量的小数据时性能会很逊色。

因此在提交MapReduce任务前可以先对数据进行一次预处理,将数据合并以提高MapReduce任务的执行效率。

另一方面是参考Map任务的运行时间,当一个Map任务只需要运行几秒就可以结束时,就需要考虑是否应该给它分配更多的数据。通常而言,一个Map任务的运行时间在一分钟左右比较合适。

在FileInputFormat中(除了CombineFileInputFormat),Hadoop会在处理每个Block后将其作为一个InputSplit,因此合理地设置block块大小是很重要的调节方式。


3、Map和Reduce任务的数量

Map/Reduce任务槽:集群能够同时运行的Map/Reduce任务的最大数量。

如100台机器,每台最多同时运行10个Map和5个Reduce,则Map任务槽为1000,Reduce任务槽为500。

设置Map任务的数量主要参考的是Map的运行时间,设置Reduce任务的数量主要参考的是Reduce槽的数量。

Reduce任务槽的0.95倍,如果一个Reduce任务失败,可以很快找到一个空闲的机器重新执行;

Reduce任务槽的1.75倍,执行快的机器可以获得更多的Reduce任务,因此可以使负载更加均衡,以提高任务的处理速度。


4、Combine函数

用于本地合并数据,以减少网络IO操作的消耗。

合理的设计combine函数会有效减少网络传输的数据量,提高MapReduce的效率。

job.setCombinerClass(combine.class);

在WordCount中,可以指定Reduce类为combine函数:

job.setCombinerClass(Reduce.class);


5、压缩

可以选择对Map的输出和最终的输出结果进行不同压缩方式的压缩。

在一些情况下,Map的中间输出可能会很大,对其进行压缩可以有效地减少网络上的数据传输量。


6、自定义comparator

自定义Hadoop数据类型时,推荐自定义comparator来实现数据的比较,这样可以省去数据序列化和反序列化的时间,提高程序的运行效率。






本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/387172.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ionic3 调用本地相册并上传图片

前言在APP中启动相册选择器或者拍照上传图片这些功能是非常常见的。对于Ionic2&#xff0c;我们只能通过cordova插件实现调用原生的功能。下面将简单的封装一个选择相册或拍照上传图片的ImgService服务。具体如下。 Cordova准备下载安装所需的Cordovar插件&#xff1a; Image P…

Mapreduce中maptask过程详解

一、Maptask并行度与决定机制 1.一个job任务的map阶段的并行度默认是由该任务的大小决定的&#xff1b; 2.一个split切分分配一个maprask来并行处理&#xff1b; 3.默认情况下&#xff0c;split切分的大小等于blocksize大小&#xff1b; 4.切片不是mapper类中对单词的切片&…

4 开发MapReduce应用程序

系统参数配置 Configuration类由源来设置&#xff0c;每个源包含以XML形式出现的一系列属性/值对。如&#xff1a; configuration-default.xml configuration-site.xml Configuration conf new Configuration(); conf.addResource("configuraition-default.xml"…

实用的HTML5的上传图片方法

<input type"file" accept"video/*;capturecamcorder"> <input type"file" accept"audio/*;capturemicrophone"><input type"file" accept"image/*;capturecamera">直接调用相机<input type…

3.11 列出完数

完数&#xff1a;一个数恰好等于不包括自身的所有不同因子之和。如6123。 输入&#xff1a;每一行含有一个整数n。 输出&#xff1a;对每个整数n&#xff0c;输出所有不大于n的完数。输出格式为&#xff1a;整数n&#xff0c;冒号&#xff0c;空格&#xff0c;完数&#xff0…

angularjs 上传

xxx.module.ts模块 import { NgModule} from “angular/core”; import { FileUploadModule } from “ng2-file-upload” ; import { XXXComponent } from “./xxx.component”; NgModule({ imports:[ FileUploadModule ], declarations:[ XXXComponent &#xff0c;/component…

PHPCMS的产品筛选功能

如下图所示功能&#xff1a; 首先&#xff0c;用下面这些代码替换掉phpcms/libs/functions/extention.func.php的内容 <?php /*** extention.func.php 用户自定义函数库** copyright (C) 2005-2010 PHPCMS* license http://www.phpcms.cn/licen…

框架使用SpringBoot + Spring Security Oauth2 +PostMan

框架使用SpringBoot Spring Security Oauth2 主要完成了客户端授权 可以通过mysql数据库读取当前客户端表信息进行验证&#xff0c;token存储在数据库中 1.引入依赖 oauth2 依赖于spring security&#xff0c;需要引入spring&#xff0c; mysql&#xff0c;redis&#xff0c; …

3.12 12!配对

找出输入数据中所有两两相乘的积为12!的个数。 输入样例&#xff1a; 1 10000 159667200 9696 38373635 1000000 479001600 3 1 479001600 输出样例&#xff1a; 3 有3对&#xff1a; 1 479001600 1 479001600 3 159667200 #include<iostream> #include<fstre…

程序员自身价值值这么多钱么?

xx 网络公司人均奖金 28 个月…… xx 科技公司人均奖金 35 个月…… 每到年底&#xff0c;这样的新闻在互联网业内简直是铺天盖地。那些奖金不高的程序员们一边羡慕嫉妒&#xff0c;一边暗暗比较一下自己的身价&#xff0c;考虑是不是该跳槽了。 不同水平的程序员&#xff0c;薪…

3.13 判读是否是对称素数

输入&#xff1a;11 101 272 输出&#xff1a; Yes Yes No #include<fstream> #include<iostream> #include<sstream> #include<string> #include<cmath> using namespace std;bool isPrime(int); bool isSymmetry(int);int main(){ifstream…

Spring MVC中使用 Swagger2 构建Restful API

0.Spring MVC配置文件中的配置[java] view plaincopy<!-- 设置使用注解的类所在的jar包&#xff0c;只加载controller类 --> <span style"white-space:pre"> </span><context:component-scan base-package"com.jay.plat.config.contro…

Go语言规范汇总

目录 统一规范篇合理规划目录GOPATH设置import 规范代码风格大小约定命名篇基本命令规范项目目录名包名文件名常量变量变量申明变量命名惯例全局变量名局部变量名循环变量结构体(struct)接口名函数和方法名参数名返回值开发篇包魔鬼数字常量 & 枚举结构体运算符函数参数返回…

3.14 01串排序

将01串首先按照长度排序&#xff0c;其次按1的个数的多少排序&#xff0c;最后按ASCII码排序。 输入样例&#xff1a; 10011111 00001101 10110101 1 0 1100 输出样例&#xff1a; 0 1 1100 1010101 00001101 10011111 #include<fstream> #include<iost…

platform(win32) 错误

运行cnpm install后&#xff0c;出现虽然提示不适合Windows&#xff0c;但是问题好像是sass loader出问题的。所以只要执行下面命令即可&#xff1b;方案一&#xff1a;cnpm rebuild node-sass #不放心可以重新安装下 cnpm install方案二&#xff1a;npm update npm install no…

Error: Program type already present: okhttp3.Authenticator$1

在app中的build.gradle中加入如下代码&#xff0c; configurations {all*.exclude group: com.google.code.gsonall*.exclude group: com.squareup.okhttp3all*.exclude group: com.squareup.okioall*.exclude group: com.android.support,module:support-v13 } 如图 转载于:ht…

3.15 排列对称串

筛选出对称字符串&#xff0c;然后将其排序。 输入样例&#xff1a; 123321 123454321 123 321 sdfsdfd 121212 \\dd\\ 输出样例 123321 \\dd\\ 123454321 #include<fstream> #include<iostream> #include<string> #include<set> using …

ES6规范 ESLint

在团队的项目开发过程中&#xff0c;代码维护所占的时间比重往往大于新功能的开发。因此编写符合团队编码规范的代码是至关重要的&#xff0c;这样做不仅可以很大程度地避免基本语法错误&#xff0c;也保证了代码的可读性&#xff0c;毕竟&#xff1a;程序是写给人读的&#xf…

前端 HTML 常用标签 head标签相关内容 script标签

script标签 定义JavaScript代码 <!--定义JavaScript代码--> <script type"text/javascript"></script> 引入JavaScript文件 src""引入的 js文件路径 <!-- 引入JavaScript文件 --> <script src"./index.js"></s…

3.16 按绩点排名

成绩60分及以上的课程才予以计算绩点 绩点计算公式&#xff1a;[(课程成绩-50) / 10 ] * 学分 学生总绩点为所有绩点之和除以10 输入格式&#xff1a; 班级数 课程数 各个课程的学分 班级人数 姓名 各科成绩 输出格式&#xff1a; class 班级号: 姓名&#xff08;占1…