1. 程式人生 > >Hadoop2.6.0配置引數檢視小工具

Hadoop2.6.0配置引數檢視小工具

前言

使用Hadoop進行離線分析或者資料探勘的工程師,經常會需要對Hadoop叢集或者mapreduce作業進行效能調優。也許你知道通過瀏覽器訪問http://master:18088/conf來檢視配置資訊,如下圖所示:


但是當Linux工程師們只面對命令列時,如何檢視呢?而且如果運維工程師根據叢集狀況及執行歷史使用shell、Python、ruby等指令碼寫些運維程式碼,甚至動態調整叢集引數時,該怎麼辦呢?效能調優的前提是需要能準確知道目前針對Hadoop叢集或者mapreduce作業配置的引數。在MySQL中可以通過以下命令查詢引數值:

SHOW VARIABLES LIKE 'some_parameter'
也可以使用以下命令查詢引數值:
SELECT @@session.some_parameter
SELECT @@global.some_parameter
或者直接查詢information_schema.GLOBAL_VARIABLES得到引數值。

可惜的是Hadoop沒有提供類似的方式,這對於在Linux系統下檢視引數進而修改引數增加了成本和負擔。儘管我們可以

本文將針對這一需求,基於Hadoop開發一個簡單實用的工具查詢檢視各種引數。

準備工作

首先在Hadoop叢集的Master節點的個人目錄下建立workspace目錄用於儲存開發的Hadoop應用程式碼,命令如下:

mkdir workspace
進入workspace目錄,開始編輯HadoopConfDisplay.java程式碼:


為便於大家使用,我把程式碼都列出來,這其實也是借鑑了網上別人的一些內容:

import java.util.Map.Entry;

import org.apache.hadoop.conf.*;
import org.apache.hadoop.util.*;

public class HadoopConfDisplay extends Configured implements Tool {

  static {
    Configuration.addDefaultResource("core-site.xml");
    Configuration.addDefaultResource("hdfs-site.xml");
    Configuration.addDefaultResource("mapred-site.xml");
    Configuration.addDefaultResource("yarn-site.xml");
  }

  @Override
  public int run(String[] args) throws Exception {
    Configuration conf = getConf();
    for (Entry<String, String> entry: conf) {
      System.out.printf("%s=%s\n", entry.getKey(), entry.getValue());
    }
    return 0;
  }

  public static void main(String[] args) throws Exception {
    int exitCode = ToolRunner.run(new HadoopConfDisplay(), args);
    System.exit(exitCode);
  }
}

在Hadoop的根目錄下建立myclass,此目錄用於儲存個人開發的Hadoop應用程式碼編譯後的class或者jar包。我本地的目錄為/home/jiaan.gja/install/hadoop-2.6.0/myclass/

由於HadoopConfDisplay中使用了hadoop-common-2.6.0.jar中的類,所以編譯HadoopConfDisplay.java時需要指定classpath。同時將編譯後的class輸出到/home/jiaan.gja/install/hadoop-2.6.0/myclass/目錄下。執行命令如下:


進入myclass目錄,將編譯好的HadoopConfDisplay的class打到jar包裡:

jar cvf mytest.jar *
執行過程如下:


成果驗證

經過以上準備,最終我們生成了mytest.jar包檔案,現在到了驗證輸出Hadoop配置引數的時候。輸入以下命令:

hadoop jar mytest.jar HadoopConfDisplay
輸出結果如下圖:


由於引數的確很多,這裡只展示了其中的一部分資訊。這裡顯示的資訊雖然很多,可是會發現很多引數並沒有包括進來,比如:

mapreduce.job.ubertask.enable

mapreduce.job.ubertask.maxreduces

mapreduce.job.ubertask.maxmaps

完善

    還記得本文剛開始說的通過web介面檢視Hadoop叢集引數的內容嗎?我在我個人搭建的叢集(有關叢集的搭建可以參照《Linux下Hadoop2.6.0叢集環境的搭建》)上訪問http://master:18088/conf頁面時,可以找到以上缺失的引數如下所示:

<configuration>
  <property>
    <name>mapreduce.job.ubertask.enable</name>
    <value>false</value>
    <source>mapred-default.xml</source>
  </property>
  <!-- 省略其它引數屬性 -->
  <property>
    <name>mapreduce.job.ubertask.maxreduces</name>
    <value>1</value>
    <source>mapred-default.xml</source>
  </property>
  <!-- 省略其它引數屬性 -->
  <property>
    <name>mapreduce.job.ubertask.maxmaps</name>
    <value>9</value>
    <source>mapred-default.xml</source>
  </property>
  <!-- 省略其它引數屬性 -->
</configuration>
從以上內容我們可以看見缺失的引數都配置在mapred-default.xml中,而我之前編寫的HadoopConfDisplay類的程式碼中並未包含此配置。此外,未包括進來的配置檔案還有yarn-default.xml、core-default.xml(說明Hadoop引數預設是從*-default.xml的幾個檔案中讀取的。最後我們將這些內容也編輯進去,程式碼如下:
import java.util.Map.Entry;

import org.apache.hadoop.conf.*;
import org.apache.hadoop.util.*;

public class HadoopConfDisplay extends Configured implements Tool {

  static {
    Configuration.addDefaultResource("core-default.xml");
    Configuration.addDefaultResource("yarn-default.xml");
    Configuration.addDefaultResource("mapred-default.xml");
    Configuration.addDefaultResource("core-site.xml");
    Configuration.addDefaultResource("hdfs-site.xml");
    Configuration.addDefaultResource("mapred-site.xml");
    Configuration.addDefaultResource("yarn-site.xml");
  }

  @Override
  public int run(String[] args) throws Exception {
    Configuration conf = getConf();
    for (Entry<String, String> entry: conf) {
      System.out.printf("%s=%s\n", entry.getKey(), entry.getValue());
    }
    return 0;
  }

  public static void main(String[] args) throws Exception {
    int exitCode = ToolRunner.run(new HadoopConfDisplay(), args);
    System.exit(exitCode);
  }
}

最後我們按照之前的方式編譯打包為mytest.jar,再執行命令驗證的結果如下圖所示:

之前缺失的引數都出來了,呵呵!

這下大家可以愉快的進行效能調優了。

後記:個人總結整理的《深入理解Spark:核心思想與原始碼分析》一書現在已經正式出版上市,目前京東、噹噹、天貓等網站均有銷售,歡迎感興趣的同學購買。