分布式计算框架,生产开发复杂累赘
1.map 映射
将一组数据按照规则映射为一组
数据条数不会发生变化
2.reduce 归约 汇总
数据条数发生变化
1.1 OOM kill 机制
当linux服务器某个进程使用内存超标,linux保护自己,主动杀死你的进程,释放内存
1.2 tmp目录30天机制
30天文件删除
面试问题:hadoop内的map数是怎么确定的
为了提高map的并行度,对大文件做mapreduce的时候会把大文件分成多个。
所以划分出来的就是InputSplit,一个map处理一个InputSplit。InputSplit数=Map数
看源码会发现是InputFormat类。为一个抽象类
两个重要作用
一个task的reduce数量,由partition
容器,虚拟概念 分配Ng内存,用来计算
运行在nodeManeger进程运行的机器上
12G内存–> 12个房间
房间面积 = 1G 内存
电脑 = 1 个CPU core
房间是 container = 房间面积+ 电脑 = memory + cpu vcore 虚拟的组合
假设128G 16物理core
系统装完 消耗1G
系统预留20%内存
防止oomkill机制
128G*20% = 25.6G = 26G
节点内存大小
DN = 2G 内存 (大约用900多M)
NM = 4G 内存
128-26=102-2-4=96G
全部用来设计给真正干活的小弟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内可以配置
不同机器的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个
clouder公司推荐 vcore 不超过5个,那么设置成4
yarn.scheduler.maximum-allocation-vcores 4 极限情况下,只有8个container
确定了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 就是有个虚拟内存的概念 一般不要 不要调整这个参数
面试题: 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页面看任务状态完成还是失败
http://blog.itpub.net/30089851/viewspace-2095837/
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程序正常退出
设计4个实体
按照时间 包括: 输入分片, map 阶段 , combiner阶段 , shuffle阶段, reduce 阶段
sla讲解
https://blog.csdn.net/youanyyou/article/details/79406515