配置MapReduce的歷史服務器查看MR運行日誌

配置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
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章