hadoop实战(五)MAPREDUCE操作

2024-09-03 23:18
文章标签 实战 操作 hadoop mapreduce

本文主要是介绍hadoop实战(五)MAPREDUCE操作,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一、基础概念

   Maapreduce是一个分布式运算程序的编程框架,是用户开发“基于hadoop的数据分析应用”的核心框架;
Mapreduce核心功能是将用户编写的业务逻辑代码和自带默认组件整合成一个完整的分布式运算程序,并发运行在一个hadoop集群上;

(一)、为什么使用MAPREDUCE

   1、海量数据在单机上处理因为硬件资源限制,无法胜任
   2、一旦将单机版程序扩展到集群来分布式运行,将极大增加程序的复杂度和开发难度
   3、引入mapreduce框架后,开发人员可以将绝大部分工作集中在业务逻辑的开发上,而将分布式计算中的复杂性交由框架来处理

(二)、MAPREDUCE框架结构及核心运行机制

1、框架结构

   (1)、MRAppMaster:负责整个程序的过程调度及状态协调
   (2)、mapTask:负责map阶段的整个数据处理流程
   (3)、ReduceTask:负责reduce阶段的整个数据处理流程

2、流程

   (1)、一个mr程序启动的时候,最先启动的是MRAppMaster,MRAppMaster启动后根据本次job的描述信息,计算出需要的maptask实例数量,然后向集群申请机器启动相应数量的maptask进程
   (2)、maptask进程启动之后,根据给定的数据切片范围进行数据处理,主体流程为:

a)	利用客户指定的inputformat来获取RecordReader读取数据,形成输入KV对
b)	将输入KV对传递给客户定义的map()方法,做逻辑运算,并将map()方法输出的KV对收集到缓存
c)	将缓存中的KV对按照K分区排序后不断溢写到磁盘文件

   (3)、MRAppMaster监控到所有maptask进程任务完成之后,会根据客户指定的参数启动相应数量的reducetask进程,并告知reducetask进程要处理的数据范围(数据分区)
   (4)、Reducetask进程启动之后,根据MRAppMaster告知的待处理数据所在位置,从若干台maptask运行所在机器上获取到若干个maptask输出结果文件,并在本地进行重新归并排序,然后按照相同key的KV为一个组,调用客户定义的reduce()方法进行逻辑运算,并收集运算输出的结果KV,然后调用客户指定的outputformat将结果数据输出到外部存储

(三)、MapTask并行度决定机制

   maptask的并行度决定map阶段的任务处理并发度,进而影响到整个job的处理速度

1、mapTask并行度的决定机制

   一个job的map阶段并行度由客户端在提交job时决定 而客户端对map阶段并行度的规划的基本逻辑为:
将待处理数据执行逻辑切片(即按照一个特定切片大小,将待处理数据划分成逻辑上的多个split),然后每一个split分配一个mapTask并行实例处理</font></br>

   这段逻辑及形成的切片规划描述文件,由FileInputFormat实现类的getSplits()方法完成

2、FileInputFormat切片机制

   (1)、切片定义在InputFormat类中的getSplit()方
   (2)、FileInputFormat中默认的切片机制

a)	简单地按照文件的内容长度进行切片
b)	切片大小,默认等于block大小
c)	切片时不考虑数据集整体,而是逐个针对每一个文件单独切片

   (3)、FileInputFormat中切片的大小的参数配置
   通过分析源码,在FileInputFormat中,计算切片大小的逻辑:Math.max(minSize, Math.min(maxSize, blockSize)); 切片主要由这几个值来运算决定

minsize:默认值:1  配置参数: mapreduce.input.fileinputformat.split.minsize    
maxsize:默认值:Long.MAXValue  配置参数:mapreduce.input.fileinputformat.split.maxsize
blocksize

   因此,默认情况下,切片大小=blocksize

maxsize(切片最大值):
参数如果调得比blocksize小,则会让切片变小,而且就等于配置的这个参数的值
minsize (切片最小值):
参数调的比blockSize大,则可以让切片变得比blocksize还大选择并发数的影响因素:
1、运算节点的硬件配置
2、运算任务的类型:CPU密集型还是IO密集型
3、运算任务的数据量
   reducetask的并行度影响整个job的执行并发度和执行效率,但与maptask的并发数由切片数决定不同,Reducetask数量的决定是可以直接手动设置:
