配置MapReduce的历史服务器查看MR运行日志
前言
前面介绍的MapReduce实例,我们会发现无法查看Map函数和Reduce函数的具体执行过程。本文介绍如何配置历史服务器来查看MR的运行日志。
一、如果我们仅仅在map和reduce的函数中加入以下代码去查看执行过程,会发现日志文件中并没有输出我们所希望的数据
map函数
package com.sun.wordcount;
//map阶段 (部分计算)
// hadoop包装了基本类型
// int->intWritable Long->LongWritable
// Double->DoubleWritable
// Float->FloatWritable String->Text
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Mapper;
import org.apache.log4j.Logger;
import java.io.IOException;
//泛型1:keyin inputFormat中的输出key类型 泛型2:valuein inputFormat中的输出value类型
//泛型3:keyout map阶段中的输出key类型 泛型2:valueout map阶段中的输出value类型
public class WordCountMap extends Mapper<LongWritable, Text,Text, IntWritable> {
private Logger logger=Logger.getLogger(WordCountMap.class);
//input format 输出一次,调用一次map方法;
// 参数key是本次input format输出这行数据的行首偏移量
// 参数value是当前input format输出的这行值
@Override //打开重写方法的快捷键(Ctrl+o)
protected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {
logger.info("map--->keyin:"+key);
logger.info("map--->valuein:"+value);
//对读取的行数据进行切分
String[] words = value.toString().split(" ");
for (String s : words) {
context.write(new Text(s),new IntWritable(1));
logger.info("map--->keyout:"+s);
logger.info("map--->valueout:"+new IntWritable(1));
}
}
}
reduce函数
package com.sun.wordcount;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Reducer;
import org.apache.log4j.Logger;
import java.io.IOException;
//reduce阶段(汇总计算)
public class WordCountReduce extends Reducer<Text, IntWritable,Text,IntWritable>
{
Logger logger =Logger.getLogger(WordCountReduce.class);
//所有map执行完,执行Reduce阶段
@Override
protected void reduce(Text key, Iterable<IntWritable> values, Context context) throws IOException, InterruptedException {
logger.info("map--->keyin:"+key);
logger.info("map--->valuein:"+values);
int sum=0;
for (IntWritable value : values) {
sum+=value.get();
}
//输出结果
context.write(key,new IntWritable(sum));
logger.info("map--->keyout:"+key);
logger.info("map--->valueout:"+new IntWritable(sum));
}
}
其实,思考一下也可以理解了,因为map和reduce函数是在很多台机器上执行,那么仅仅通过以上代码,结果只会输出到map函数当时执行的机器上。所以,我们在其他机器上就看不到输出结果。
二、因此hadoop引入了历史服务器,它不仅可以记录mapreduce的日志,同时会将各个机器节点上的日子整合到同一台历史服务器上。
三、配置历史服务器
1、在mapred-site.xml增加如下配置
<!--指定哪台机器是充当历史服务器-->
<property>
<name>mapreduce.jobhistory.address</name>
<value>hadoop5:10020</value>
</property>
<!--指定历史服务器的浏览界面-->
<property>
<name>mapreduce.jobhistory.webapp.address</name>
<value>hadoop5:19888</value>
<description>MapReduce JobHistory Server Web UI host:port</description>
</property>
2、在yarn-site.xml增加如下配置
<!--开启日志聚合-->
<property>
<name>yarn.log-aggregation-enable</name>
<value>true</value>
</property>
<!--日志保存时间设置为7天-->
<property>
<description>How long to keep aggregation logs before deleting them. -1 disables.
Be careful set this too small and you will spam the name node.</description>
<name>yarn.log-aggregation.retain-seconds</name>
<value>604800</value>
</property>
四、启动历史服务器
和启动yarn集群一样,启动历史服务器在充当历史服务器的节点上启动
mr-jobhistory-daemon.sh start historyserver
五、查看历史服务器上MR日志
浏览器的地址是:历史服务器IP:19888