yarn/mapreduce工作机制及mapreduce客户端代码编写
首先需要知道的就是在老版本的hadoop中是没有yarn的,mapreduce既负责资源分配又负责业务逻辑处理。为了解耦,把资源分配这块抽了出来,形成了yarn,这样不仅mapreudce可以用yarn,其他运算体系也可以用yarn,比如说storm、spark。
把我们编写好的符合mapreduce编程规范的代码打成jar包,上传到ResourceManager节点。执行 hadoop jar xxx.jar mainClass(这里用mainClass代表main类) 后,会有一个RunJar进程向ResourceManager节点申请执行此job,ResourceManager会返回该job相关资源提交的路径和为此job分配的jobID。RunJar进程会向把资源提交到指定目录并向ResourceManager汇报提交结果。ResourceManager收到提交结果,如果提交结果为成功的话,则把本job加入到任务队列中。NodeManager会定期扫描任务队列,如果发现需要自己参与的任务,则领取该任务,并给此任务分配一定的资源(内存、cpu等)。之后就该MapReduce框架发挥作用了(mapreduce程序需要先执行map再执行reduce,而yarn是不关心这些的,解耦),MapReduce会产生一个MRAppMaster进程来管理map程序和reduce程序的执行。
mapreduce客户端程序编写:
先引入jar包,同hdfs客户端程序编写一样,还是只引入hadoop-client依赖即可,如下
<!-- https://mvnrepository.com/artifact/org.apache.hadoop/hadoop-client -->
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-client</artifactId>
<version>2.7.4</version>
</dependency>
这样项目中就有了yarn相关jar包(hadoop-yarn-api-2.7.4.jar、hadoop-yarn-client-2.7.4.jar、hadoop-yarn-common-2.7.4.jar、hadoop-yarn-server-common-2.7.4.jar)和mapreduce相关jar包(hadoop-mapreduce-client-app-2.7.4.jar、hadoop-mapreduce-client-common-2.7.4.jar、hadoop-mapreduce-client-core-2.7.4.jar、hadoop-mapreduce-client-jobclient-2.7.4.jar、hadoop-mapreduce-client-shuffle-2.7.4.jar)。
mapreduce程序需要分为map和reduce,还要用一个main类,在main方法中把同一个job的map和reduce绑定起来,因为很可能有多个map和reudce。
下面以一个小需求为例来编写入门代码:
需求:在hdfs上 /logs/ 目录下有很多很大的日志文件,统计一下在这些日志文件中出现的单词及每个单词出现的次数。
map类代码:
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Mapper; import java.util.Arrays; public class WCMapper extends Mapper<LongWritable, Text, Text, LongWritable> {
private Log LOGGER = LogFactory.getLog(getClass()); //mapreduce框架每读一行数据就调用一次本方法,key是这一行数据的偏移量,value是这一行的文本内容
@Override
protected void map(LongWritable key, Text value, Context context) {
//逐个输出为key value形式,key 是单词,value是1
Arrays.asList(value.toString()).stream().map(Text::new).forEach(w -> {
try {
context.write(w, new LongWritable(1));
} catch (Exception e) {
LOGGER.error("", e);
}
});
}
}
map类需要继承Mapper(org.apache.hadoop.mapreduce.Mapper,在hadoop-mapreduce-client-core-2.7.4.jar包中),只需要实现Mapper的一个map()方法。重写的map()方法在mapreduce框架每读取一行数据时都会调用一次,第一个参数值就是这一行数据的偏移量,其实就是这一行第一个字符的在整个文档中的索引(从0开始),第二个参数值就是这一行数据的文本内容,在map()方法中把读取到的数据按空格分割成单词数组后,再调用Mapper类的Context内部类的实例方法write(),按照键值对的方式(键是单词,值是1,其实2,3,4都行,只要是个固定的值),一个个的传输给mapreduce框架。读取的源文件及其路径在main类中配置。
备注:LongWritable(org.apache.hadoop.io.LongWritable,在hadoop-common-2.7.4.jar中)是hadoop对long型数据的包装,Text(org.apache.hadoop.io.Text,也在hadoop-common-2.7.4.jar中)是hadoop对String类型数据的包装。
reduce类代码:
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Reducer; import java.util.Arrays; public class WCReducer extends Reducer<Text, LongWritable, Text, LongWritable> {
private Log LOGGER = LogFactory.getLog(getClass()); //框架在map处理完成之后,将所有kv对缓存起来,进行分组,然后传递一个组调用一次reduce方法
@Override
protected void reduce(Text key, Iterable<LongWritable> values, Context context) {
try {
context.write(key, new LongWritable(Arrays.asList(values).size()));
} catch (Exception e) {
LOGGER.error("", e);
}
}
}
reduce类需要继承Reducer(org.apache.hadoop.mapreduce.Reducer,也在hadoop-mapreduce-client-core-2.7.4.jar包中),也只需要实现Reducer的一个reduce()方法。mapreduce框架在所有nodemanager节点上的map()方法执行完之后,将所有的key-value对缓存起来,进行分组后作为入参传递给reduce()方法,每传递一个组就会调用一次reduce()方法(也就是说,如果文件中有100个不同的单词,就要调用100次reduce()方法),reduce()方法执行完之后就会将结果输出到指定的文件中,文件路径在main类中配置。
main类代码:
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat; /**
* 用来描述一个特定的作业,比如该作业使用哪个类作为逻辑处理中的map,哪个作为reduce,还可以指定该作业要处理的数据所在的路径,还可以指定该作业输出的结果放到哪个路径
*/
public class WCRunner {
private static Log LOGGER = LogFactory.getLog(WCRunner.class); public static void main(String[] args) throws Exception {
try {
LOGGER.info("HADOOP_HOME: " + System.getProperty("hadoop.home.dir"));
Configuration conf = new Configuration();
conf.set("fs.defaultFS", "hdfs://centos1:9000");
//获取job实例
Job wcJob = Job.getInstance(conf); //设置整个job所用的类在哪个jar包
wcJob.setJarByClass(WCRunner.class);
//设置map类
wcJob.setMapperClass(WCMapper.class);
//设置reduce类
wcJob.setReducerClass(WCReducer.class); //设置job reduce类输出key的类型
wcJob.setOutputKeyClass(Text.class);
//设置job reduce类输出value的类型
wcJob.setOutputValueClass(LongWritable.class);
//设置job map类输出key的类型
wcJob.setMapOutputKeyClass(Text.class);
//设置job map类输出value的类型
wcJob.setMapOutputValueClass(LongWritable.class); //指定要处理的原始数据存放在哪里
FileInputFormat.setInputPaths(wcJob, "/logs/");
//指定处理结果放在哪里
FileOutputFormat.setOutputPath(wcJob, new Path("/wc/output/")); //将job提交给集群运行
wcJob.waitForCompletion(true);
} catch (Exception e) {
LOGGER.error("", e);
}
}
}
main类在main方法中先是通过org.apache.hadoop.mapreduce.Job类的 getInstance(Configuration conf) 静态方法获取一个Job实例,然后设置这个实例的各种属性,最后再调用waitForCompletion(boolean verbose)实例方法把任务提交给集群并等待任务执行完毕。
至此,代码已写完。
把这三个类打成jar包,上传到resourceManager节点,执行命令 hadoop jar xxx.jar mainClass。这样mapreduce就会处理hdfs /logs目录中的文件并把结果输出到hdfs /wc/output目录的某个文件中。
yarn/mapreduce工作机制及mapreduce客户端代码编写的更多相关文章
- hadoop知识点总结(一)hadoop架构以及mapreduce工作机制
1,为什么需要hadoop 数据分析者面临的问题 数据日趋庞大,读写都出现性能瓶颈: 用户的应用和分析结果,对实时性和响应时间要求越来越高: 使用的模型越来越复杂,计算量指数级上升. 期待的解决方案 ...
- MapReduce工作机制——Word Count实例(一)
MapReduce工作机制--Word Count实例(一) MapReduce的思想是分布式计算,也就是分而治之,并行计算提高速度. 编程思想 首先,要将数据抽象为键值对的形式,map函数输入键值对 ...
- MapReduce06 MapReduce工作机制
目录 5 MapReduce工作机制(重点) 5.1 MapTask工作机制 5.2 ReduceTask工作机制 5.3 ReduceTask并行度决定机制 手动设置ReduceTask数量 测试R ...
- hadoop MapReduce 工作机制
摸索了将近一个月的hadoop , 在centos上配了一个伪分布式的环境,又折腾了一把hadoop eclipse plugin,最后终于实现了在windows上编写MapReduce程序,在cen ...
- MapRdeuce&Yarn的工作机制(YarnChild是什么)
MapRdeuce&Yarn的工作机制 一幅图解决你所有的困惑 那天在集群中跑一个MapReduce的程序时,在机器上jps了一下发现了每台机器中有好多个YarnChild.困惑什么时Yarn ...
- MapReduce工作机制
MapReduce是什么? MapReduce是一种分布式计算模型,由Google提出,主要用于搜索领域,MapReduce程序本质上是并行运行的,因此可以解决海量数据的计算问题. MapReduce ...
- 浅谈MapReduce工作机制
1.MapTask工作机制 整个map阶段流程大体如上图所示.简单概述:input File通过getSplits被逻辑切分为多个split文件,通通过RecordReader(默认使用lineRec ...
- Watcher详解 工作机制, Watcher客户端注册、Watcher 服务端注册
Watcher详解.接口 在 ZooKeeper 中, 接口类 Watcher 用于表示一个标注你的事件处理器,其定义了事件通知相关的逻辑,包含 KeeperState 和 EventType 两个枚 ...
- HBase 协处理器编程详解,第二部分:客户端代码编写
实现 Client 端代码 HBase 提供了客户端 Java 包 org.apache.hadoop.hbase.client.coprocessor.它提供以下三种方法来调用协处理器提供的服务: ...
随机推荐
- FactoryMethodPattern(23种设计模式之一)
设计模式六大原则(1):单一职责原则 设计模式六大原则(2):里氏替换原则 设计模式六大原则(3):依赖倒置原则 设计模式六大原则(4):接口隔离原则 设计模式六大原则(5):迪米特法则 设计模式六大 ...
- EZOJ #87
传送门 分析 由于我不知道壶里到底有多少水,那么显然我第一次 分别向两个杯子分别到 L/2 +1 和 L/2 才是最优的.(这样既维护了两个人的差值不超1,又正好倒了L的水).那么接下来如果壶里还有水 ...
- Luogu 4151 [WC2011]最大XOR和路径
你谷又乱评分…… 首先发现答案只有可能是从$1$开始走到$n$,中间绕若干个环,然后使它取到的异或值最大. 这样子的话我们可以随便先取一条路径,强制选择走这条路径,然后把所有的环都丢进线性基里面去,因 ...
- python3-打印一个进度条
# Auther: Aaron Fan import sys,time for i in range(30): #打印一个#号,这种方法打印不会自动换行 sys.stdout.write('#') # ...
- python中的作用域与名称空间
python中的名称空间以及作用域分析 从Python解释器开始执行之后,就在内存中开辟一个空间,每当遇到一个变量的时候,就把变量名和值之间对应的关系记录下来,但是当遇到函数定义的时候,解释器只是象征 ...
- 11.PowerSploit攻击指南
本人小白,写这篇文章主要记录一下自己的PowerShell学习之路,大牛请绕道:https://www.anquanke.com/subject/id/90541 首先PowerShell的攻击工具有 ...
- Microsoft.Baidu.Ali.语音识别/人脸识别
在第一篇博客里提过图片识别的底层.最精准的图片识别需要海量的数据磨炼.自己写的底层没有以亿为单位的数据支持其实也是个残废品. 此篇不是为了教学.而且在需要的时候抄下来就能用 在此介绍Microsoft ...
- passing parameter to an event handler [stackoverflow]
Q: i want to pass my List<string> as parameter using my event public event EventHandler _newFi ...
- docker,mysql,Navicat
Navicat破解网址 https://www.jianshu.com/p/5f693b4c9468 docker pull mysql docker run -d -p 3306:3306 --n ...
- CSS3 -- FlexBox(弹性盒子)
盒子模型 CSS中有一种基础设计模式叫盒模型,盒模型定义了Web页面中的元素如何来解析. 在盒模型中主要包括width.height.border.background.padding和margin这 ...