MR on yarn(container 调优)

文章目录

  • MapReduce
      • 1. linux机制
      • 2.map与reduce个数
        • 2.1. map个数确定
        • 2.2. 谁来划分split
        • 2.3. reduce个数确定
      • 3.container
        • 3.1 container 调优
        • 3.2 container 内存设置参数
        • 3.3 container vcore
        • 3.4 生产如何设置
        • 3.5 整合memory cpu
      • 4 map on yarn 架构
      • 5 MapReduce工作原理读后感
        • 5.1 main函数调用
        • 5.2 MapReduce运行过程
        • 5.3 MapReduce 逻辑运行
      • 6 sla讲解

MapReduce

分布式计算框架,生产开发复杂累赘

1.map 映射
将一组数据按照规则映射为一组
数据条数不会发生变化

2.reduce 归约 汇总
数据条数发生变化

1. linux机制

1.1 OOM kill 机制
当linux服务器某个进程使用内存超标,linux保护自己,主动杀死你的进程,释放内存

1.2 tmp目录30天机制
30天文件删除

2.map与reduce个数

面试问题:hadoop内的map数是怎么确定的

2.1. map个数确定

为了提高map的并行度,对大文件做mapreduce的时候会把大文件分成多个。

所以划分出来的就是InputSplit,一个map处理一个InputSplit。InputSplit数=Map数

2.2. 谁来划分split

看源码会发现是InputFormat类。为一个抽象类
两个重要作用

  1. 将数据切分为多个InputSplit,每一个InputSplit作为一个map的输入
  2. 提供RecordReader,用于将InputSplit的内容转换为可以 作为map输入的k,v键值对。

2.3. reduce个数确定

一个task的reduce数量,由partition

3.container

容器,虚拟概念 分配Ng内存,用来计算
运行在nodeManeger进程运行的机器上
12G内存–> 12个房间

房间面积 = 1G 内存
电脑 = 1 个CPU core
房间是 container = 房间面积+ 电脑 = memory + cpu vcore 虚拟的组合

3.1 container 调优

假设128G 16物理core

系统装完 消耗1G
系统预留20%内存
防止oomkill机制

128G*20% = 25.6G = 26G

节点内存大小
DN = 2G 内存 (大约用900多M)
NM = 4G 内存
128-26=102-2-4=96G
全部用来设计给真正干活的小弟container用

3.2 container 内存设置参数

所有的container分配到的内存综合设置
yarn.nodemanager.resource.memory-mb 96G
yarn.scheduler.minimum-allocation-mb 1G 极限情况下 96个container 内存1G
yarn.scheduler.maximum-allocation-mb 96G 极限情况下 1个container 内存96G 少

container内存会自动增加 默认1G递增 CDH的yarn内可以配置

3.3 container vcore

不同机器的cpu性能不同
某个物理cpu是另一个物理cpu性能的两倍
通过设置第一个物理cpu的虚拟core来弥补这个差异

第一台机器 pcore:vcore =1 : 2 16core : 32vcore
第二台不好 pcore:vcore =1: 1
生产上统一pcore:vcore =1 : 2

为什么需要vcore : 并发任务需要靠vcore

CDH设置pcore到vcore数量
yarn.nodemanager.resource.pcores-vcores-multiplier 2

yarn.nodemanager.resource.cpu-vcores 32
yarn.scheduler.minimum-allocation-vcores 1 极限情况下 是32个
yarn.scheduler.maximum-allocation-vcores 32 极限情况下 是1个

3.4 生产如何设置

clouder公司推荐 vcore 不超过5个,那么设置成4

yarn.scheduler.maximum-allocation-vcores 4 极限情况下,只有8个container

3.5 整合memory cpu

确定了4vcore 8个container

yarn.nodemanager.resource.memory-mb 96G
yarn.scheduler.minimum-allocation-mb 1G
yarn.scheduler.maximum-allocation-mb 12G 极限情况下 1个container 8个

spark计算指标大,那么参数需要调大

yarn.nodemanager.resource.cpu-vcores 32
yarn.scheduler.minimum-allocation-vcores 1 极限情况下 是32个
yarn.scheduler.maximum-allocation-vcores 4 极限情况下 是1个

补充:
生产上 vmem 超出后 不kill container
yarn.nodemanager.pmem-check-enabled false
yarn.nodemanager.vmem-check-enabled false
yarn.nodemanager.vmem-pmem-ratio 2.1 就是有个虚拟内存的概念 一般不要 不要调整这个参数

4 map on yarn 架构

MR on yarn(container 调优)_第1张图片
面试题: MR ON YARN的架构 : 提交流程?
YARN的架构设计?

