配置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