//默认值是1,手动设置为4
job.setNumReduceTasks(4);
   如果数据分布不均匀,就有可能在reduce阶段产生数据倾斜
注意: reducetask数量并不是任意设置,还要考虑业务逻辑需求,有些情况下,需要计算全局汇总结果,就只能有1个reducetask
尽量不要运行太多的reduce task。对大多数job来说,最好rduce的个数最多和集群中的reduce持平,或者比集群的 reduce slots小。这个对于小集群而言,尤其重要。

二、MAPREDUCE 编程规范及示例

(一)、编程规范

(1)用户编写的程序分成三个部分:Mapper,Reducer,Driver(提交运行mr程序的客户端)
(2)Mapper的输入数据是KV对的形式(KV的类型可自定义)
(3)Mapper的输出数据是KV对的形式(KV的类型可自定义)
(4)Mapper中的业务逻辑写在map()方法中
(5)map()方法(maptask进程)对每一个<K,V>调用一次
(6)Reducer的输入数据类型对应Mapper的输出数据类型,也是KV
(7)Reducer的业务逻辑写在reduce()方法中
(8)Reducetask进程对每一组相同k的<k,v>组调用一次reduce()方法
(9)用户自定义的Mapper和Reducer都要继承各自的父类
(10)整个程序需要一个Drvier来进行提交,提交的是一个描述了各种必要信息的job对象

(二)、wordcount程序展示

   (1)定义一个mapper:

public class WordCountMapper extends Mapper<LongWritable, Text, Text, IntWritable>{//map方法的生命周期:  框架每传一行数据就被调用一次//key :  这一行的起始点在文件中的偏移量//value: 这一行的内容@Overrideprotected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {//拿到一行数据转换为stringString line = value.toString();//将这一行切分出各个单词String[] words = line.split(" ");//遍历数组,输出<单词,1>for(String word:words){context.write(new Text(word), new IntWritable(1));}}
}

   (2)定义一个reducer类

@Overrideprotected void reduce(Text key, Iterable<IntWritable> values, Context context) throws IOException, InterruptedException {//定义一个计数器int count = 0;//遍历这一组kv的所有v,累加到count中for(IntWritable value:values){count += value.get();}context.write(key, new IntWritable(count));}
}
   (3)定义一个主类,用来描述job并提交job
public class WordCountRunner {//把业务逻辑相关的信息(哪个是mapper,哪个是reducer,要处理的数据在哪里,输出的结果放哪里……)描述成一个job对象//把这个描述好的job提交给集群去运行public static void main(String[] args) throws Exception {Configuration conf = new Configuration();Job wcjob = Job.getInstance(conf);//指定我这个job所在的jar包
//		wcjob.setJar("/home/hadoop/wordcount.jar");wcjob.setJarByClass(WordCountRunner.class);wcjob.setMapperClass(WordCountMapper.class);wcjob.setReducerClass(WordCountReducer.class);//设置我们的业务逻辑Mapper类的输出key和value的数据类型wcjob.setMapOutputKeyClass(Text.class);wcjob.setMapOutputValueClass(IntWritable.class);//设置我们的业务逻辑Reducer类的输出key和value的数据类型wcjob.setOutputKeyClass(Text.class);wcjob.setOutputValueClass(IntWritable.class);//指定要处理的数据所在的位置FileInputFormat.setInputPaths(wcjob, "hdfs://hdp-server01:9000/wordcount/data/big.txt");//指定处理完成之后的结果所保存的位置FileOutputFormat.setOutputPath(wcjob, new Path("hdfs://hdp-server01:9000/wordcount/output/"));//向yarn集群提交这个jobboolean res = wcjob.waitForCompletion(true);System.exit(res?0:1);}

(三)、运行模式

1、本地运行模式

   (1)mapreduce程序是被提交给LocalJobRunner在本地以单进程的形式运行