ResouceManager 主 RM
ApplicationManager 应用管理器 作业 程序
ResourceScheduler 资源调度器

NodeManager 从NM

1.client向RM提交应用程序jar其中包含ApplicationMaster主程序
2.ApplicationManager 会为job分配第一个container容器
3.ApplicationMaster向ApplicationManager 注册,yarn的web界面可以看到运行状态
4.ApplicationMaster 采用轮询的方式通过RPC协议向ResourceScheduler 申请了领取资源,(告诉你哪台NodeManager,多少内存多少cpu)

启动app master 领取资源

5.ApplicationMaster拿到资源,和对一个NM进程通信,要求启动task 计算代码
6.NM接受到请求,为任务设置好运行环境(container容器 包含jar包)将任务启动命令写在启动脚本里,通过脚本启动task
7.各个任务task通过rpc协议向appMaster汇报自己的进度和状态,让app master随时掌握task 的运行状态,当task失败,会重启任务
8.当所有task运行完成后,app master 向app manager 注销和关闭作业

web页面看任务状态完成还是失败

5 MapReduce工作原理读后感

http://blog.itpub.net/30089851/viewspace-2095837/

5.1 main函数调用

Configuration conf = new Configuration();

运行所有MapReduce之前都要初始化configuration,该类主要是读取MapReduce系统配置信息,包括hdfs和MapReduce,也就是安装hadoop所配置的文件。因为要进行map函数和reduce哈数编写实际进行的业务逻辑,都是交给MapReduce来操作,所以要把conf包下的配置文件告诉MapReduce

  String[] otherArgs = new GenericOptionsParser(conf, args).getRemainingArgs(); if (otherArgs.length != 2) {
      System.err.println("Usage: wordcount  ");
      System.exit(2);
    }

GenericOptionsParser类使用来解释hadoop命令的

    Job job = new Job(conf, "word count");
    job.setJarByClass(WordCount.class);
    job.setMapperClass(TokenizerMapper.class);
    job.setCombinerClass(IntSumReducer.class);
    job.setReducerClass(IntSumReducer.class);

MapReduce任务=MapReduce作业=MapReduce job
第一行 创建一个job 配置conf 和job名称
第二行 程序员写好的计算程序类
第三行第五行 map 和 reduce 函数的实现类
第四行是Combiner类 装载了性能更好

    job.setOutputKeyClass(Text.class);
    job.setOutputValueClass(IntWritable.class);

定义输出的key/value类型,最终存储在hdfs结果文件上的key/value类型

    FileInputFormat.addInputPath(job, new Path(otherArgs[0]));
    FileOutputFormat.setOutputPath(job, new Path(otherArgs[1]));
    System.exit(job.waitForCompletion(true) ? 0 : 1);

第一行,输入的数据文件,第二行输出的数据文件
最后一行job运行成功后c程序正常退出

5.2 MapReduce运行过程

设计4个实体

  1. client
  2. JobTracker : 初始化作业,分配作业,与tasktracker通信 类似NN
  3. TaskTracker : 保持与JobTracker 类似DN
  4. hdfs

5.3 MapReduce 逻辑运行

按照时间 包括: 输入分片, map 阶段 , combiner阶段 , shuffle阶段, reduce 阶段

  1. 输入分片: map计算之前,mapreduce会根据文件计算输入分片,每个分片对应一个map任务,输入分片记录的是分片长度和记录数据的位置的数组。
  2. map阶段:程序员别写好map函数
  3. combiner阶段:map后的一个操作,例如hadoop这个单词出现很多次,那么map输出文件冗余非常多,因此在reduce计算前对相应的key做一个合并操作,那么文件会小点。 当然也 分reduce的目的不同的区别。
  4. shuffle阶段:shuffle就是map阶段做的输出操作,map输出的时候数据量太大不能放到内存,并且需要排序,内存开销大。所以在map输出时在内存开启一个环形缓冲区,专门用来输出,默认100mb,阈值0.8.如果溢出,则写入磁盘(spill)。 若缓冲区满,则阻塞写入内存操作,让写入磁盘的操作结束后,再继续写入内存。写入磁盘前有个排序操作(写入内存不排序),spill操作写一个溢出文件,有几次spill就有几个溢出文件,map输出结束,会合并这些文件。重点(这个过程有个partitioner操作,partitioner操作和ma’p阶段的输入分片操作很像,一个partition对应一个reduce作业,partitioner其实就是reduce 的输入分片)
  5. reduce阶段:结果存到hdfs上

6 sla讲解

sla讲解
https://blog.csdn.net/youanyyou/article/details/79406515

你可能感兴趣的:(MR on yarn(container 调优))