作业调优
1) 检查以下项是否可以优化
mapper数量 reducer数量 combiner 中间值的压缩 自定义序列化 调整shuffle
2) 分析任务
Hadoop允许分析作业中的一部分任务,任务完成时把分析信息存储以使用标准分析工具分析
本地作业运行器与集群是不同的环境,且数据流模式也不同,如果MR作业是I/O密集的,那么本地优化的对于集群可能没帮助,有些问题只会在集群上重现,要到实际集群中取比较执行时间
HPROF分析工具
通过配置属性或者调用JobConf的方法控制分析过程
启用分析: mapreduce.task.profile设置true
默认只分析ID为0,1,2的map和reduce任务,设置mapreduce.task.profile.maps和mapreduce.task.profile.reduces配置要分析的任务ID
任务的分析输出和任务日志存放在NodeManager的本地日志目录的userlogs下
MapReduce的工作流
1) 如果处理复杂的问题,增加作业的数量,不是增加作业(map函数和reduce函数)的复杂度
2) 也可以使用高级语言Pig Hive Spark等处理复杂问题
使用多个作业解决MR问题组成一个MR工作流
当工作流中不止一个作业时,如何管理作业按顺序执行?
1) 线性的作业链
JobClient.runJob(conf1);
JobClient.runJob(conf2);
如果有一个Job运行失败,则之后无法继续运行
利用waitForCompletion()方法的布尔返回值
2) 有向无环图DAG(Directed acyclic Graph)
org.apache.hadoop.mapreduce.jobcontrol.JobControl类
表示一个作业的运行图,设置作业配置,作业之间的依赖关系,根据以来顺序执行
如果一个作业失败,将不执行与之有依赖的后续作业
3) Apache Oozie
运行工作流的系统,作业相互依赖,管理数千工作流 + 每个工作流作业可能有好几十个,可以处理失败工作流的重运行,Oozie作为服务器运行,客户端提交工作流到服务器,工作流由action节点和控制流节点组成的DAG
工作流引擎存储和运行不同类型的作业;coordinator引擎基于预定义的调度策略和数据可用性运行工作流作业
action节点执行工作流任务,控制流节点构建条件逻辑,管理工作流执行,工作流结束时,Oozie发送HTTP回调向客户端通知工作流状态