   (2)而处理的数据及输出结果可以在本地文件系统,也可以在hdfs上
   (3)怎样实现本地运行?写一个程序,不要带集群的配置文件(本质是你的mr程序的conf中是否有mapreduce.framework.name=local以及yarn.resourcemanager.hostname参数)
   (4)本地模式非常便于进行业务逻辑的debug

2、集群运行模式

   (1)将mapreduce程序提交给yarn集群resourcemanager,分发到很多的节点上并发执行
   (2)处理的数据和输出结果应该位于hdfs文件系统
   (3)提交集群的实现步骤:

A、将程序打成JAR包,然后在集群的任意一个节点上用hadoop命令启动$ hadoop jar wordcount.jar cn.itcast.bigdata.mrsimple.WordCountDriver inputpath outputpath
B、直接在linux的eclipse中运行main方法
(项目中要带参数:mapreduce.framework.name=yarn以及yarn的两个基本配置)
C、如果要在windows的eclipse中提交job给集群,则要修改YarnRunner类

(四) MAPREDUCE中的Combiner

   (1)combiner是MR程序中Mapper和Reducer之外的一种组件
   (2)combiner组件的父类就是Reducer
   (3)combiner和reducer的区别在于运行的位置:Combiner是在每一个maptask所在的节点运行,Reducer是接收全局所有Mapper的输出结果;
   (4)combiner的意义就是对每一个maptask的输出进行局部汇总,以减小网络传输量

具体实现步骤:
1、	自定义一个combiner继承Reducer,重写reduce方法
2、	在job中设置:  job.setCombinerClass(CustomCombiner.class)
   (5)combiner能够应用的前提是不能影响最终的业务逻辑 而且,combiner的输出kv应该跟reducer的输入kv类型要对应起来

(五)、mapreduce的shuffle机制

1、概述:

   mapreduce中,map阶段处理的数据如何传递给reduce阶段,是mapreduce框架中最关键的一个流程,这个流程就叫shuffle;    将maptask输出的处理结果数据,分发给reducetask,并在分发的过程中,对数据按key进行了分区和排序;

2、主要流程

   shuffle是MR处理流程中的一个过程,它的每一个处理步骤是分散在各个map task和reduce task节点上完成的,整体来看,分为3个操作:

1、分区partition
2、Sort根据key排序
3、Combiner进行局部value的合并

3、详细流程

   1、maptask收集我们的map()方法输出的kv对,放到内存缓冲区中
   2、从内存缓冲区不断溢出本地磁盘文件,可能会溢出多个文件
   3、多个溢出文件会被合并成大的溢出文
   4、在溢出过程中,及合并的过程中,都要调用partitoner进行分组和针对key进行排序
   5、reducetask根据自己的分区号,去各个maptask机器上取相应的结果分区数据
   6、reducetask会取到同一个分区的来自不同maptask的结果文件,reducetask会将这些文件再进行合并(归并排序)
   7、合并成大文件后,shuffle的过程也就结束了,后面进入reducetask的逻辑运算过程(从文件中取出一个一个的键值对group,调用用户自定义的reduce()方法)
   Shuffle中的缓冲区大小会影响到mapreduce程序的执行效率,原则上说,缓冲区越大,磁盘io的次数越少,执行速度就越快
缓冲区的大小可以通过参数调整, 参数:io.sort.mb 默认100M

(六)、YARN

1、概述

   Yarn是一个资源调度平台,负责为运算程序提供服务器运算资源,相当于一个分布式的操作系统平台,而mapreduce等运算程序则相当于运行于操作系统之上的应用程序

2、概念

   1、yarn并不清楚用户提交的程序的运行机制
   2、yarn只提供运算资源的调度(用户程序向yarn申请资源,yarn就负责分配资源)
   3、yarn中的主管角色叫ResourceManager
   4、yarn中具体提供运算资源的角色叫NodeManager
   5、这样一来,yarn其实就与运行的用户程序完全解耦,就意味着yarn上可以运行各种类型的分布式运算程序(mapreduce只是其中的一种),比如mapreduce、storm程序,spark程序,tez ……
   6、所以,spark、storm等运算框架都可以整合在yarn上运行,只要他们各自的框架中有符合yarn规范的资源请求机制即可
   7、Yarn就成为一个通用的资源调度平台,从此,企业中以前存在的各种运算集群都可以整合在一个物理集群上,提高资源利用率,方便数据共享

这篇关于hadoop实战(五)MAPREDUCE操作的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1134329

相关文章

Spring Boot + MyBatis Plus 高效开发实战从入门到进阶优化(推荐)

《SpringBoot+MyBatisPlus高效开发实战从入门到进阶优化(推荐)》本文将详细介绍SpringBoot+MyBatisPlus的完整开发流程,并深入剖析分页查询、批量操作、动... 目录Spring Boot + MyBATis Plus 高效开发实战:从入门到进阶优化1. MyBatis

MyBatis 动态 SQL 优化之标签的实战与技巧(常见用法)

《MyBatis动态SQL优化之标签的实战与技巧(常见用法)》本文通过详细的示例和实际应用场景,介绍了如何有效利用这些标签来优化MyBatis配置,提升开发效率,确保SQL的高效执行和安全性,感... 目录动态SQL详解一、动态SQL的核心概念1.1 什么是动态SQL?1.2 动态SQL的优点1.3 动态S

Mysql表的简单操作(基本技能)

《Mysql表的简单操作(基本技能)》在数据库中,表的操作主要包括表的创建、查看、修改、删除等,了解如何操作这些表是数据库管理和开发的基本技能,本文给大家介绍Mysql表的简单操作,感兴趣的朋友一起看... 目录3.1 创建表 3.2 查看表结构3.3 修改表3.4 实践案例:修改表在数据库中,表的操作主要

C# WinForms存储过程操作数据库的实例讲解

《C#WinForms存储过程操作数据库的实例讲解》:本文主要介绍C#WinForms存储过程操作数据库的实例,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、存储过程基础二、C# 调用流程1. 数据库连接配置2. 执行存储过程(增删改)3. 查询数据三、事务处

Pandas使用SQLite3实战

《Pandas使用SQLite3实战》本文主要介绍了Pandas使用SQLite3实战,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学... 目录1 环境准备2 从 SQLite3VlfrWQzgt 读取数据到 DataFrame基础用法:读

Java使用Curator进行ZooKeeper操作的详细教程

《Java使用Curator进行ZooKeeper操作的详细教程》ApacheCurator是一个基于ZooKeeper的Java客户端库,它极大地简化了使用ZooKeeper的开发工作,在分布式系统... 目录1、简述2、核心功能2.1 CuratorFramework2.2 Recipes3、示例实践3

Java利用JSONPath操作JSON数据的技术指南

《Java利用JSONPath操作JSON数据的技术指南》JSONPath是一种强大的工具,用于查询和操作JSON数据,类似于SQL的语法,它为处理复杂的JSON数据结构提供了简单且高效... 目录1、简述2、什么是 jsONPath?3、Java 示例3.1 基本查询3.2 过滤查询3.3 递归搜索3.4

Python使用DrissionPage中ChromiumPage进行自动化网页操作

《Python使用DrissionPage中ChromiumPage进行自动化网页操作》DrissionPage作为一款轻量级且功能强大的浏览器自动化库,为开发者提供了丰富的功能支持,本文将使用Dri... 目录前言一、ChromiumPage基础操作1.初始化Drission 和 ChromiumPage

利用Go语言开发文件操作工具轻松处理所有文件

《利用Go语言开发文件操作工具轻松处理所有文件》在后端开发中,文件操作是一个非常常见但又容易出错的场景,本文小编要向大家介绍一个强大的Go语言文件操作工具库,它能帮你轻松处理各种文件操作场景... 目录为什么需要这个工具?核心功能详解1. 文件/目录存javascript在性检查2. 批量创建目录3. 文件

Redis中管道操作pipeline的实现

《Redis中管道操作pipeline的实现》RedisPipeline是一种优化客户端与服务器通信的技术,通过批量发送和接收命令减少网络往返次数,提高命令执行效率,本文就来介绍一下Redis中管道操... 目录什么是pipeline场景一:我要向Redis新增大批量的数据分批处理事务( MULTI/EXE